Začínáme bezpečně s FreeBSD (4)

13. 7. 2004
Doba čtení: 10 minut

Sdílet

Klasická přístupová práva definují, kdo a jaké operace může vykonávat. BSD systémy dále přinášejí příznaky souborů, se kterými můžete ještě zvýšit bezpečnost systému. Mezi další možnosti, které můžeme využít k lepšímu zabezpečení, patří volby připojení souborových systémů nebo nastavení kvót.

Příznaky souborů

Ochránit důležité konfigurační soubory proti smazání či změně, od toho tu jsou klasická unixová přístupová práva. Existují však ale nějaké další možnosti? Samozřejmě. Mezi jednu možnost patří příznaky souborů.

Poznámka: BSD příznaky souborů – flags, tedy ty superuživatelské (sappnd, schg, sunlnk), mění svou funkci podle bezpečnostní úrovně (securelevel), která je právě aktivní.

Funkce příznaků souborů ukazuje následující tabulka:

Tabulka č. 582
Flag Význam Popis funkce Právo nastavit/měnit

sappnd

system append-only

povoluje pouze data přidávat na konec souboru

pouze superuživatel

schg

system immutable

nezměnitelný soubor, není možné smazat ani editovat

pouze superuživatel

sunlnk

system undeletable

nesmazatelný soubor, může být však editován, změněn

pouze superuživatel

uappnd

user append-only

povoluje pouze data přidávat na konec souboru

vlastník nebo superuživatel

uchg

user immutable

nezměnitelný soubor, není možné smazat ani editovat

vlastník nebo superuživatel

uunlk

user undeletable

nesmazatelný soubor, může být však editován, změněn

vlastník nebo superuživatel

arch

archived

kompatibilní s atributem archivován u msdos

pouze superuživatel

nodump

nodump

vyjme objekt ze zálohování pomocí dump

vlastník nebo superuživatel

opaque

opaque

zneprůhledňuje objekt při mount_union*

vlastník nebo superuživatel

*) Jestli jste to někdo přesně pochopil, tak plz do diskuse pod článkem.

Z ohledu bezpečnosti nás zajímají příznaky schg a sappnd. Definování příznaků se provádí pomocí chflags -volba příznak. Je dobré vědět, že příznaky mají vyšší prioritu než UGO práva. Tudíž i když má např. root právo zápisu, resp. může smazat soubor, při schg příznaku mu je taková možnost odepřena. (Tedy pouze do doby, než odstraní příznak.) Příznaky můžete vypsat pomocí ls -lo. Ukážeme si tedy nejprve funkci příznaku  schg.

srot# touch test
srot# chflags schg test
srot# ls -lo test
-rw------- 1 root wheel schg 0 Jun 22 20:54 test
srot# echo "zmenim_te" > test
test: Operation not permitted.
srot# echo "pridat_nakonec" >> test
test: Operation not permitted.
srot# mv test h4ck3d
mv: rename test to h4ck3d: Operation not permitted
srot# rm -f test
rm: test: Operation not permitted
srot# cp test wannabe
srot# ls -lo test wannabe
-rw------- 1 root wheel schg 0 Jun 22 20:54 test
-rw------- 1 root wheel - 0 Jun 22 20:55 wannabe 

Z výpisu vidíte, že ls -lo do výpisu přidalo další pole pro příznaky – schg. Všechny pokusy o změnu obsahu souboru, jeho přesunutí a smazání byly neúspěšné. Soubor jde však zkopírovat, protože cp nemění na rozdíl od mv a rm původní soubor, jen vytváří nový se stejným obsahem. Což se promítne v jeho právech/příznacích.

Nyní vyzkoušíme funkci sappnd. Z tabulky vidíme, že jde k souboru změny jen připojovat, proto si vytvoříme soubor s nějakým původním textem.

