Apache chroot – mini HOWTO
Autor: Grzegorz Ciepłucha
v 1.1, 27 Październik 2000


Dokument opisuje w jak najprostszy sposób uruchomić serwer WWW Apache w osobnym środowisku.
Rozwiązanie to zwiększa bezpieczeństwo naszego systemu. Opis oparty na przykładzie standardowej dystrybucji Redhat 6.2


1.System
2.Instalacja

4.Uwagi


1. System

Standardowa instalacja dystrybucji RedHat 6.2, Jądro 2.2.14, Apache 1.3.12.

2. Instalacja

2.1 Zatrzymanie Apache’a
Jeżeli mamy uruchomiony serwer to zatrzymujey go:

[[email protected] /]# /etc/rc.d/init.d/httpd stop

2.2 Tworzenie użytkownika
Tworzymy nowego użytkownika ‚www’:

[[email protected] /]# useradd -c "Apache Server" -u 80 -s /bin/false -r -d /home/httpd www 2>/dev/null ||:

2.3 Tworzenie katalogów
Tworzymy nową strukturę katalogów w której będzie działał nasz Apache:

[[email protected] /]# mkdir /chroot
[[email protected] /]# mkdir -p /chroot/httpd/dev
[[email protected] /]# mkdir -p /chroot/httpd/lib
[[email protected] /]# mkdir -p /chroot/httpd/etc
[[email protected] /]# mkdir -p /chroot/httpd/usr/sbin
[[email protected] /]# mkdir -p /chroot/httpd/var/run
[[email protected] /]# mkdir -p /chroot/httpd/var/lock
[[email protected] /]# mkdir -p /chroot/httpd/var/log/httpd
[[email protected] /]# mkdir -p /chroot/httpd/home/httpd

Nadajemy prawa do katalogu

[[email protected] /]# chmod 750 /chroot/httpd/var/log/httpd

2.4 Biblioteki

Sprawdzamy z jakich bibliotek korzysta Apache:

[[email protected] /]# ldd /usr/sbin/httpd

