netcoffee.pl*po godzinach - reaktywacja

Ten blog jest kontynuacją bloga dostępnego ongiś pod adresem netcoffee.pl/pogodzinach.
Artykuły, które na to zasługują są przenoszone do nowej wersji bloga. Pozostałe wkrótce znikną.

2006-08-02

mod_security: testowanie konfiguracji

mod_security to moduł serwera Apache będący systemem wykrywania włamań. mod_security analizuje przychodzące dane (metody GET i POST a także cookies) a także dane odsyłane do klienta. Po wykryciu zdefiniowanych w konfiguracji fraz (np. zapytań sql, kodu html, kodu javascript), mod_security wykonuje jedną ze zdefiniowanych akcji. Może to być np. wysłanie do klienta kodu błędu, przekierowanie klienta, wstrzymanie odpowiedzi na ustaloną ilość milisekund (przydatne w walce z botami) lub zablokowanie rządania. Tyle tytułem wstępu.

Sam moduł może być dla aplikacji którą chroni tyle zbawienny, co niebezpieczny. Zastosowanie zbyt restrykcyjnych reguł filtrowania może doprowadzić aplikację do stanu nieużywalności. Dlatego warto już na etapie tworzenia aplikacji skonfigurować moduł i testować konfigurację, na samym początku jako akcje podejmowane po wykryciu potencjalnie niebezpiecznych danych ustawić jedynie logowanie zdarzeń. W trakcie pracy można przeglądać logi serwera i korygować ustawienia mod_security lub zmieniać działanie aplikacji.

Innym, wygodniejszym sposobem wykrywania konfiliktów między konfiguracją mod_security a wymaganiami aplikacji (np. gdy w systemie CMS edytujemy kod html strony, mod_security nie powinien podejmować żadnych działań), jest poniższy kod PHP wklejony w sekcji BODY dokumentu HTML:


<?php
if(isset($_SERVER['HTTP_MOD_SECURITY_MESSAGE']) 
  and $_SERVER['REMOTE_ADDR'] == '192.168.0.32'){?>
 <img style='position: fixed; top: 10px; right: 10px;' 
  src='style/error.png' 
  alt='' 
  title='<?php echo htmlspecialchars(stripslashes($_SERVER['HTTP_MOD_SECURITY_MESSAGE'])) ?>'
 />
<?php } ?>


Rozwiązanie to bazuje na tym, że po wykryciu potencjalnie niebezpiecznych danych, mod_security ustawia zmienną systemową, której zawartość możemy odczytać w zmiennej $_SERVER['HTTP_MOD_SECURITY_MESSAGE']. W warunku sprawdzamy, czy ta zmienna jest ustawiona i czy rządanie nadeszło z komputera admina (ten warunek możemy oczywiście dostosować do naszych wymagań i sprawdzać np. czy zalogowany jest administrator itp). Jeżeli tak, do strony dodajemy mały obrazek, który prawdziwe przeglądarki wyświetlą zawsze w górnym prawym rogu. Jako tytuł obrazka wstawiona jest treść błędu zgłoszonego przez mod_security.

Dzięki takiemu rozwiązaniu, już podczas tworzenia, testowania lub w trakcie normalnej, codziennej pracy z aplikacją, na bieżąco będziemy wiedzieli, czy wprowadzone dane spowodują błąd zabezpieczeń.

Oczywiście to proste rozwiązanie jedynie ułatwi testowanie aplikacji - nadal konieczne będzie sprawdzanie logów serwera.

Polecam uwadze