srot# cat > mujblog
22. 6. - tezka nuda
srot# chflags sappnd mujblog
srot# ls -lo mujblog
-rw------- 1 root wheel sappnd 19 Jun 22 20:58 mujblog
srot# echo "zmenim_te" > mujblog
mujblog: Operation not permitted.
srot# echo "23. 6. - Emil pr*del si nemyl" >> mujblog
srot# mv mujblog wannabe2
mv: rename mujblog to wannabe2: Operation not permitted
srot# rm -f mujblog
rm: mujblog: Operation not permitted
srot# cat mujblog
22.6. - tezka nuda
23.6. - Emil pr*del si nemyl 

Takže vidíme, že k takovému souboru jsou změny opravdu jen připojovat. Příznaky odstraníme přidáním předpony no před název příznaku, tedy noschg, nosappnd atd. U příznaku nodump to logicky bude změna na dump.

srot# chflags noschg test && chflags nosappnd mujblog
srot# ls -lo test mujblog
-rw------- 1 root wheel - 48 Jun 22 20:59 mujblog
-rw------- 1 root wheel - 0 Jun 22 20:54 test 

Jak již bylo řečeno, příznaky souborů mění svou funkci v závislosti na momentálně běžící bezpečnostní úrovni (securelevel). Jak jsme rozebírali v prvním dílu (podívejte se na Security Profile – Extreme a na editaci souboru  /etc/rc.conf).

Securelevels, bezpečnostní úrovně systému, jsou nastavení jádra, která mění chování celého systému. Securelevel je spouštěn buď při startu systému nastavením kern_securelevel="YES" a kern_securelev="cislo" v /etc/rc.conf, nebo pomocí volání jádra příkazem sysctl. Příkaz sysctl nám pomůže prohlédnout nastavení hodnot, které jádro používá. Některé hodnoty jde tímto příkazem i měnit. Nutno dodat, že z logických důvodů securelevel nejde za běhu snížit! Shlédnout securelevel jádra můžeme tedy příkazem:

srot# sysctl kern.securelevel
kern.securelevel: -1 
Tabulka č. 583
Securelevel Funkce

-1

žádné dostatečné bezpečnostní funkce; vhodné k častým změnám

0

aktivní pouze při spouštění, než se systém přepne do víceuživatelského režimu po přepnutí se přejde do securelevelu 1; nepoužívá se

1

nemožnost měnit za běhu úrovně bezpečnostní příznaky souborů; nelze nahrávat/odebírat moduly jádra; nelze zapisovat do /dev/mem, /dev/kmem (syst. paměti); nelze zapisovat přímo na připojené disky; nepojede X WindowS

2

viz securelevel 1 plus: nelze zapisovat přímo i na nepřipojené disky; nelze změnit syst. čas o více než 1 sekundu najednou

3

viz securelevel 2 plus: nelze měnit pravidla IPF a IPFW

Z předešlé tabulky je tedy jasné, že jestliže je váš momentální securelevel >=1, nemůžete měnit nastavené příznaky souborů. Příznaky v kombinaci se securelevels přináší zvýšené zabezpečení, bohužel na druhou stranu i další problémy při pozdější konfiguraci. Změnu bezpečnostní úrovně můžete provést v jednouživatelském režimu, singleusermode, buď během bootování systému příkazem boot -s, nebo se do něj můžete přepnout za běhu pomocí shutdown now. Důležité však je uvědomit si, že v singleusermode nejsou automaticky spuštěny síťové služby, tzn. že siODŘÍZNETE vzdálené spojení!!! Podle našeho seriálu byste měli při přepnutí do singleusermode zadat heslo superuživatele (editace /etc/ttys v I. dílu).

Nasazení příznaků a patřičného securelevelu je tedy na vás. Jestliže si pečlivě odladíte svoje nastavení a víte, že v budoucnu nebudete provádět časté změny, je to dobrá volba. Bohužel při upgradech nebo aplikování patchů budete muset fyzicky dojít k serveru a udělat pár kroků navíc, abyste mohli aktualizovat „ochráněné“ soubory.

