Zgodnie z obietnicą w tej części cyklu zajmiemy się przeniesieniem serwera Apache do więzienia.

Co to jest chroot?

W trzeciej części przy okazji partycjonowania dysku w trakcie instalacji opowiadałem o różnicach pomiędzy windowsem, a linuxem. Najbardziej widoczną różnicą jest pojedyncze drzewo katalogów w linuxie. Wyobraźmy sobie, że popełniliśmy błąd i ktoś uzyskał możliwość poruszania się po systemie plików serwera. Oczywiście od razu przejdzie on do /etc/passwd pozna dostępne możliwość i zrobi krzywdę nam i serwerowi.
W celu ochrony możemy zmusić serwer do pracy w chrootcie. Działa to na zasadzie symulowania systemu plików w systemie plików. Serwer widzi „wirtualne drzewo katalogów”, które jest umieszczone w realnym drzewie. Mechanizm chroot nie pozwala na wyjście poza drzewo wirtualne. Serwer jest więc w czymś w rodzaju więzienia.

mod_chroot łatwo i przyjemnie

Logujemy się na serwer jako root.
Na początek należy zainstalować odpowiednie moduły do apacha:

Listing 1. Instalacja mod\_chroot

$ apt-get update
$ apt-get install libapache2-mod-chroot
$ a2enmod mod_chroot
$ /etc/init.d/apache2 force-reload

Ok mamy moduł zainstalowany. Konfiguracja też jest prosta 🙂 Mój chroot jest podpięty w /chroot/apache

Listing 2. Tworzenie katalogów dla chroota

$ mkdir -p /chroot/apache/var/run/
$ chown -R root:root /chroot/apache/var/run/
$ ln -s /var/www/ /chroot/apache/var/www/

Ostatnia linijka tworzy dowiązanie symboliczne (z winzołza – skrót) dla katalogu z naszymi stronami www do katalogu w chroocie. Czas na server.

Listing 3. Plik apache2.conf

$ /etc/init.d/apache2 stop
$ ln -s /chroot/apache/var/run/apache2.pid /var/run/apache2.pid
$ vim /etc/apache2/apache2.conf

Odszukujemy PidFile i dodajemy:

Listing 4. Edycja apache2.conf

[...]
PidFile /var/run/apache2.pid
ChrootDir /chroot/apache
[...]

Może się zdarzyć, że zamiast nazwy pliku będzie ${APACHE\_PID\_FILE}. Nie załamujemy się przechodzimy do /etc/apache2/envvars i dodajemy na końcu linijkę:

Listing 5. edycja envvars

export APACHE_CHROOT_DIR=/chroot/apache
# i w apache2.conf
ChrootDir ${APACHE_CHROOT_DIR}

Na listingu 3. zatrzymaliśmy serwer i linkowaliśmy plik apache2.pid. Po uruchomieniu apacha (to samo co na listingu 3 w pierwszej linii, ale ze start) powinniśmy zobaczyć…
No właśnie 403 forbidden. Coś nie bangla? Używałem tego opisu.
Problem polega na tym, że nieprawidłowo są nadane uprawnienia dla katalogów. Dlatego też troszkę zmodyfikujemy nasze działania.

Listing 6. Poprawki

$ cd /chroot/apache/var
$ rm -rf www/
$ mkdir www
$ chown www-data:www-data www
$ chmod 700 www
$ mv /var/www/index.php www/.
$ chown www-data:www-data www/index.php

U mnie działa czego i wam życzę.

Dodatek 1. Przydatne w linuxie

W trakcie pracy z linuxem, szczególnie jako root, wykonuje się dużo „magii konsolowej”, która w ogólności polega na pisaniu długich i skomplikowanych poleceń z mnóstwem opcji. Możemy sobie ułatwić życie poprzez utworzenie aliasów. Edytujemy /etc/bash.bashrc jako root:

Listing 7. Edycja /etc/bash.bashrc

alias ll='ls -la'
alias wtf='ps -aux'
alias stfu='kill -9'

Więcej do szczęścia nie jest nam jak na razie potrzebne. Chyba…