LIDS - Linuxový systém odhalení průniku 2

12. 8. 2003
Doba čtení: 7 minut

Sdílet

V minulém dílu jsme se seznámili se základními rysy softwarové záplaty linuxového jádra LIDS, provedli jsme záplatování a překlad jádra, instalaci nástrojů LIDS a ukázali si, jak je možné vytvořit LFS (LIDS Free Session), ve které LIDS omezení uvalená na operační systém (OS) na vás nepůsobí. Doposud jsme neměnili žádné LIDS konfigurační soubory, pouze jsme se dozvěděli, že se nacházejí v neviditelném adresáři /etc/lids a viděli jsme jejich výčet. Myslím si, že nyní dozrál čas, abych ukázal, jak se LIDS konfiguruje.

Základy konfigurace

Jakmile používáte linuxové jádro s aktivovaným LIDS, máte jedinou možnost, jak ovlivnit jeho konfiguraci. Můžete použít programy lidsadm a lidsconf. Výjimkou jsou pouze konfigurační soubory /etc/lids/lid­s.cap a /etc/lids/lid­s.net, které se editují přímo.

Nejdůležitější volby příkazu lidsadm jsou následující:

lidsadm -I                 zapečetí jádro
lidsadm -S -- -LIDS        zapíná LFS
lidsadm -S -- +LIDS        vypíná LFS
lidsadm -S -- -LIDS_GLOBAL vypíná globálně LIDS
lidsadm -S -- +LIDS_GLOBAL zapíná LIDS globálně
lidsadm -S -- +RELOAD_CONF znovu načte konfigurační
                           soubory do jádra
lidsadm -V                 aktuální stav LIDS nastavení
lidsadm -help              vypisuje nápovědu (help)

Tam, kde je použit parametr -S, je potřeba interaktivně zadat heslo.

Další komentář snad potřebuje pouze parametr -I, který umožní zapečetit (seal) jádro. Co to znamená zapečetění jádra? Linuxové jádro je většinou spíše modulární než statické, což dovoluje dle potřeby za běhu přidávat moduly jádra (LKMs, Linux Kernel Modules) a tím přidávat požadovanou funkcionalitu. Toto řešení má spoustu výhod, avšak z bezpečnostního hlediska je lepší pracovat s jádrem, jež se nemění, neumožňuje dynamicky použít nějaký LKM, který může být konec konců i podvržený.

Od okamžiku spuštění příkazu

# lidsadm -I

se začnou uplatňovat schopnostní ACLs (Capability ACLs), a tudíž (dáno výchozí konfigurací LIDS) nemohou být moduly jádra ani přidávány, ani odebírány. Vzhledem k této vlastnosti doporučuji zapečetit jádro v závěru startu OS, např. v /etc/rc.d/rc.lo­cal a předtím zajistit natažení (load) všech potřebných LKMs jako např. ovladačů pro LAN karty, modulů pro iptables atd.

Souborové ACLs (File ACLs) jsou funkční od okamžiku bootování jádra.

Druhý příkaz lidsconf lze aplikovat pouze v LFS, což znamená, že změny konfigurace jsou chráněny heslem. Příkaz zapisuje do souboru /etc/lids/lid­s.conf nebo /etc/lids/lid­s.pw. Obecně řečeno, LIDS ACLs jsou založené na dvou principech. Objektu, kterým může být soubor, adresář, schopnost nebo jméno socketu, na něž se ACL aplikuje, a volitelně subjektu, což je jakýkoli proces (program) zadaný ve formě souboru, který se snaží získat přístup k objektu nějakým způsobem omezenému. Jeho zjednodušená syntaxe nápadně připomíná iptables a je následující:

lidsconf COMMAND [-s subject] -o object
 [-t from-to] [-i level] -j ACTION

COMMAND:
 -A  přidává záznam do lids.conf
 -D  maže záznam v lids.conf
 -Z  maže všechny položky v lids.conf
 -U  aktualizuje i-node čísla v lids.conf
 -L  vypisuje veškeré položky v lids.conf v čitelné podobě
 -P  kryptuje heslo a zapisuje jej do lids.pw
 -v  ukáže verzi
 -h  vypisuje nápovědu