Powinieneś otrzymać podobną listę do tej:

        libm.so.6 => /lib/libm.so.6 (0x4001b000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x4003a000)
        libdb.so.3 => /usr/lib/libdb.so.3 (0x40067000)
        libdl.so.2 => /lib/libdl.so.2 (0x40121000)
        libc.so.6 => /lib/libc.so.6 (0x40124000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

2.5 Kopiowanie plików i bibliotek

Kopiujemy wszystkie wymagane pliki przez Apache’a i biblioteki do katalogów które przed chwilą utworzyliśmy:

[[email protected] /]# cp -r /etc/httpd /chroot/httpd/etc/
[[email protected] /]# cp -r /home/httpd/cgi-bin /chroot/httpd/home/httpd
[[email protected] /]# cp -r /home/httpd/html /chroot/httpd/home/httpd
[[email protected] /]# cp -r /home/httpd/icons /chroot/httpd/home/httpd
[[email protected] /]# cp /usr/sbin/httpd /chroot/httpd/usr/sbin/
[[email protected] /]# cp /lib/libm.so.6 /chroot/httpd/lib/
[[email protected] /]# cp /lib/libcrypt.so.1 /chroot/httpd/lib/
[[email protected] /]# cp /lib/libdb.so.3 /chroot/httpd/lib/
[[email protected] /]# cp /lib/libdl.so.2 /chroot/httpd/lib/
[[email protected] /]# cp /lib/libc.so.6 /chroot/httpd/lib/
[[email protected] /]# cp /lib/ld-linux.so.2 /chroot/httpd/lib/
[[email protected] /]# cp /lib/libnss_compat* /chroot/httpd/lib/
[[email protected] /]# cp /lib/libnss_dns* /chroot/httpd/lib/
[[email protected] /]# cp /lib/libnss_files* /chroot/httpd/lib/
[[email protected] /]# cp /etc/passwd /chroot/httpd/etc
[[email protected] /]# cp /etc/group /chroot/httpd/etc
[[email protected] /]# cp /etc/mime.types /chroot/httpd/etc
[[email protected] /]# cp /etc/resolv.conf /chroot/httpd/etc
[[email protected] /]# cp /etc/hosts /chroot/httpd/etc
[[email protected] /]# cp /etc/nsswitch.conf /chroot/httpd/etc
[[email protected] /]# cp /etc/localtime /chroot/httpd/etc

Tworzymy specjalny plik i nadajemu mu odpowiednie prawa:

[[email protected] /]# mknod /chroot/httpd/dev/null c 1 3
[[email protected] /]# chmod 666 /chroot/httpd/dev/null

2.6 Modyfikacja plików

Modyfikujemy pliki (możesz użyć swojego ulubionego edytora vi, joe, mcedit …):

[[email protected] /]# joe /chroot/httpd/etc/httpd/conf/httpd.conf

Odszukujemy linie:


User nobody
Group nobody

i zmieniamy na:


User www
Group www

[[email protected] /]# joe /chroot/httpd/etc/passwd

Usuwamy wszystkie wpisy z wyjątkiem tego:
www:x:80:80::/home/httpd:/bin/false

[[email protected] /]# joe /chroot/httpd/etc/group

Usuwamy wszystkie wpisy z wyjątkiem tego:

www:x:80:
Musimy teraz poinformować demona syslogd o poczynionych zmianach:

[[email protected] /]# joe /etc/rc.d/init.d/syslog

Odszukujemy linię:

daemon syslogd -m 0

i zmieniamy ją na:

daemon syslogd -m 0 -a /chroot/httpd/dev/log

[[email protected] /]# joe /etc/logrotate.d/apache

Ustawiamy nowe ścieżki do logów:

/chroot/httpd/var/log/httpd/access_log {
    missingok
    postrotate
        /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
}
/chroot/httpd/var/log/httpd/agent_log {
    missingok
    postrotate
        /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
}

/chroot/httpd/var/log/httpd/error_log {
    missingok
    postrotate
        /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
}
/chroot/httpd/var/log/httpd/referer_log {
    missingok
    postrotate
        /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
    endscript
}

Modyfikujemy skrypt uruchamiający Apache’a:

[[email protected] /]# joe /etc/rc.d/init.d/httpd

Odszukujemy linię:
daemon httpd

i zmieniamy ją na:

/usr/sbin/chroot /chroot/httpd /usr/sbin/httpd

Szukamy również linii:
rm -f /var/run/httpd.pid

i zmieniamy ją na:
rm -f /chroot/httpd/var/run/httpd.pid

2.7 Zabezpieczanie plików

Zabezpieczamy pliki konfiguracyjne:

[[email protected] /]# chattr +i /chroot/httpd/etc/passwd
[[email protected] /]# chattr +i /chroot/httpd/etc/group
[[email protected] /]# chattr +i /chroot/httpd/etc/resolv.conf
[[email protected] /]# chattr +i /chroot/httpd/etc/hosts
[[email protected] /]# chattr +i /chroot/httpd/etc/nsswitch.conf
[[email protected] /]# chattr +i /chroot/httpd/etc/httpd/conf/httpd.conf

2.8 Usuwanie plików i katalogów

Usuwamy niepotrzebne już pliki i katalogi:

[[email protected] /]# rm -rf /var/log/httpd/
[[email protected] /]# rm -rf /etc/httpd
[[email protected] /]# rm -rf /home/httpd
[[email protected] /]# rm -f /usr/sbin/httpd

2.9 Restart syslog’a, Start Apache’a

Na koniec restartujemy syslog’a i uruchamiamy Apache’a, i sprawdzamy czy działa już we własnym środowisku:

[[email protected] /]# /etc/rc.d/init.d/syslog restart
[[email protected] /]# /etc/rc.d/init.d/httpd start


3.0 Test

Sprawdzamy listę procesów:

[[email protected] /]# ps ax | grep httpd
	23993 ?        S     0:01 httpd
	23994 ?        S     0:01 httpd
	23995 ?        S     0:01 httpd
	23996 ?        S     0:00 httpd

Wydajemy polecenie:

[[email protected] /]# ls -la /proc/numer_procesu/root/

np:

[[email protected] /]# ls -la /proc/23993/root/

Jeżeli polecenie zwróci Ci taką listę:

dev
etc
home
lib
usr
var

to znaczy, że wszystko działa !!! I Apache działa już we własnym środowisku.

4. Uwagi

Jeżeli wykonasz wszystkie czynności opisane w tym dokumencie a Apache nie bedzię chciał się uruchomić, dokładnie
czytaj komunikaty które będzie wyświetlał podczas startu. Z reguły Apache podaje jakich plików mu brakuje. Wystarczy wtedy odszukać plik którego potrzebuje i skopiować go do identycznego katalogu tylko że znajdującego się już w katalogu /chroot. Na przykład, jeżeli masz skompilowanego Apache’a z obslugą modułu mod_perl musisz skopiować wszystkie pliki wymagane przez ten moduł do odpowiednich katalogów w /chroot (tj. „/usr/lib/perl5” do katalogu „/chroot/httpd/usr/lib/perl5/”, nie zapomij o stworzeniu wcześniej katalogu „/chroot/httpd/usr/lib/perl5”).

Powyższy opis można wykorzystać również w innych dystrybucjach, należy tylko pamiętać, że dystrybucje mogą mieć opisywane pliki w innych katalogach, część plików może inaczej się nazywać.


Dodaj komentarz

Twój adres email nie zostanie opublikowany.

This site uses Akismet to reduce spam. Learn how your comment data is processed.