FreeBSD MAC

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen Josephus (vitalap | szerkesztései) 2006. október 9., 22:56-kor történt szerkesztése után volt.

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.

Személyes eszközök