Nowy pracownik naszej firmy, administrator Linux Mateusz Małek, w ramach prowadzonych testów podatności przeprowadził udany, a zarazem trywialny atak mający wpływ na stabilność pracy jednego z naszych serwerów hostingowych.
Poniżej prezentujemy sposób częściowy zabezpieczenia serwera przed lokalnymi atakami DoS wykonywanymi przy pomocy funkcji shell_exec() w PHP, jeżeli wykorzystywany jest suPHP.
W przypadku wykorzystywania suPHP, uruchamiane z UID+GID użytkownika procesy nie przechodzą przez stos PAM, tym samym nie dotyczą ich limity pam_limits.so z /etc/security/limits.conf. Opisane poniżej kroki zmieniają to zachowanie.
Patchowanie, rekompilacja i rekonfiguracja suPHP
- Nakładamy przygotowany patch na suPHP:
cd /usr/local/directadmin/custombuild
cp $(find -type d -name \’suphp-0*\') suphp-patched;
cd suphp-patched;
wget http://mkwm.zielonki.info/suphp_patch.diff -O – | patch -p1 - Tworzymy nową usługę PAM – np. \”suphp\”, uwzględniającą moduł pam_limits z dedykowaną konfiguracją – wykorzystanie globalnego pliku konfiguracyjnego stwarza pewne problemy (o czym za chwilę):
cat << EOF > /etc/pam.d/suphp
auth sufficient pam_permit.so
session required pam_limits.so conf=/usr/local/suphp/etc/security/limits.conf
session required pam_permit.so
EOF - Konfigurujemy limity dotyczące liczby procesów (tak, serwer uległ \”trzynastu znakom\”). Dedykowany plik konfiguracyjny rozwiązuje problem z sytuacją, w której konta użytkowników nie posiadają żadnej wspólnej grupy – w przypadku ustawienia limitów dla wszystkich (*), nie ma możliwości podniesienia ich dla konkretnego użytkownika/grupy (co powoduje problemy z działaniem usług czy administrowaniem serwerem):
cat << EOF > /usr/local/suphp/etc/security/limits.conf
* soft nproc 20
* hard nproc 20
EOF - Rekompilujemy suPHP i dodajemy \”pam_service=suphp\” do sekcji global w jego pliku konfiguracyjnym.