Moduły Drupala. Które z nich poprawiają bezpieczeństwo strony?
Bezpieczeństwo dostarczanych rozwiązań to dla nas bardzo ważny czynnik. W związku z tym oraz z faktem, że Drupal to najbezpieczniejszy CMS, w tym tekście przedstawimy listę zaleceń, które wyniosą bezpieczeństwo Twojej strony na Drupalu na jeszcze wyższy poziom.
Bezpieczeństwo Drupala. Dlaczego warto być na bieżąco?
Twoja aplikacja jest mniej podatna na wykorzystanie znanych podatności. To tylko tyle i aż tyle.
Jak już kiedyś wspominałem - aktualizacja modułów i bibliotek to jedna z prostszych metod poprawy bezpieczeństwa naszej aplikacji. Community Drupala wspierane przez specjalny Drupal Security Team stale monitoruje raporty użytkowników na temat potencjalnych błędów bezpieczeństwa i oferuje pomoc autorom modułów w ich rozwiązywaniu. Efektem tych działań są aktualizacje modułów, które wprowadzają poprawki bezpieczeństwa.
Konfiguracja panelu logowania
Niepoprawnie skonfigurowany panel logowania może dostarczać informacji o istnieniu w bazie danych użytkownika, korzystającego z loginu podanego w formularzu. Jeśli informacja, jaką zwraca panel jest inna w przypadku, w którym atakujący podał niepoprawny login i inna, gdy login jest poprawny, mamy do czynienia z wektorem do ataku brute force. Atakujący może w pierwszej kolejności uzyskać w ten sposób loginy, aby później zająć się brute-force’owaniem haseł.
Moduły Drupala podnoszące bezpieczeństwo
Drupal posiada kilka modułów, które mogą podnieść bezpieczeństwo. Ich konfiguracja nie wymaga zbyt obszernej wiedzy technicznej ani nie zajmuje tyle czasu co inne metody zabezpieczania witryny. Poniżej przedstawiamy kilka narzędzi tego typu.
Password Policy
Moduł Password Policy pozwala na egzekwowanie ograniczeń dotyczących haseł użytkowników poprzez definiowanie polityk haseł. Może być ona zdefiniowana za pomocą zestawu wymagań, które muszą być spełnione, zanim zmiana hasła użytkownika zostanie zaakceptowana. Każde ograniczenie posiada parametr pozwalający na określenie minimalnej liczby ważnych warunków, które muszą zostać dotrzymane, aby wymaganie zostało spełnione.
Załóżmy, że mamy ograniczenie do wielkich liter (z parametrem 2) i ograniczenie do cyfr (z parametrem 4). Oznacza to, że hasło użytkownika musi zawierać co najmniej 2 wielkie litery i co najmniej 4 cyfry, aby zostało zaakceptowane.
Moduł implementuje również funkcję “wygasającego hasła”. Użytkownik jest zmuszany do zmiany hasła i opcjonalnie blokowany, gdy jego stare hasło wygaśnie.
Password Policy pozwala administratorom zmusić określonych użytkowników lub całe role do zmiany hasła przy następnym logowaniu. Prośba o zmianę hasła, wraz z odpowiednim formularzem, pojawia się jako popup zamiast przekierowania użytkownika do zwykłej strony user/{user_id}/edit.
Security Review
Moduł Security Review automatyzuje testowanie wielu łatwych do popełnienia błędów, które sprawiają, że witryna nie jest bezpieczna. Moduł jest intuicyjny i bardzo prosty w obsłudze. Tworzony szybko raport, jest czytelny i jasno wskazuje, co należy poprawić. Moduł nie wprowadza automatycznie zmian na Twojej stronie. Wyniki raportu należy poddać analizie i w wybranych przypadkach należy wprowadzić odpowiednie poprawki. Nie wszystkie zalecenia będą możliwe do zaakceptowania. Wszystko zależy od unikalnych czynników Twojej witryny.
Security Kit
Moduł Security Kit dostarcza różne opcje zwiększające bezpieczeństwo, pozwalające ograniczyć ryzyko wykorzystania różnych luk w Twojej aplikacji. Moduł zmniejsza prawdopodobieństwo wykorzystania wielu typów ataków, między innymi:
- cross-site scripting,
- cross-site request forgery,
- clickjacking.
Pełen opis funkcjonalności znajduje się w podlinkowanym wyżej artykule.
Źródło: Drupal.org
Paranoia
Moduł Paranoia identyfikuje większość miejsc, w których użytkownik może wykonywać kod PHP, przy użyciu interfejsu Drupala, a następnie je blokuje. Zmniejsza to potencjalne zagrożenie, wynikające z uzyskania przez atakującego wysokich uprawnień w Drupalu.
Co robi moduł?
- Blokuje przyznanie uprawnienia use PHP for block visibility.
- Blokuje możliwość tworzenia formatów tekstowych, które używają filtra PHP.
- Blokuje możliwość edycji konta użytkownika z uid 1.
- Blokuje nadawanie uprawnień mogących zmniejszyć bezpieczeństwo witryny.
- Blokuje wyłączenie tego modułu. Aby go wyłączyć, należy edytować bazę danych.
Aby w pełni wykorzystać możliwości tego modułu, musisz zidentyfikować wszystkie encje, pola i bloki, które używają drupalowy filtr PHP i zmienić je tak, aby działały bez niego, a następnie usunąć standardowy filtr PHP, dostępny pod admin/config/content/formats.
Jak tworzyć bezpieczny kod w Drupalu?
Drupal korzysta z rozwiązań, które z założenia są bezpieczne, jeśli używa się ich w sposób zgodny ze standardami. Istnieje wiele zasad, którymi należy się kierować podczas tworzenia bezpiecznego kodu. Poniżej przedstawiamy najważniejsze z nich.
Używaj Twiga
Silnik Twig domyślnie “auto-escape’uje” wszystkie zmienne. Oznacza to, że wszystkie ciągi znaków, renderowane przez szablony Twiga (np. wszystko między {{ }}), są automatycznie oczyszczane z elementów mogących zaszkodzić bezpieczeństwu Twojej aplikacji.
Przy renderowaniu atrybutów pamiętaj, aby osadzać je między cudzysłowami “ lub apostrofami ‘. Przykładowo class=”{{ foo }}”, a nie class={{ foo }}.
Używaj placeholderów
Translation API również oczyszcza ciągi znaków. Używaj go dla ciągów znaków, które chcesz przetłumaczyć i później, na przykład, renderować po stronie frontendu.
W Drupalu wyróżniamy trzy typy placeholderów w Translation API:
@variable
Używamy, gdy za placeholder chcemy podstawić ciąg znaków lub obiekt klasy MarkupInterface.
%variable
Używamy, gdy wartość chcemy osadzić między tagami
:variable
Używamy, gdy wartością, którą chcemy podstawić jest URL, który chcemy osadzić w atrybucie href.
Więcej na temat placeholderów znajdziesz na stronie Drupal.org.
Poznaj API i stosuj je
Drupal dostarcza wiele funkcji pozwalających na oczyszczenie ciągów znaków. Są to między innymi:
t(), Drupal::translation()->formatPlural()
Używany wraz z placeholderami opisanymi wyżej pozwala na tworzenie bezpiecznych, gotowych do przetłumaczenia ciągów znaków.
Html::escape()
Służy do oczyszczania zwykłego tekstu.
Xss::filterAdmin()
Korzystaj z niego, gdy chcesz oczyścić tekst wprowadzany przez admina, który powinien móc używać większość tagów i atrybutów HTML.
UrlHelper::stripDangerousProtocols(), UrlHelper::filterBadProtocol()
Przydatny do sprawdzania adresów URL, może być używany wraz z SafeMarkup::format().
Ciągi znaków przepuszczone przez funkcje t(), Html::escape(), Xss::filter() czy Xss::filterAdmin() są automatycznie traktowane jako bezpieczne, tak samo jak ciągi znaków tworzone przez render array z klasy Renderer.
Filtruj tekst również w JavaScript
Filtrowanie tekstu po stronie serwera jest uznawane za jedną z najlepszych praktyk. Istnieją jednak przypadki, w których filtrowanie będzie odbywać się też po stronie klienta, żeby dostarczyć dodatkową, tymczasową możliwość filtrowania. Jest to przydatne na przykład podczas renderowania elementów, które są aktualizowane, gdy użytkownik wpisuje tekst (czyli zachodzą zmiany w drzewie DOM). Aby filtrować tekst w Drupalu używając JavaScript, należy używać funkcji Drupal.checkPlain(). Ta funkcja oczyszcza tekst usuwając szkodliwe elementy i chroni, na przykład, przed niektórymi metodami ataku clickjacking.
Używaj warstwy abstrakcji przy pracowaniu z bazą danych
Zalecamy, aby nigdy nie używać czystych wartości w kwerendach. Zamiast nich należy stosować placeholdery.
Przykład:
\Database::getConnection()->query('SELECT foo FROM {table} t WHERE t.name = ‘ . $_GET['user']);
Vs
\Database::getConnection()->query('SELECT foo FROM {table} t WHERE t.name = :name', [':name' => $_GET['user']]);
W drugim przypadku zamiast używać bezpośrednio wartości z parametru user, podajemy ją jako zamiennik placeholdera :name. W ten sposób przed umieszczeniem tej wartości w końcowej kwerendzie, Drupal najpierw oczyści ją z elementów mogących powodować SQL Injection.
Audyt bezpieczeństwa
Proces “utwardzania” witryny powinien być zakończony kompleksowym audytem bezpieczeństwa, który wychwyci jeszcze więcej potencjalnych zagrożeń na Twojej stronie.
Audyt bezpieczeństwa powinien zawierać:
Przegląd modułów i bibliotek. Chodzi tutaj o sprawdzenie wersji zainstalowanych modułów Drupala, przegląd patchy, bibliotek PHP i JavaScript.
Przegląd konfiguracji. W ramach tej czynności przeprowadzamy audyty uprawnień dla ról, widoków, plików routing.yml w customowych modułach, formatów tekstu, logowania błędów oraz formularzy.
Przegląd repozytorium. Sprawdzamy customowe moduły oraz skórki, w tym: routing, customowe formularze, zapytania SQL, mechanizmy filtrujące i uprawnienia do plików.
Identyfikacja zawartości repozytorium. Audytujemy zawartość plików settings.php oraz .env. Przeprowadzamy również audyt “głębokiego ukrycia”. Polega to na sprawdzeniu, czy w repozytorium nie znajdują się, na przykład, klucze prywatne SSL czy kopie lub zrzuty baz danych.
Pełen opis wielu z podanych w powyższej liście elementów znajduje się w podlinkowanych artykułach.
Moduły Drupala zwiększające bezpieczeństwo - podsumowanie
W zależności od poziomu zaawansowania i znajomości Drupala można wprowadzić odpowiednie poprawki do aplikacji, które sprawią, że będzie bardziej bezpieczna. Przedstawione w tym artykule przykłady z całą pewnością zmniejszą liczbę wektorów ataku i prawdopodobieństwo ich wykorzystania. Zalecamy przeanalizowanie dostępnych możliwości i ewentualne wprowadzenie zmian czy też nowych elementów, które pozwolą na redukcję ryzyka ataku na Twoją aplikację. Jeśli potrzebujesz pomocy w takich działaniach, nasz zespół wsparcia Drupala może przeprowadzić audyt bezpieczeństwa Twojej strony.