Izvajanje obveznega nadzora dostopa s SELinuxom ali AppArmorjem v Linuxu


Da bi premagali omejitve in povečali varnostne mehanizme, ki jih zagotavljajo standardna dovoljenja ugo/rwx in seznami za nadzor dostopa, je ameriška Nacionalna varnostna agencija (NSA) oblikovala prožno metodo obveznega nadzora dostopa (MAC), ki je znana kot SELinux (okrajšava za Security Enhanced Linux), da med drugim na najmanjše možno dovoljenje omeji zmožnost procesov za dostop ali izvajanje drugih operacij na sistemskih objektih (kot so datoteke, imeniki, omrežna vrata itd.) kar omogoča poznejše spremembe tega modela.

Drug priljubljen in pogosto uporabljen MAC je AppArmor, ki poleg funkcij, ki jih ponuja SELinux, vključuje tudi način učenja, ki sistemu omogoča, da se "nauči", kako se določena aplikacija obnaša, in določi omejitve s konfiguriranjem profilov za varno uporabo aplikacije. .

V CentOS 7 je SELinux vključen v samo jedro in je privzeto omogočen v načinu uveljavljanja (več o tem v naslednjem poglavju), v nasprotju z openSUSE in Ubuntu, ki uporabljata AppArmor.

V tem članku bomo razložili bistve SELinux in AppArmor ter kako uporabiti eno od teh orodij v svojo korist, odvisno od izbrane distribucije.

Uvod v SELinux in kako ga uporabljati na CentOS 7

Linux z izboljšano varnostjo lahko deluje na dva različna načina:

  1. Izvrševanje: SELinux zavrne dostop na podlagi pravil pravil SELinux, nabora smernic, ki nadzorujejo varnostni mehanizem.
  2. Dovoljeno: SELinux ne zavrne dostopa, vendar se zabeležijo zavrnitve za dejanja, ki bi bila zavrnjena, če bi se izvajala v načinu uveljavljanja.

SELinux je lahko tudi onemogočen. Čeprav sam ni način delovanja, še vedno obstaja možnost. Vendar je učenje tega orodja boljše kot le ignoriranje. Ne pozabite!

Če želite prikazati trenutni način SELinux, uporabite getenforce . Če želite preklopiti način delovanja, uporabite setenforce 0 (če ga želite nastaviti na Permissive) ali setenforce 1 (Enforcing).

Ker ta sprememba ne bo preživela ponovnega zagona, boste morali urediti datoteko/etc/selinux/config in spremenljivko SELINUX nastaviti na prisilno , permissive ali onemogočeno , da dosežemo obstojnost pri ponovnem zagonu:

V stranski opombi, če getenforce vrne Disabled, boste morali urediti/etc/selinux/config z želenim načinom delovanja in znova zagnati. V nasprotnem primeru ne boste mogli nastaviti (ali preklopiti) načina delovanja z setenforce .

Ena od tipičnih načinov uporabe setenforce je preklapljanje med načini SELinux (od uveljavljanja do permisivnega ali obratno) za odpravljanje težav s programom, ki ne deluje pravilno ali ne deluje po pričakovanjih. Če deluje, ko nastavite SELinux na način Permissive, ste lahko prepričani, da iščete težavo z dovoljenji SELinux.

Dva klasična primera, ko se bomo najverjetneje morali spoprijeti s SELinuxom, sta:

  1. Spreminjanje privzetih vrat, na katerih posluša demon.
  2. Nastavitev direktive DocumentRoot za navideznega gostitelja zunaj/var/www/html.

Oglejmo si ta dva primera na naslednjih primerih.

Ena prvih stvari, ki jih večina sistemskih skrbnikov naredi, da bi zaščitila svoje strežnike, je spremeniti vrata, kjer posluša demon SSH, predvsem zato, da odvrne optične bralnike vrat in zunanje napadalce. Za to uporabimo direktivo Port v/etc/ssh/sshd_config, ki ji sledi nova številka vrat (v tem primeru bomo uporabili vrata 9999):

Port 9999

Po poskusu ponovnega zagona storitve in preverjanju njenega stanja bomo videli, da se ni uspela zagnati:

# systemctl restart sshd
# systemctl status sshd

Če pogledamo /var/log/audit/audit.log, bomo videli, da je sshd na vratih 9999 preprečil zagon SELinux, ker so to rezervirana vrata za storitev upravljanja JBoss (sporočila dnevnika SELinux vključujejo besedo » AVC «, tako da jih je mogoče zlahka prepoznati iz drugih sporočil):

# cat /var/log/audit/audit.log | grep AVC | tail -1

V tem trenutku bi večina ljudi verjetno onemogočila SELinux, mi pa ne. Videli bomo, da lahko SELinux in sshd, ki poslušajo na drugih vratih, živijo v harmoniji. Prepričajte se, da imate nameščen in zagnan paket policycoreutils-python:

# yum install policycoreutils-python

Če si želite ogledati seznam vrat, kjer SELinux omogoča sshd, da posluša. Na naslednji sliki lahko vidimo tudi, da je bilo pristanišče 9999 rezervirano za drugo storitev, zato ga za zdaj ne moremo uporabiti za zagon druge storitve:

# semanage port -l | grep ssh

Seveda bi lahko izbrali druga vrata za SSH, če pa smo prepričani, da nam tega posebnega računalnika ne bo treba uporabljati za storitve, povezane z JBoss, lahko spremenimo obstoječe pravilo SELinux in namesto tega ta vrata dodelimo SSH:

# semanage port -m -t ssh_port_t -p tcp 9999

Po tem lahko s prvim ukazom za semanage preverimo, ali so bila vrata pravilno dodeljena, ali možnosti -lC (okrajšava za seznam po meri):

# semanage port -lC
# semanage port -l | grep ssh

Zdaj lahko znova zaženemo SSH in se povežemo s storitvijo prek vrat 9999. Upoštevajte, da bo ta sprememba preživela ponovni zagon.

Če morate nastaviti virtualni gostitelj Apache z uporabo imenika, ki ni/var/www/html kot DocumentRoot (recimo, na primer/websrv/sites/gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Apache zavrne prikazovanje vsebine, ker je index.html označen s privzeto vrsto SELinux, do katere Apache ne more dostopati:

# wget http://localhost/index.html
# ls -lZ /websrv/sites/gabriel/public_html/index.html

Kot pri prejšnjem primeru lahko tudi z naslednjim ukazom preverite, ali gre res za težavo, povezano s SELinuxom:

# cat /var/log/audit/audit.log | grep AVC | tail -1

Če želite rekurzivno spremeniti oznako/websrv/sites/gabriel/public_html v httpd_sys_content_t , naredite:

# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

Zgornji ukaz bo Apacheju omogočil dostop samo za branje do tega imenika in njegove vsebine.

Nazadnje, če želite uporabiti politiko (in takoj spremeniti oznako):

# restorecon -R -v /websrv/sites/gabriel/public_html

Zdaj bi morali imeti dostop do imenika:

# wget http://localhost/index.html

Za več informacij o SELinuxu glejte Fedora 22 SELinux in skrbniški vodnik.