FreeBSD MAC
Tartalomjegyzék |
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 bash
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" >> /boot/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 MAC 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
Boot opció: mac_partition_load="YES"
Kernel config: options MAC_PARTITION
A modul segítségével procecsseiket partíciókra oszthatjuk. Minden partíció csak a saját processzeit láthatja. A processek partíció label-jének beállításához használjuk a
# setpmac partition/10 bash
parancsot, ami indítani fog egy bash shellt a 10es partíción
[root@homokozo ~]# ps Zaux LABEL USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND partition/10 root 538 0.0 1.6 3096 1992 v0 S 11:01PM 0:00.20 bash partition/10 root 655 0.0 0.7 1340 860 v0 R+ 11:59PM 0:00.03 ps Za
Látható, hogy a partícionálás nem függ a felhasználótól, hiszen ezen kívül számos root process is még fut. Ha kombináljuk a mac_seenootheruids modullal, további finomításokat érhetünk el.
Megjegyzés: a root label ez esetben is kivétel.
1.2.2.6 MAC Multi-Level Security
Modul neve: mac_mls.ko
Kernel config: options MAC_MLS
Boot opció: mac_mls_load="YES" Az MLS biztosági modul az első olyan MAC modul ahol a labelekkel definiálhatunk a subjejct-ek és object-ek közi adatáramlást valamilyen secucrity modell szerint. Ez úgy történik, hogy minden label-ben egy biztonsági szint számot írunk, a számok helyett természetesen használhatjuk a FreeBSD-ben alapértelmezettként definiált high, low, equal értékeket.
- Az mls/low címkével jelölt objektumok a hierarchia legalacsonyabb szintjét képviselik, gyakorlatilag nem férnek hozzá a nála magasabb szinttel rendelkező objektutmokhoz, és a nála magasabb objektumok nem tudnak információt juttatni az alacsonyabb szintekre.
- Az mls/equal gyakorlatilag egy kivételkezelés a policy alól
- Az mls/high labellel jelöltt objektumok a legnagyobb szintet képviselik, gyakorlatilag hozzáférnek minden más objektumhoz, de információt nem tudnak nekik juttatni.
Ezek a gyakorlatban úgy jelennek meg, hogy egy subject olvashatja a vele egyszintű, vagy nála alacsonyabb szintű object-eket, írás joga pedig csak a vele egyező illetve magasabb szintű objektumokhoz lehet. A modell lényege, hogy megakadályozza az felsőbb szintről információ szivárogtatást az alsó biztonsági szintekre.
Természetesen itt is van lehetőség néhány sysctl változó állítására:
- security.mac.mls.enabled MLS policy ki/be kapcs
- security.mac.mls.ptys_equal pty(4) eszközt mls/equal címkével lát el létrehozásukkor
- security.mac.mls.revocation_enabled ha egy objektum szintje alacsonyabbra változik vonjunk meg az elérést
- security.mac.mls.max_compartments is used to set the maximum number of compartment levels with objects; basically the maximum compartment number allowed on a system.
Az egyes objektumokat a setfmac mls/high <object> paranccsal címkézhetjük fel, a getfmac paranccsal pedig lekérdezhetjük a címkéket. Ezek felett lehetőségünk van egy ún. policy fileból beolvasni az egyes értékeket.
1.2.2.7 MAC Biba modul
Modul neve: mac_biba.ko
Kernel config: options MAC_BIBA
Boot opció: mac_biba_load="YES"
A Biba biztonsági modell működési elve hasonlít az MLS-éhez, azzal az egy különbséggel, hogy itt az információ megendegett áramlása az egyes biztonsági szintek közt teljesen fordított. A modell elve, hogy megakadályozzuk az érzékeny adatok móosítását. Az alacsonyabb szintű objektumok nem írhatják a magasabb szintű objektumokat, és a magasabb szintű objektumok nem olvashatják a náluk alacsonyabb biztonsági szinten elhelyezkedő objektumokat.
Haszálat:
# setfmac biba/low test # getfmac test test: biba/low
Az alábbi sysctl változók itt is a rendelkezésünkre állnak, működésük azonban néhányn esetben fordított:
- security.mac.biba.enabled modul ki/be kapcs
- security.mac.biba.ptys_equal Biba policy kikapcsolása a pty(4) eszközökön
- security.mac.biba.revocation_enabled Ha az objektum biztonsági szintje magasabb lesz, tiltsuk le az elérést.
1.2.2.8 MAC LoMAC modul
FIXME
1.3 Egy összetett példa
Először is hozzunk létre egy új login classt ahova pakolni fogjuk a nem biztonságos felhasználóinkat:
Az /etc/login.conf -ba illesszük a következőket:
insecure:\
:copyright=/etc/COPYRIGHT:\ :welcome=/etc/motd:\ :setenv=MAIL=/var/mail/$,BLOCKSIZE=K:\ :path=~/bin /bin /usr/bin /usr/local/bin:\ :manpath=/usr/share/man /usr/local/man:\ :nologin=/var/run/nologin:\ :cputime=1h30m:\ :datasize=8M:\ :vmemoryuse=100M:\ :stacksize=2M:\ :memorylocked=4M:\ :memoryuse=8M:\ :filesize=8M:\ :coredumpsize=8M:\ :openfiles=24:\ :maxproc=32:\ :priority=0:\ :requirehome:\ :passwordtime=90d:\ :umask=002:\ :ignoretime@:\ :label=partition/13,mls/5:
Majd futtassuk le a cap_mkdb /etc/login.conf parancsot hogy a login.conf-ból elkészüljön a rendszer által használt adatbázis.
Tegyük át a test1 felhasználót az insecure login classba.
[root@homokozo ~]# pw user mod test1 -L insecure
Ha még nem tettük meg engedélyezzük a filerenddszerünkön a multilabel módot, ezt single user módba bootolva tehetjük meg a következő módon:
# tunefs -l enable / tunefs: multilabel set
A beállításokat természetesen minden használni kívánt partíción el kell végezni.