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.

120na80.cz: Zjistěte, zda je vaše klíště infikované

Zjistěte, zda je vaše klíště infikované

120na80.cz: Velký přehled: 7 očkování proti exotickým nemocem

Velký přehled: 7 očkování proti exotickým nemocem

Podnikatel.cz: Šizený guláš na pultě. Jako Lidl to nedělejte

Šizený guláš na pultě. Jako Lidl to nedělejte

DigiZone.cz: Budoucnost A/V služeb? Zpoplatněná

Budoucnost A/V služeb? Zpoplatněná

Vitalia.cz: Mražené ryby z Makra byly falšované

Mražené ryby z Makra byly falšované

120na80.cz: Jak si udržet zdravou vaginu

Jak si udržet zdravou vaginu

Lupa.cz: Přenos hokeje padal kvůli útoku, tvrdí O2

Přenos hokeje padal kvůli útoku, tvrdí O2

Vitalia.cz: Ministerstvo: tyto příbory jsou nebezpečné

Ministerstvo: tyto příbory jsou nebezpečné

120na80.cz: 10 nej přípravků na holení

10 nej přípravků na holení

DigiZone.cz: Šlágr TV: pokuta 100 tisíc za on-line

Šlágr TV: pokuta 100 tisíc za on-line

Root.cz: Cenzura internetu prošla, i přes pochyby senátorů

Cenzura internetu prošla, i přes pochyby senátorů

Podnikatel.cz: Alza radí e-shopům, jak opustit Heureku

Alza radí e-shopům, jak opustit Heureku

Lupa.cz: Babiš: nevím o návodu, jak obejít blokování webů

Babiš: nevím o návodu, jak obejít blokování webů

Podnikatel.cz: Proměny stavebnice Seva. Znáte ji?

Proměny stavebnice Seva. Znáte ji?

DigiZone.cz: Konec geoblokace online médií?

Konec geoblokace online médií?

Vitalia.cz: Muži kouří 24 cigaret denně, ženy o dost míň

Muži kouří 24 cigaret denně, ženy o dost míň

Vitalia.cz: Dnešní patolog o mrtvolu téměř nezavadí

Dnešní patolog o mrtvolu téměř nezavadí

Vitalia.cz: Děti jsou sportem opotřebované

Děti jsou sportem opotřebované

Lupa.cz: Zaplatíme ti, když ti seženeme práci

Zaplatíme ti, když ti seženeme práci

Lupa.cz: Kam si doma dáte internet věcí? Na polici?

Kam si doma dáte internet věcí? Na polici?