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:
Flag | Význam | Popis funkce | Právo nastavit/měnit |
|
|
povoluje pouze data přidávat na konec souboru |
pouze superuživatel |
|
|
nezměnitelný soubor, není možné smazat ani editovat |
pouze superuživatel |
|
|
nesmazatelný soubor, může být však editován, změněn |
pouze superuživatel |
|
|
povoluje pouze data přidávat na konec souboru |
vlastník nebo superuživatel |
|
|
nezměnitelný soubor, není možné smazat ani editovat |
vlastník nebo superuživatel |
|
|
nesmazatelný soubor, může být však editován, změněn |
vlastník nebo superuživatel |
|
|
kompatibilní s atributem archivován u msdos |
pouze superuživatel |
|
|
vyjme objekt ze zálohování pomocí dump |
vlastník nebo superuživatel |
|
|
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
Securelevel | Funkce |
|
žádné dostatečné bezpečnostní funkce; vhodné k častým změnám |
|
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 |
|
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 |
|
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 |
|
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 quotacheck
. 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:
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
.