Apache2: izolacja procesów w celu zwiększenia bezpieczeństwa

Zdarzyć się może, że nawet najbardziej zabezpieczona „forteca” zostaje zdobyta, warto na wszelki wypadek zmniejszyć zasób jaki atakujące może obejrzeć korzystając z ciekawego modułu Apache2.

  1. Instalacja modułu
apt-get install libapache2-mpm-itk

2. Zmiana konfiguracji w celu użycia modułu

a2enmod mpm_itk
a2enmod rewrite

# w pliku konfiguracyjnym Apache2 naszej strony należy dodać
# po rozpoczęciu <VirtualHost>
<IfModule mpm_itk_module>
AssignUserId nazwa_użytkownika groupa_tego_użytkownika
</iFModule>

3. Ustawienie poprawnych uprawnień dla katalog ze stroną

chown nazwa_użytkownika:groupa_tego_użytkownika -R /var/www/nasza_strona/

4. Restartujemy Apache

apache2ctl -t
# jeżeli pojawił się "Syntax: Ok"
systemctl restart apache2

W ten sposób dana strona będzie uruchamiana z uprawnieniami i jako użytkownik, którego wskazaliśmy, dzięki temu w razie uzyskania dostępu lub wstrzyknięciu kody, kod powinien być wykonany z uprawnieniami właśnie tego użytkownika, a nie jako www-data czyli domyślnego użytkownika wszystkich procesów związanych ze stronami www (apache2, php, php-fpm)

5. Jeżeli zainstalowaliśmy mod libapache2-mod-security2 oraz libapache2-mpm-itk musimy troszeczkę zmodyfikować naszą konfigurację, ponieważ na dzień pisania tego wpisu, mod-security2 nie jest w pełni kompatybilny z mpm-itk

# Problem 1: Failed to lock global mutex: Permission denied
mkdir -p /opt/apache2/log
touch /opt/apache2/log/modsec_audit.log
chmod 777 -R /opt/apache2/
nano /etc/modsecurity/modsecurity.conf
# zmień SecAuditLogType Serial na SecAuditLogType Concurrent
# zmień SecAuditLog /../../.../ na SecAuditLog /opt/apache2/log/modsec_audit.log
# dodaj pod nim
SecAuditLogType Concurrent
SecAuditLogStorageDir /opt/apache2/log/

6. Teraz restartujemy Apache2, żeby wczytał moduł security z nową konfiguracją

systemctl restart apache2

7. Na naszej stronie umieśćmy plik, żeby sprawdzić działanie modułu

nano info.php
# wpiszmy tutaj
<?php phpinfo(); ?>

# dodajmy drugi plik
nano info2.php
<?php phpinfo(INFO_MODULES); ?>

8. Jeżeli moduł działa poprawnie powinien zablokować nam stronę info.php, ale info2.php powinno działać poprawnie. W tym momencie logi powinny zapisywać się w /opt/apache2/log/ w katalogu użytkownika, który uruchomił proces php/apache2. Od teraz wszelkie problemy z dostępnością weryfikować w ten sposób.

9. (opcjonalnie) Wyłączanie reguł dla adres IP. W moim przypadku miałem problem z dodawanie niektórych poleceń CSS w wordpress-ie w edytorze CSS, ale zamiast wyłączać cały zestaw reguł dla wszystkich postanowiłem wyłączyć te, których ID znalazłem w log-u, tylko dla mojego IP na czas edycji.

nano /etc/apache2/conf-available/whitelist-modsecurity.conf
# zawartość
SecRule REMOTE_ADDR "^127\.0\.0\.1" "id:666,ctl:ruleRemoveById=942190"

# po zapisaniu należy włączyć konfigurację
a2enconf whitelist-modsecurity.conf

# a następnie sprawdzić czy przypadkiem nie wypisaliśmy używanego id
apache2ctl -t

# jeżeli jest Syntax OK, to możemy restartować, jeżeli nie zmieniamy id:666
systemctl restart apache2

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

*