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/lids.cap a /etc/lids/lids.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.local 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/lids.conf nebo /etc/lids/lids.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_history 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/lids.conf. Pokud provedeme syrový výpis souboru /etc/lids/lids.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/lids.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/lids.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/lids.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.
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.