Bezpečí s chrootem

Petr Ferschmann 31. 3. 2006

Naše firma provozuje několik linuxových serverů a na každém z nich jsou spuštěny různé služby. Jako správce těchto serverů samozřejmě klademe důraz na bezpečnost. Mimo standardní obrany jako je grsecurity patch, PaX, vypnutí podpory modulů jádra, Trusted Path Execution pro apache a PHP safe mode používáme také vlastní chroot pro jednotlivé služby.

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.

Našli jste v článku chybu?
Vitalia.cz: Jeďte do lázní, to je holistika

Jeďte do lázní, to je holistika

Podnikatel.cz: Skvělá zpráva, dobírka #EET nepodlehne

Skvělá zpráva, dobírka #EET nepodlehne

DigiZone.cz: Prima Max bude mít letní kino. Na střeše...

Prima Max bude mít letní kino. Na střeše...

120na80.cz: Cestovní nevolnost. Co pomůže?

Cestovní nevolnost. Co pomůže?

Vitalia.cz: Jelení farma produkuje kvalitní maso

Jelení farma produkuje kvalitní maso

120na80.cz: Proč komáři létají hlavně večer?

Proč komáři létají hlavně večer?

Lupa.cz: Zkoušeli operátoři manipulovat měření LTE?

Zkoušeli operátoři manipulovat měření LTE?

DigiZone.cz: Boj Markízy a Novy o federální trh vrcholí

Boj Markízy a Novy o federální trh vrcholí

DigiZone.cz: Noxon iRadio 1 W bude za pár měsíců

Noxon iRadio 1 W bude za pár měsíců

Vitalia.cz: 7 receptur z pohanky. Svědčí zdraví

7 receptur z pohanky. Svědčí zdraví

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...

Vitalia.cz: Jíme přesolené potraviny. Zrovna tyhle

Jíme přesolené potraviny. Zrovna tyhle

DigiZone.cz: Náhrada za nevrácená zařízení?

Náhrada za nevrácená zařízení?

Lupa.cz: Nej aplikace? Vodafone, Mozkovna, Záchranka

Nej aplikace? Vodafone, Mozkovna, Záchranka

Vitalia.cz: 5 porcí ovoce a zeleniny: no ale jak na to?

5 porcí ovoce a zeleniny: no ale jak na to?

120na80.cz: Jsou opalovací krémy pro děti jiné?

Jsou opalovací krémy pro děti jiné?

Vitalia.cz: Epidemie: Klíšťová encefalitida po ovčím sýru

Epidemie: Klíšťová encefalitida po ovčím sýru

DigiZone.cz: Nova: technické pauzy každé 1. pondělí

Nova: technické pauzy každé 1. pondělí

DigiZone.cz: Roční bonus pro Dvořáka schválen

Roční bonus pro Dvořáka schválen

DigiZone.cz: Skylink: Nova Sport volně

Skylink: Nova Sport volně