Serwer httpd bez uprawnień root na porcie 80
Napisał: Patryk Krawaczyński
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
- Backportowanie patchy z RHEL 6 do CentOS 6 na przykładzie httpd 2.2.15
- Percona Toolkit – pt-show-grants – klonowanie uprawnień między bazami
- Apache – podstawowy poziom bezpieczeństwa – podsumowanie
- Budowa i instalacja pakietów Apache 2.4.2 na CentOS 6.2
- Apache – logowanie, tego co niewidzialne dla logowania