NFsec Logo

Serwer httpd bez uprawnień root na porcie 80

03/12/2012 w Administracja, Bezpieczeństwo Brak komentarzy.  (artykuł nr 383, ilość słów: 725)

D

o uruchomienia serwera Apache (za przykład posłuży system CentOS 6.x) potrzebne są nam “POSIX capabilities” (pakiet RPM libcap). Szczerze mówiąc sam mechanizm PCAP stanowi obszerny materiał – w tym wpisie zostanie przedstawiony tylko szczątkowo jako możliwość uniknięcia korzystania przez serwer httpd z praw administratora do nasłuchu na porcie 80. Ze względu na przypisywanie uprawnień PCAP plikom w postaci rozszerzonych atrybutów (ang. extended attributes) pierwszym krokiem jest modyfikacja binarnego pliku httpd:

[root@darkstar ~]# which httpd
/usr/sbin/httpd
[root@darkstar ~]# setcap cap_net_bind_service=+ep /usr/sbin/httpd

Nadanie CAP_NET_BIND_SERVICE daje zdolność plikowi wykonalnemu serwera Apache na prowadzenie nasłuchu na porcie mniejszym niż 1024 (Well Known Ports) bez konieczności posiadania pełnych praw administratora. Sprawdzamy, czy uprawnienia zostały poprawnie nadane:

[root@darkstar ~]# getcap
/usr/sbin/httpd = cap_net_bind_service+ep

Następnie odczytujemy z prawami jakiego użytkownika ma docelowo uruchamiać się serwer WWW:

[root@darkstar ~]# egrep ^"(User|Group)" /etc/httpd/conf/httpd.conf 
User apache
Group apache

Znając UID i GID użytkownika należy przygotować dla niego odpowiednie środowisko tj. upewnić się, że tylko użytkownik apache lub root mogą uruchomić serwer httpd:

[root@darkstar ~]# chown apache:apache /usr/sbin/httpd
[root@darkstar ~]# chmod g-x,o-x /usr/sbin/httpd
[root@darkstar ~]# ls -al /usr/sbin/httpd
-rwxr--r-- 1 apache apache 341200 2012-02-13  /usr/sbin/httpd

W kolejnych krokach przyznajemy możliwość odczytu i zapisu do:
– plików konfiguracyjnych:

[root@darkstar ~]# chown -R apache:apache /etc/httpd

– pliku PID:

[root@darkstar ~]# chown -R apache:apache /var/run/httpd

– plików dziennika:

[root@darkstar ~]# chown -R apache:apache /var/log/httpd

– plików HTML serwera WWW:

[root@darkstar ~]# chown -R apache:apache /var/www/html

Ostatnim krokiem jest modyfikacja skryptu startowego, a dokładniej mówiąc 56 linii funkcji start(), z pliku /etc/init.d/httpd, co umożliwi nam uruchamianie serwera już z prawami użytkownika apache:

LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS

Zamieniamy na:

LANG=$HTTPD_LANG daemon --user=apache --pidfile=${pidfile} $httpd $OPTIONS

Po tak przeprowadzonych modyfikacjach i poprawnym uruchomieniu serwera możemy sprawdzić, czy Apache rzeczywiście korzysta tylko z praw użytkownika apache:

[root@darkstar ~]# ps -o cmd,pid,ppid,stime,time,euser,ruser -H f -U apache -u apache
CMD                           PID  PPID STIME     TIME EUSER    RUSER
/usr/sbin/httpd              4778     1 Dec02 00:00:03 apache   apache
 \_ /usr/sbin/httpd         16903  4778 22:38 00:00:02 apache   apache
 \_ /usr/sbin/httpd         16907  4778 22:38 00:00:00 apache   apache
 \_ /usr/sbin/httpd         16908  4778 22:38 00:00:01 apache   apache
 \_ /usr/sbin/httpd         16909  4778 22:38 00:00:02 apache   apache
 \_ /usr/sbin/httpd         16910  4778 22:38 00:00:03 apache   apache
 \_ /usr/sbin/httpd         16911  4778 22:38 00:00:05 apache   apache
 \_ /usr/sbin/httpd         16912  4778 22:38 00:00:00 apache   apache
 \_ /usr/sbin/httpd         16913  4778 22:38 00:00:00 apache   apache
 \_ /usr/sbin/httpd         16914  4778 22:38 00:00:04 apache   apache
 \_ /usr/sbin/httpd         16915  4778 22:38 00:00:01 apache   apache
 \_ /usr/sbin/httpd         16916  4778 22:38 00:00:01 apache   apache
 \_ /usr/sbin/httpd         16917  4778 22:38 00:00:02 apache   apache
 \_ /usr/sbin/httpd         16918  4778 22:38 00:00:01 apache   apache
 \_ /usr/sbin/httpd         16919  4778 22:38 00:00:01 apache   apache
 \_ /usr/sbin/httpd         16920  4778 22:38 00:00:00 apache   apache

Warto również zmienić definicję rotowania logów serwera za pomocą logrotate – tak, aby prawa do nich należały zawsze do użytkownika apache. Szczególną uwagę należy zachować przy aktualizacji pakietów, ponieważ wraz z nadpisaniem nową wersją pakietu binarnego przyznane atrybuty dla pliku httpd również zostaną nadpisane i konieczne będzie ponowne nadanie uprawnień.

Więcej informacji: man 7 capabilities, NonRootPortBinding

Kategorie K a t e g o r i e : Administracja, Bezpieczeństwo

Tagi T a g i : , , , , , , ,

Komentowanie tego wpisu jest zablokowane.