Chroot je program, který najdeme téměř ve všech variantách unixu. Jeho název vznikl zkrácením slov „change root“ (změň kořen souborového systému). Již z názvu vyplývá, že chroot mění kořenový adresář pro zvolený program a jím spuštěné potomky.
Jedná se o vytvoření vlastní instalace systému, ve které je jen nezbytné množství souborů k provozování služby (např. schází /bin/bash) . Pro každou službu, kterou provozujeme, vytvoříme vlastní mini-instalaci. Díky této konfiguraci bude velmi těžké po napadení jedné služby útočníkem ovlivnit i služby další (a doufejme, že s grsecurity i nemožné – tento patch umožňuje další omezení pro programy běžící v chrootu). A protože ve světě unixu je téměř vše souborem, je izolace služeb již téměř kompletní. Výjimku tvoří pouze naslouchání na TCP/UDP portech, některé varianty BSD však umožňují separovat i je.
Příkaz chroot
můžeme také použít, pokud máte nainstalovano více linuxových distribucí současně. Připojíte druhou distribuci a pustíte příkaz:
# chroot /adresar prikaz
Vytvořit mini-instalaci ovšem není vůbec jednoduché. Problém je, co všechno v instalaci ještě schází. Když chroot dokončíte, narazíte na potíž, jak jej pravidelně aktualizovat o bezpečnostní opravy.
Abychom těmto problémům předešli, používáme úspěšně program jailer. Jedná se o jednoduchý nástroj pro debian, který se o vše postará.
Stačí vytvořit konfigurační soubor /etc/jailer.conf
a do něj uvést balíček, který chcete chrootovat. On zajistí, aby v chrootu byly i všechny závislosti. Je snadné uvést, které další soubory/balíčky nainstalovat, a také které vyjmout, přestože je na ně v balíčku závislost.
Konfigurační soubor je rozdělen na části general (globální) a na jednotlivé chrooty. Lze použít tyto příkazy:
- Root: název adresáře, do kterého bude umístěn celý chroot
- Debs: seznam balíčků, které se mají nainstalovat. Budou nainstalovány včetně všech závislostí.
- Junk-Debs: seznam balíčků, které nemají být v žádném případě nainstalovány.
- Extra: seznam souborů a adresářů, které mají být nainstalovány, i když na ně není závislost. Jedná se především o /dev/null a /dev/random.
- Junk: seznam souborů a adresářů, které nemají být nainstalovány, přestože patří do nějakého balíčku.
Takto by mohl vypadat konfigurační soubor pro mysql, rsync a jabber:
<general>
Conf: /etc/resolv.conf /etc/hosts /etc/passwd /etc/group /etc/localzone /etc/ld.so.conf /etc/ld.so.cache /etc/nsswitch.conf /sbin/ldconfig
Junk: /usr/doc/* /usr/man/* /usr/share/man/* /usr/share/doc/* /etc/init.d/* /usr/share/zoneinfo/* /sbin/ldconfig.new /etc/* /usr/share/info/* /usr/lib/mime/* /usr/sbin/arp /usr/sbin/arping /usr/sbin/inetd /usr/sbin/ipautofw /usr/sbin/ipmasqadm /usr/lib/ssl/* /usr/sbin/tzconfig /usr/sbin/update-inetd /usr/sbin/zic /usr/bin/tzselect /usr/bin/ldd /usr/bin/getent /usr/bin/zdump /lib/libm* /lib/libcrypt* /lib/libthread* /lib/libutil* /lib/librt* /lib/libpthread* /lib/libnss* /lib/libdb* /lib/libdl* /lib/libBrokenLocale* /lib/libnsl* /lib/libSegFault* /lib/libresolv* /usr/sbin/iconv /usr/sbin/local /usr/bin/rpc* /usr/bin/trace* /usr/sbin/pam_getenv /usr/sbin/iconvconfig /usr/share/lintian/* /usr/share/pam/* /usr/sbin/locale /usr/sbin/iconv /usr/sbin/getconf /sbin/ldconfig
Junk-Debs: tcpd arpd login net-tools debianutils passwd libpam-modules at cron logrotate adduser debconf base-passwd ssl-cert anacron mime-support libpam-modules base-files mailx debconf-i18n perlapi-5.8.3 libtext-iconv-perl liblocale-gettext-perl libtext-wrapi18n-perl libtext-charwidth-perl perl perl-base perl-modules psmisc mail-transport-agent libdbd-mysql-perl libplrpc-perl libnet-daemon-perl
Extra: /dev/null /dev/log /dev/zero /dev/random /dev/urandom /sbin/start-stop-daemon
</general>
<mysql>
Root: /var/chroot/mysql
Conf: /etc/mysql/*
Debs: mysql-server bash libncurses5 hostname coreutils sed bsdutils libwrap0
Junk-Debs: libdbi-perl
</mysql>
<rsync>
Root: /var/chroot/rsync
Conf: /etc/rsync/*
Debs: rsync
</rsync>
<jabber>
Root: /var/chroot/jabber
Conf: /etc/jabber/*
Debs: jabber jabber-jit
Junk-Debs: libncurses5 coreutils
</jabber>
Důvodem, proč neinstalovat některé balíčky a/nebo soubory je, že např. u apache běží v chrootu jen proces, který obsluhuje HTTP. Ta část, která se stará o konfiguraci, běží i nadále mimo něj. Abychom toho docílili, po spuštění příkazu jailer
, vytvoříme symlink z /etc/apache do odpovídajícího adresáře v chrootu. To samé provedeme i pro adresáře ve /var.
Pak stačí pustit jen:
# jailer /etc/jailer.conf
a vše je nainstalováno.
Nesmíte ještě zapomenout připojit /proc
do cílového chrootu (jinak některé aplikace nefungují) a můžete pouštět služby. Naštěstí není problém připojit jeden souborový systém na více míst. Stačí tedy zduplikovat v /etc/fstab
záznam a přepsat u něj adresář.
Některé programy potřebují logovat i z chrootu, musíme jim proto umožnit komunikovat se syslogem. Nejlepším řešením je upravit soubor /etc/init.d/syslog
a doplnit:
SYSLOGD="-a /var/chroot/jabber/dev/log -a /var/chroot/apache/dev/log"
Tímto příkazem dosáhneme, že syslog vytvoří několik „pojmenovaných rour“ pro komunikaci s aplikacemi.
Pro dokončení instalace je ještě potřeba upravit /etc/init.d/apache2 a doplnit spuštění pomocí příkazu chroot:
APACHE2="$ENV /usr/sbin/chroot /var/chroot/apache /usr/sbin/apache2"
APACHE2CTL="$ENV /usr/sbin/chroot /var/chroot/apache /usr/sbin/apache2ctl"
Protože používáme postfix, měli jsme problém s posíláním emailů z apache a php v takovémto chrootu (kvůli unix socketům postfixu). Proto instalujeme do chrootu i balíček ssmtp, což je jednoduchý MTA, který emaily přepošle na port 25 a doručí jej postfixu mimo chroot.
Při instalaci to chce mnoho zkoušení, protože nic nebude fungovat napoprvé. Přeji mnoho úspěchů při zabezpečování serveru.