Na druhou stranu výhody příznaků jsou velké. Máte silnou zbraň proti záměně binárek za nějaké crackerské hračičky. Rovněž můžete pomocí sappnd ochránit vaše logy, to však potřebuje deaktivaci automatického rotování, velké místo pro /var/log a více ruční práce. Samotné„ochránění“ binárek nestačí. Útočník může obelstít startovací skripty tak, že po nenápadném restartu požadovanou bezp. úroveň vůbec nespustí. Jestliže se tedy rozhodnete pro masivní aplikování příznaků, doporučuji dobře nastudovat proces spouštění systému FreeBSD Handbook – Chapter 7 The FreeBSD Booting Process.

Masivní aplikování příznaků rovněž může znemožnit práci programům IDS, Intruders Detection systém.

Volby připojení oddílů

Soubor /etc/fstab je tabulkou obsahující záznam o souborových systémech. BSD systémy hledí na rozložení disku odlišně například od Windows nebo i od GNU/Linuxu. Výstup z /etc/fstab:

# Device     Mountpoint FStype  Options   Dump  Pass#
/dev/ad0s1b  none       swap    sw        0     0
/dev/ad0s1a  /          ufs     rw        1     1
/dev/ad0s1h  /jail      ufs     rw        2     2
/dev/ad0s1e  /tmp       ufs     rw        2     2
/dev/ad0s1g  /usr       ufs     rw        2     2
/dev/ad0s1f  /var       ufs     rw        2     2
/dev/acd0c   /cdrom     cd9660  ro,noauto 0     0
proc         /proc      procfs  rw        0     0

Chaos? Rozeberme si tedy část pro kořenový oddíl – /. Zařízení /dev/ad0s1a se skládá z těchto částí:

/dev/ad0s1a
     ad - označuje IDE disky
       0 - master disk na prvním řadiči
        s1 - označení prvního oddílu, neboli slice;
             v neBSD systémech se tomu říká partition
          a - označení partition pro kořenový oddíl

Možná jste si povšimli, že nám chybí písmenka c a d. V BSD systémech se pomocí c označuje vlastní systémový oddíl-slice (teda část disku s FreeBSD; s tímto oddílem např. pracuje fsck) a d dříve sloužilo k označení celého fyzického disku, což se však nyní nevyžaduje a může být použito pro samostatnou partition.

Poznámka: poslední řádek našeho výpisu /etc/fstab označuje procfs, který slouží k uchování informací o běžících procesech a využívají jej programy jako ps, w a truss. Více man fstab, man mount(8).

Sloupec options definuje volby pro připojování souborových systémů. Voleb je celá řada, doporučuji man fstab, z ohledu na bezpečnost nás budou zajímat tyto:

ro  – filesystem jen pro čtení noexec  – nelze spouštět binární kód nosuid  – nelze spouštět programy s právy jiného uživatele, tj. ignoruje SUID nodev  – zakazuje používání devices – zařízení

Mezi časté techniky patří vytváření skriptů v /tmp. Volba noexec pro /tmp může být ale příliš restriktivní, např. způsobí problémy při make installworld (krok při upgradu). Nastavenou volbou noexec pro /home zabráníme uživatelům spouštět vlastní programy. Volba nodev je vhodná pro všechny oddíly mimo kořenový oddíl, také zabraňuje, např. při připojení jiného unixového souborového systému se soubory zařízení, havárii. Změněný /etc/fstab by mohl vypadat takto:

/tmp    ufs  rw,noexec,nodev,nosuid    2 2
/usr    ufs  rw,nodev                  2 2
/var    ufs  rw,nodev,nosuid,noexec    2 2

Vhodnou volbou pro paranoiky je mít některé filesystémy s volbou read-only ( ro), například /usr.

Kvóty

Představte si situaci, že jeden z vašich uživatelů začne divočit a aktivně stahovat např. xvid verze nejnovějších hollywoodských trháků. Mohlo by to zajít i tak daleko, že by mohl zaplnit skoro celý oddíl pro /home. Kvóty nebo diskové kvóty představují nástroj operačního systému, jak omezit pro uživatele/skupinu velikost zabraného místa na disku nebo počet souborů. Aby kvóty mohly fungovat, je potřeba, aby byla tato volba ( options QUOTA) zkompilována do jádra (o kompilaci jádra si řekneme v dalších dílech).

