FreeBSD MAC
Tartalomjegyzék[elrejtés] |
1 MAC implementáció a FreeBSD-ben
1.1 Bevezető
1.1.1 Mi az a MAC?
A Mandatory Access Control rövidítése. Olyan biztonsági modell ami a DAC kibővítésére, helyettesítésére szolgál. Egy DAC rendszerben a felhasználók maguk mondhatják meg, hogy az általuk birtokolt objektumoknak milyen jogai lehetnek. Ezzel szemben a MAC -ben a felhasználó nem adhat az objektumainak az adminisztrátor által beállíott jogoknál lazább jogokat.
1.1.2 MAC címkék
A rendszerünk minden egyes objektumát (felhasználók, fájlok, hálózati interfészek, képernyő) el kell látnunk úgynevezett címkékkel, ezek a címkék a használt biztonsági modultól függően sok mindent jelenthetnek. Pl a biba/high címke a Biba policy modulra vonatkozik és az értéke "high". A FreeBSD három előre definiált value van. A high a lehető legmagasabb, a low a legalacsonyabb, az equal pedig egy "dontcare" értéket állít be. Az object -ek mellett nem árt tisztázni a subject fogalmát, ami nem más mint az az entitás (esetek nagyrészében process) ami az objektumok közt áramoltat adatot. Ahhoz, hogy egy partíción más és más labelt adhassunk file-jainknak, engedélyezni kell minden partíción a multi labeling -et a
tune2fs -l enable /path/to/fs
paranccsal.
1.1.3 Telepítés
A FreeBSD-be az 5.0-ás verziótol került bele a TrustedBSD project részeként létrehozott MAC implementáció. A GENERIC kernelnek nem része a MAC, ha be szeretnénk kapcsolni tegyük az
options MAC
sort a kernelconfigunkba, majd fordítsuk újra a kernelt
make buildkernel KERNCONF=GENERIC && make installkernel KERNCONF=GENERIC
A MAC framework részét képzi még számos modul, amiket az /etc/loader.conf -ba írva a bootolási folyamat során betöltődnek. Természetesen van mód ezeket a kernelbe fordítani, de így nagyobb az esély, hogy kizárjuk magunkat kedvenc rendszerünkből egy rosszul sikerült konfiguráció során.
1.2 MAC
1.2.1 Címkék használata
Subjectekre(processzekre):
setpmac biba/high
Objectekre:
setfmac biba/high test.txt
Megadhatunk konkrét értékeket is:
setfmac biba/5(4-10)
Ahol a zárójel előtt az effektív, használatban levő érték van a zárójelekben pedig a legalacsonyabb és legmagasabb állítható érték) Hálózati interfészre:
ifconfig xl0 maclabel biba/equal
1.2.2 Modularitás
Alaphelyzetben, modulok nélkül is lehetőségünk van a MAC framework egyes részeit letiltani a sysctl parancs segítségével. Az alapértelmezett értékek mindegyiknél 1.
- security.mac.enforce_fs Fájlrendszer policyk
- security.mac.enforce_kld enforces MAC kernel linking policies on the dynamic kernel linker (see kld(4)).
- security.mac.enforce_network enforces MAC network policies.
- security.mac.enforce_pipe enforces MAC policies on pipes.
- security.mac.enforce_process enforces MAC policies on processes which utilize inter-process communication.
- security.mac.enforce_socket enforces MAC policies on sockets (see the socket(2) manual page).
- security.mac.enforce_system enforces MAC policies on system activities such as accounting and rebooting.
- security.mac.enforce_vm enforces MAC policies on the virtual memory system.
1.2.2.1 See no other uids
Modul betöltése:
kldload mac_seenootheruids.ko
vagy
echo mac_seeotheruids_load="YES" >> /etc/loader.conf
ha a bootolas során szeretnénk bekapcsolni A modul nem igényli a label -ek használatát és átlátszó módon képes működni más MAC modulokkal. Erre a későbbiekben lesz példa
- security.mac.seeotheruids.enabled bekapcsolja a modul funkcióit, ami alapértelmezésben megtiltja a felhasználóknak hogy mások processeit és socket-jeit lássák.
- security.mac.seeotheruids.specificgid_enabled segítségével kivételt állíthatunk be egy csoportnak. A csoport gid-jét a security.mac.seeotheruids.specificgid=XXX sysctl változóba kell tenni.
- security.mac.seeotheruids.primarygroup_enabled használatával elsődleges csoportoknak adhatunk kivételt. Tehát így a process vagy socket group tagjai látni fogják az adott processt vagy socket-et. Fontos, hogy a security.mac.seeotheruids.specificgid_enabled ne legyen ekkor bekapcsolva.
Példa:
test1 user nem látja mások processeit
[test1@homokozo /usr/home/test1]$ ps aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND test1 727 0.0 1.1 1676 1360 v1 I 2:56PM 0:00.10 -sh (sh) test1 728 0.0 1.6 3120 1920 v1 S 2:56PM 0:00.69 bash test1 805 0.0 0.7 1340 860 v1 R+ 3:21PM 0:00.07 ps aux
Készítsünk egy seeother csoportot, tegyük bele test1-et és állítsuk be kivételnek a csoportot
[root@homokozo ~]# pw groupadd seeother [root@homokozo ~]# pw groupmod seeother -M test1 [root@homokozo ~]# pw groupshow seeother seeother:*:1002:test1 [root@homokozo ~]# sysctl security.mac.seeotheruids.specificgid=1002 security.mac.seeotheruids.specificgid: 0 -> 1002 [root@homokozo ~]# sysctl security.mac.seeotheruids.specificgid_enabled=1 security.mac.seeotheruids.specificgid_enabled: 0 -> 1
Tada:
[test1@homokozo /usr/home/test1]$ ps aux |wc -l 63
Megjegyzés: A belépett felhasználókat nem kell kiléptetni ha beállítjuk ezt a sysctl változót, de ha a csoportot és a felhasználó tagságát a csoportban akkor hoztuk létre amikor a user be volt lépve az újra beléptetés szükséges.
1.2.2.2 BSDExtended modul
Betölthető ugyancsak modulként kézzel:
kldload mac_bsdextended.ko
boot során:
echo MAC_BSDEXTENDED_LOAD="YES" > /etc/loader.conf
vagy kernelbe forgatva:
OPTIONS MAC_BSDEXTENDED
A bsdextended modul nem más mint egy tűzfal a filerendszerre, vannak különféle szabályaink és ezeken végigmenve dönti el a rendszer, hogy az adott objektumhoz van e hozzáférésünk. Syntaxis hasonló az ipfw-hez.
[root@homokozo ~]# kldload mac_bsdextended Security policy loaded: TrustedBSD MAC/BSD Extended (mac_bsdextended) [root@homokozo ~]# ugidfw list 0 slots, 0 rules
Látható, hogy alaphelyzetben nincsenek betöltve szabályok
Szabályok felépítése:
add subject [not] [uid uid] [gid gid] object [not] [uid uid] [gid gid] mode arswxn
ahol
- a - adminisztratív műveletek
- r - olvasás
- s - file attribútumok elérése
- w - írás
- x - futtatás
- n - none
Példa:
[test1@homokozo /usr/home/test1]$ sh proba proba
Tiltsuk meg test1 usernek, hogy a saját dolgain kívül bármi máshoz hozzáférjen:
[root@homokozo ~]# ugidfw add subject uid test1 object not uid test1 mode n Added rule 1 [test1@homokozo /usr/home/test1]$ sh proba bash: /bin/sh: Permission denied
Itt már nem érjük el a /bin/sh, viszont magát a scriptet futtatva sikerrel járunk
[test1@homokozo /usr/home/test1]$ ./proba proba
A script tartalma egy "echo proba" sor
Megjegyzés: Ha subjectnek azt írjuk hogy not uid user1, akkor a szabály a user1 felhasználó kivételével minden más felhasználóra érvényes elvileg. Gyakorlatilag ilyen esetben a root felhasználó mindig kivétel
1.2.2.3 MAC ifoff
Letilthatjuk vele a hálózati interfészeket, és megakadályozzuk, hogy azokat a root bármikor felhúzza Modul neve: mac_ifoff.ko Boot opció: mac_ifoff_load="YES" Kernel config: options MAC_IFOFF
Az alábbi sysctl változók segítségével szabályozható a modul működése:
- security.mac.ifoff.lo_enabled loopback interfész ki-be kapcsolása
- security.mac.ifoff.bpfrecv_enabled Berkeley Packet Filter interfész (bpf(4))
- security.mac.ifoff.other_enabled minden egyéb
1.2.2.4 MAC portacl
Modul neve: mac_portacl.ko Boot opció: mac_portacl_load="YES" Kernel config: options MAC_PORTACL A modul lehetővé teszi, hogy bizonyos portok használata szabályhoz kötött legyen, akár megemelhetjuk a privileged ports határát 1023-ról egy magasabb értékre. (A UNIX rendszerekben az első 1024 portra sima felhasználók nem bindelhetnek). De akár egy port használatát köthetjük egy bizonyos felhasználóhoz is. A működést az alábbi sysctl változók segítik:
- security.mac.portacl.enabled ki/be kapcs
- security.mac.portacl.port_high a legnagyobb port amire a portacl védelmet nyújt
- security.mac.portacl.suser_exempt a root legyen kivétel
- security.mac.portacl.rules Itt megadhatunk szabályokat vesszővel elválasztva az alábbi forma szerint:
idtype:id:protocol:port //idtype: uid|gid, protocol: tcp|udp
Például engedjük meg a test1 usernek, hogy webszervert futtasson, de senki más ne tudjon Vegyük át a rendszertől a privilegizált portok kezelését:
[test1@homokozo ~]$ nc -l 80 nc: Operation not permitted
[root@homokozo ~]# sysctl net.inet.ip.portrange.reservedlow=0 net.inet.ip.portrange.reservedhigh=0 net.inet.ip.portrange.reservedlow: 0 -> 0 net.inet.ip.portrange.reservedhigh: 1023 -> 0
A security.mac.portacl.port_high alapból 1023. Ez az érték nekünk pont megfelel. Majd adjuk hozzá a megfelelő szabályokat:
[root@homokozo ~]# sysctl security.mac.portacl.rules=uid:1001:tcp:80 security.mac.portacl.rules: -> uid:1001:tcp:80
Az eredmény:
[test1@homokozo ~]$ nc -l 80 ^C
Megjegyzés:
[root@homokozo ~]# sysctl security.mac.portacl.suser_exempt=0 security.mac.portacl.suser_exempt: 1 -> 0 [root@homokozo ~]# nc -l 80 nc: Operation not permitted
Ilyenkor a root is beleesik a port_high szabályba, tehát ebben az esetben az első 1024 port le van tiltva mindenki számára, és csak a test1 felhasználó használhatja a 80as portot
1.2.2.5 MAC partition
Modul neve: mac_partition.ko\n Boot opció: mac_partition_load="YES" Kernel config: options MAC_PARTITION