Hlavní navigace

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?

4. 1. 2007 10:45

hohoho (neregistrovaný)
"Ovšem pokud zapomeneme otevřený byť jen jediný adresář v době provedení chroot, dá se z chrootu opět utéci. Je nutné provést close() na všechny I/O a chdir() a poté chroot()."

K tomu sluzi napriklad grsecurity patch... okrem ineho sposobi trosku rozdielne spravanie chrootu, takze sa z neho neda ujst:-)

3. 4. 2006 22:06

onovy (neregistrovaný)
a jiz popisovane zakazani mknode ?
pak si tech par radku, ktere vytvori dev od hda ani neskrkne
Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Podnikatel.cz: Vládu obejde, kvůli EET rovnou do sněmovny

Vládu obejde, kvůli EET rovnou do sněmovny

120na80.cz: Bojíte se encefalitidy?

Bojíte se encefalitidy?

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Lupa.cz: Není sleva jako sleva. Jak obchodům nenaletět?

Není sleva jako sleva. Jak obchodům nenaletět?

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

120na80.cz: Jak oddálit Alzheimera?

Jak oddálit Alzheimera?