Samotná funkce kvót se k určité partition přirazuje v souboru /etc/fstab. Příklad:

/dev/ad0s1g /usr ufs rw,userquota,groupquota,nodev 2 2 

Vlastní konfigurační soubory kvót pro uživatele a skupinu jsou quota.user a quota.group. Standardně se nalézají v kořenovém adresáři určitého filesystemu. Pro /usr, resp. uživatele v /usr/home, to tedy budou /usr/quota.user a /usr/quota.group. Změnit umístění souborů můžete v /etc/fstab např. takto (což se však nedoporučuje, páč některé nástroje s tím mohou mít problémy):

userquota=/var/kvoty/usr.user 

Zjistit, zda kvóty běží/neběží na některém filesystemu, můžete příkazem mount, ten vypíše přimountované fs a jejich volby.

Zapnout/vypnout podporu kvót bez restartu můžete příkazy quotaon, quotaoff. Protože však ještě neexistují konf. soubory kvót, je dobré před quotaon spustit quotachec­k. Příkaz quotacheck má na starosti: zabezpečení, že záznam obsazeného místa na disku v tabulce-databázi kvót bude odpovídat reálnému stavu; v případě, že konf. soubory kvót neexistují, je vytvoří – bez nich nemohou být kvóty spuštěny.

srot# quotacheck /usr
quotacheck: creating quota file /usr/quota.user
quotacheck: creating quota file /usr/quota.group 

Samotné definování kvót se provádí příkazem edquota, který spouští $EDITOR. Příkaz má mnoho voleb,  man edquota.

Konfigurační soubory pro kvóty se skládají z několika položek, ukážeme si to na tomto výpisu:

Quotas for user nasuzivatel:
/usr: kbytes in use: 8, limits (soft = 0, hard = 0)
inodes in use: 3, limits (soft = 0, hard = 0) 

Vlastně jsme si přesně neřekli, co těmi kvótami můžeme přesně omezit. Z výpisu můžete uhádnout, že jde definovat velikost zabraného místa na disku (první řádek), který je označen jednotkou kbytes. Druhý řádek ukazuje, že jde i definovat, kolik může uživatel/skupina vytvořit souborů ( inodes). Limity jsou buď soft (měkké), nebo hard (tvrdé). Soft limit znamená, že jestliže user/group překročí definovanou hodnotu, bude upozorněn a po „dobu hájení“ -grace time tolerován, defaultně týden. Tento grace time je nastaven defaultně v /usr/include/ufs/ufs/quota.h  a může být změněn, přidej k  edquota parametr -t. Za to limit hard je nekompromisní.

Změníme si soubory k našim představám, např. edquota nasuzivatel. Zkontrolovat kvóty můžeme pomocí quota -u nasuzivatel nebo repquota -a. Uživatel může prohlédnout pouze své kvóty/kvóty skupin, do kterých náleží.

Aby kvóty startovaly automaticky, opět pozměníme /etc/rc.conf, který „ochraňuje“ všechny důležité systémové volby:

bitcoin_skoleni

enable_quotas="YES" # turn on quotas on startup (or NO).
check_quotas="YES" # Check quotas on startup (or NO). 

V případě, že byste chtěli rozdistribuovat nastavené kvóty jiným uživatelům, pohrajte si např. s příkazy edquota -p nasuzivatel dalsiuser dalsiuser2 nebo edquota -p nasuzivatel 10000-19999 (čísla označují rozsah UIDs). Aby kvóty měly smysl, je dobré je nastavit i na další fs, kde mají uživatelé možnost zápisu, např.  /tmp.

Závěr

V příštím dílu již snad dokončíme naše nesíťové díly. Bude řeč o automatických bezpečnostních kontrolách FreeBSD, démonu cron a logovacím démonu  syslogd.