ACTION:
 DENY     zakáže přístup
 READONLY povoluje pouze čtení, modifikace jsou zakázány
 APPEND   povoluje čtení a přidávání (append) pro zápis
 WRITE    povoluje zápis, objekt bude zcela nechráněný
 GRANT    přiděluje subjektu schopnost
 IGNORE   ignoruje jakákoli povolení (permissions)
          nastavená pro objekt

Princip ochrany všech subjektů

Dále předpokládejme, že nejsou nastavena žádná pravidla (ACLs). To lze zajistit příkazem

# lidsconf -Z

Uvedu několik názorných příkladů.

# lidsconf -A -o /etc/lilo.conf -j DENY
# lidsconf -A -o /root -j READONLY
# lidsconf -A -o /bin -j READONLY
# lidsconf -A -s /bin/bash -o /root/.bash_history -j WRITE
# lidsconf -A -s /sbin/hwclock -o CAP_SYS_TIME -j GRANT

V prvním příkladu se stává pro OS kritický soubor /etc/lilo.conf neviditelným, a to pro kohokoli, kdo nezná LIDS heslo. Ve druhém řádku povolujeme pouze čtení pro adresář /root a rekurzivně pro všechny jeho podadresáře a soubory. Ve čtvrtém řádku se povoluje zápis historie do souboru /root/.bash_his­tory pro shell bash a výhradně jen pro něj. To je však možné pouze díky existenci předchozího řádku, kde se /bin stává pouze čitelný. Odtud a z rekurzivnosti ACLs vyplývá i ochrana pro /bin/bash, a proto lze zrealizovat řádek čtvrtý. LIDS totiž funguje na principu ochrany všech subjektů. Poslední příkaz by potom měl povolit pro funkci hwclock manipulace s hardwarovými hodinami (RTC, Real Time Clock). Poněvadž ale hwclock není zatím chráněný subjekt, LIDS vypíše hlášku

lidsconf: the subject file is not protected

Pokud dále budeme konfigurovat následovně

# lidsconf -A -o /sbin -j READONLY (nebo
 lidsconf -A -o /sbin/hwclock -j READONLY)
# lidsconf -A -s /sbin/hwclock -o CAP_SYS_TIME -j GRANT

získá funkce hwclock schopnost CAP_SYS_TIME a můžeme pro kontrolu vypsat aktuálně nastavená pravidla

# lidsconf -L

a provést aktivaci pravidel

# lidsconf -U
# lidsadm -S -- +RELOAD_CONF

Závislost na i-node číslech

Předchozí příkaz lidsconf -U aktualizuje i-node čísla v /etc/lids/lid­s.conf. Pokud provedeme syrový výpis souboru /etc/lids/lid­s.conf příkazem cat, uvidíme, že i-node čísla souborů jsou zde opravdu v šestém políčku uvedena.

# ls -i /root/.bash_history
 286839 /root/.bash_history
# cat /etc/lids/lids.conf
0:0::0:0:226153:2051:/etc/lilo.conf:0-0
0:0::1:0:286273:2051:/root:0-0
0:0::1:0:159102:2051:/bin:0-0
159248:2051:/bin/bash:7:0:286839:2051:/root/.bash_history:0-0
0:0::1:0:79576:2051:/sbin:0-0
79768:2051:/sbin/hwclock:16:0:-1:25:CAP_SYS_TIME:0-0

Fakt, že LIDS ACLs jsou na i-node číslech závislá, musíme mít při používání našich pravidel neustále na zřeteli. Změny i-node čísel se objevují především, když systémové programy (např. logrotate) mažou a znovu vytvářejí soubory. Jestliže i-node čísla v konfiguraci LIDS nebudou odpovídat skutečnému stavu, budou chráněny jiné soubory, než které jsme zamýšleli, což může vést k závažným bezpečnostním chybám nebo provozním problémům.

Několik doporučení

Výhodné je napsat si svůj vlastní skript (dávku) pro nastavování LIDS pravidel a umístit jej do neviditelného adresáře /etc/lids. Tento skript by měl být pochopitelně zahájen příkazem lidsconf  – Z a ukončen příkazy lidsconf -U a lidsadm -S – +RELOAD_CONF. Dávka se musí spouštět v rámci LFS. V první fázi zkoušení doporučuji přepsat pravidla uvedená v originálním /etc/lids/lid­s.conf a popřípadě je doplnit v závislosti na místních potřebách dle LIDS FAQ, vizlids faq, kde jsou zveřejněny skripty pravidel pro nejrůznější služby i obecné systémové nastavení.

