FreeBSD MAC

A Unix/Linux szerverek üzemeltetése wikiből

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

tunefs -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 MAC SeeOtherUids

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

Module neve: mac_lomac.ko

Kernel config: options MAC_LOMAC

Boot opció: mac_lomac_load="YES"

A Lomac (Low-watermark) modul működése a Biba modullal megegyező, azonban mégis megengedi az alacsonyabb szinten helyezkedő objektumok olvasását. Az intergritás megőrzése érdekében az egyes subject-ek rendelkeznek egy ún. külső label értékkel, amit a label után [] zárójelekbe írnak. Ha szükségünk van egy alacsonyabb szinten levő objektum olvasására, a saját biztonsági szintünk megváltozik a [] -ben levő alacsonyabb értékű szintre, így megakadályozva a felsőbb szintekre írást.

Példa egy labelre:

# setfmac lomac/15[2]

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.

MLS teszt

$ getpmac
mls/5(5-5)
$ ls -lZ /dev/kmem
ls: /dev/kmem: Permission denied

Nem látjuk a magasabb szintén levő objektumokat

Ezután létrehozunk 3 tesztfile-t, az elsőnek 1-es a harmadiknak 10-es szintet adunk, és vizsgáljuk meg mit érünk el az 5. szintről

# echo s > test1; echo e > test2; echo x > test3
# getfmac test2
test: mls/equal
# setfmac mls/1 test1; setfmac mls/10 test3
# chown test1:test1 test?

Megfigyelés:

$ ls test?
ls: test3: Permission denied
test1   test2

Magasabb szintű objektumot nem láthatunk

Olvasás:

$ cat test?
s
e
cat: test3: Permission denied

Magasabb szintű objektumot nem is olvashatunk.

Write test:

$  echo 1 > test1
cannot create test1: Permission denied
$  echo 1 > test2
$  echo 1 > test3
$ cat test?
s
1
cat: test3: Permission denied
# cat test3
1

Írhatunk egyenlő, vagy magasabb szintre, de alacsonyabbra nem.

1.4 Zárszó

Amint az látható a FreeBSD elég sok megoldást kínál a MAC modell bevezetésére. Ha egy éles rendszeren próbálunk meg kísérletezni, a túlságosan bonyolult, sok tervezést igénylő megoldásokat kerülni kell(biba, mls, lomac). Valószínű emiatt sincs annyira elterjedve, pedig gondos tervezéssel gyakorlatilag sebezhetetlen rendszerek születhetnek. Ennek ellenére a lusta rendszergazda mindig a könnyebb utat választja (pf+jail). Remélem, hogy e rövid kedvcsinálónak sikerül pár vállalkozó kedvű admin figyelmét felkelteni, hiszen az egyszerűbb modulokat éles rendszereken is könnyen konfigurálni lehet

Írta: KOVACS Jozsef <jozsef.kovacs at huwico dot hu>

1.5 Potenciális zh-kérdések

  • Mi a Mandatory Access Control, és mi az előnye a DAC-cal szemben? Mi a hátránya?
  • Mire lehet használni a FreeBSD portacl MAC modulját?
Személyes eszközök