Limitowanie zasobów użytkowników przy suPHP z wykorzystaniem stosu PAM

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

  1. 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

  2. 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

  3. 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

  4. Rekompilujemy suPHP i dodajemy \”pam_service=suphp\” do sekcji global w jego pliku konfiguracyjnym.

Katalog stron Easydir na hostingu Aboo

Katalog stron Easydir oparty jest na frameworku Kohana i bazach SQLite.

Podstawowym wymaganiem Kohany jest choć-trochę-obsługująca programowanie obiektowe wersja interpretera PHP: co najmniej 5.2.
I na tym kompatybilność się kończy – ze względu na wiek skryptu / kunszt programisty, modele aplikacji zawierają odwołania do przestarzałych w domyślnie włączonej wersji PHP (5.3) funkcji z rodziny eregi.
Fakt ten nie objawia się: katalog silently fails, w porywach wyświetla Unknown PHP Error.

Biorąc pod uwagę podstawowe zastosowanie opisywanego kodu – pozycjonowanie stron WWW, nie namawiam nikogo na zastąpienie ich wyrażeniami regularnymi i funkcjami z rodziny preg, a zaproponowane rozwiązanie jest najprostszym z możliwych:

Zgodnie z bazą wiedzy, w pliku .htaccess używamy gotowego makra, zmieniając wersję interpretera:

Use php 52

Katalog znów żyje!