Globální LIDS schopnosti (Capability)

Jsou uloženy v souboru /etc/lids/lid­s.cap v řádcích ve formátu

[+-]#:Capability_Name

Úryvek tohoto souboru může vypadat následovně:

-16:CAP_SYS_MODULE
-17:CAP_SYS_RAWIO
-18:CAP_SYS_CHROOT
+22:CAP_SYS_BOOT

Jestliže je prvním znakem na řádku +, procesy, které běží pod uživatelem root, mají odpovídající schopnost k dispozici. Je-li na začátku řádku znaménko -, není schopnost k dispozici pro žádný proces v systému. Soubor lze ručně editovat. Změny aplikované na globální LIDS schopnosti se uplatní až po znovunačtení (reload) konfigurace do jádra. Soubor lids.cap obsahuje cca 30 schopností, jejichž popis je uveden uvnitř ve formě komentářů. Doporučuji si je pečlivě prostudovat, neboť je v nich ukryta značná síla LIDS. V této sérii článků budu vysvětlovat průběžně jen zde používané schopnosti, a to pouze při jejich prvním výskytu. Abych tedy dodržel slovo, objasním dosud prezentované schopnosti

CAP_SYS_MODULE  povoluje vkládání a mazání LKMs
CAP_SYS_RAWIO   povoluje syrový (raw) přístup
                k zařízením (takovým jako /dev/hda)
CAP_SYS_CHROOT  povoluje použití funkce chroot()
CAP_SYS_BOOT    povoluje použití funkce reboot()
CAP_SYS_TIME    povoluje manipulaci s RTC

Další doporučení

Pro začátek je vhodné vyjít z výchozího souboru lids.cap. Pro finální zabezpečení firewallu je pak optimální nastavit pro všechny globální schopnosti s výjimkou CAP_SYS_BOOT znaménko minus. To by umožňovalo administrátorovi provést reboot OS bez LFS a dostat se tak do systému chráněného LIDS i v případě nouze, kdy např. zapomenul LIDS heslo. Viz komentář v úvodním článku ke startu jádra linux.lids s parametrem lids=0 při výzvě zavaděče LILO.

(Poslední) konfigurační soubor – pro bezpečnostní avíza od jádra

LIDS zahrnuje, jak již bylo dříve zmíněno, SMTP klienta, který může být zakompilován do linuxového jádra. Při kompilaci jádra je nutné vybrat položku Send Security alerts through network. V souboru /etc/lids/lid­s.net potom pomocí direktiv

MAIL_SWITCH= 1           # 0==zadna aviza, 1==posilat aviza
MAIL_RELAY=127.0.0.1:25          # IP:port SMTP serveru
MAIL_SOURCE=lids.sinocluster.com # uzivane pro SMTP helo
MAIL_FROM= LIDS_ALERT@lids.sinocluster.com
    # policko From: (odesilatel)
MAIL_TO= root@localhost          # policko To: (prijemce)
MAIL_SUBJECT= LIDS Alert         # predmet postovni zpravy

můžeme nastavit, zda mají být avíza generována, obsah políček poštovního avíza a především adresu, kam mají být tato avíza zasílána. Změny se uplatní až po znovunačtení konfigurace do jádra. Na firewallu se záplatou LIDS nemusí být pro tento účel nainstalovaný poštovní server.

ict ve školství 24

Nevýhodou tohoto řešení je ovšem to, že se budou zasílat veškerá avíza bez ohledu na jejich naléhavost. Rozumnější je použít nástroj, který dokáže analyzovat systémový logový soubor a současně zasílat informativní zprávy (reports), např. swatch nebo logsurfer.

Závěr

Tento díl seriálu o softwarové záplatě LIDS končí. Byl věnován zejména konfiguracím. V příštím článku si ukážeme, jak je možné ukrýt nějaký proces, jak LIDS funguje jako systém detekce průniku a jak lze odstranit některé chybové hlášky operačního systému, který je chráněn pomocí LIDS. Při této příležitosti budeme aplikovat další zajímavé parametry příkazu lidsconf.