Serija RHCSA: Osnove obvezne kontrole pristupa sa SELinuxom u RHEL 7 - dio 13


Tijekom ove serije detaljno smo istražili najmanje dvije metode kontrole pristupa: standardne ugo/rwx dozvole (Upravljanje korisnicima i grupama – 3. dio) i popisi kontrole pristupa (Konfiguracija ACL-ova o sustavima datoteka – 7. dio).

Iako su neophodne kao dozvole prve razine i mehanizmi kontrole pristupa, one imaju neka ograničenja koja rješava Sigurnosno poboljšani Linux (skraćeno poznat kao SELinux).

Jedno od takvih ograničenja je da korisnik može izložiti datoteku ili direktorij sigurnosnim probojima kroz loše razrađenu naredbu chmod i time uzrokovati neočekivano širenje prava pristupa. Kao rezultat toga, svaki proces koji je pokrenuo taj korisnik može raditi što želi s datotekama u vlasništvu korisnika, gdje konačno zlonamjerni ili na drugi način ugroženi softver može ostvariti pristup na razini korijena cijelom sustavu.

Imajući ta ograničenja na umu, Agencija za nacionalnu sigurnost Sjedinjenih Država (NSA) prva je osmislila SELinux, fleksibilnu obaveznu metodu kontrole pristupa, kako bi ograničila sposobnost procesa da pristupe ili izvedu druge operacije na sistemskim objektima (kao što su datoteke, direktoriji, mrežni priključci, itd.) prema modelu najmanje dozvole, koji se kasnije može modificirati prema potrebi. U nekoliko riječi, svakom elementu sustava dan je samo pristup potreban za funkcioniranje.

U RHEL 7, SELinux je ugrađen u sam kernel i omogućen je u načinu Provođenje prema zadanim postavkama. U ovom ćemo članku ukratko objasniti osnovne koncepte povezane sa SELinuxom i njegovim radom.

SELinux načini rada

SELinux može raditi na tri različita načina:

  1. Provođenje: SELinux odbija pristup na temelju SELinux pravila pravila, skupa smjernica koje kontroliraju sigurnosni mehanizam.
  2. Permisivno: SELinux ne odbija pristup, ali odbijanja se bilježe za radnje koje bi bile odbijene da se izvode u načinu za provođenje.
  3. Onemogućeno (objašnjivo samo po sebi).

Naredba getenforce prikazuje trenutni način rada SELinuxa, dok je setenforce (nakon koje slijedi 1 ili 0) koristi se za promjenu načina rada u Provođenje ili Dopušteno, samo tijekom trenutne sesije.

Kako biste postigli postojanost tijekom odjava i ponovnih pokretanja, morat ćete urediti datoteku /etc/selinux/config i postaviti SELINUX varijablu na provođenje, dopušteno ili onemogućeno:

getenforce
setenforce 0
getenforce
setenforce 1
getenforce
cat /etc/selinux/config

Obično ćete koristiti setenforce za prebacivanje između SELinux načina rada (provođenje na permisivni i natrag) kao prvi korak u rješavanju problema. Ako je SELinux trenutno postavljen na provođenje dok imate određeni problem, a isto nestane kada ga postavite na dopušteno, možete biti sigurni da tražite kod problema s dozvolama za SELinux.

SELinux konteksti

SELinux kontekst sastoji se od okruženja kontrole pristupa u kojem se odluke donose na temelju SELinux korisnika, uloge i vrste (i po izboru razine):

  1. SELinux korisnik nadopunjuje redoviti Linux korisnički račun tako što ga preslikava na SELinux korisnički račun, koji se zauzvrat koristi u SELinux kontekstu za procese u toj sesiji, kako bi se eksplicitno definirale njihove dopuštene uloge i razine.
  2. Koncept uloge djeluje kao posrednik između domena i korisnika SELinuxa tako što definira kojim domenama procesa i vrstama datoteka se može pristupiti. Ovo će zaštititi vaš sustav od ranjivosti na napade eskalacije privilegija.
  3. Vrsta definira SELinux vrstu datoteke ili domenu SELinux procesa. Pod normalnim okolnostima, procesima je onemogućen pristup datotekama koje drugi procesi koriste i pristup drugim procesima, stoga je pristup dopušten samo ako postoji određeno pravilo politike SELinuxa koje to dopušta.

Pogledajmo kako sve to funkcionira kroz sljedeće primjere.

PRIMJER 1: Promjena zadanog porta za sshd demon

U Osiguranje SSH-a – 8. dio objasnili smo da je promjena zadanog porta na kojem sshd sluša jedna od prvih sigurnosnih mjera za zaštitu vašeg poslužitelja od vanjskih napada. Uredimo datoteku /etc/ssh/sshd_config i postavimo port na 9999:

Port 9999

Spremite promjene i ponovno pokrenite sshd:

systemctl restart sshd
systemctl status sshd

Kao što vidite, sshd se nije uspio pokrenuti. Ali što se dogodilo?

Brzi pregled /var/log/audit/audit.log pokazuje da su sshd-u uskraćene dozvole za pokretanje na portu 9999 (SELinux poruke dnevnika uključuju riječ “AVC” kako bi se mogli lako prepoznati iz drugih poruka) jer je to rezervirani port za uslugu JBoss Management:

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

U ovom trenutku možete onemogućiti SELinux (ali nemojte!) kao što je ranije objašnjeno i pokušati ponovno pokrenuti sshd i trebalo bi raditi. Međutim, uslužni program semanage može nam reći što trebamo promijeniti kako bismo mogli bez problema pokrenuti sshd na bilo kojem priključku koji odaberemo.

Trčanje,

semanage port -l | grep ssh

da biste dobili popis portova na kojima SELinux dopušta sshd slušanje.

Pa promijenimo port u /etc/ssh/sshd_config u Port 9998, dodajmo port u ssh_port_t kontekst, a zatim ponovo pokrenimo uslugu :

semanage port -a -t ssh_port_t -p tcp 9998
systemctl restart sshd
systemctl is-active sshd

Kao što vidite, usluga je ovaj put uspješno pokrenuta. Ovaj primjer ilustrira činjenicu da SELinux kontrolira broj TCP porta prema vlastitim internim definicijama tipa porta.

PRIMJER 2: Dopuštanje httpd-u da pošalje pristup sendmailu

Ovo je primjer kako SELinux upravlja procesom koji pristupa drugom procesu. Ako biste implementirali mod_security i mod_evasive zajedno s Apacheom na svom RHEL 7 poslužitelju, trebate dopustiti httpd da pristupi sendmail kako biste poslali obavijest poštom nakon (D)DoS napad. U sljedećoj naredbi izostavite oznaku -P ako ne želite da promjena bude postojana tijekom ponovnog pokretanja.

semanage boolean -1 | grep httpd_can_sendmail
setsebool -P httpd_can_sendmail 1
semanage boolean -1 | grep httpd_can_sendmail

Kao što možete zaključiti iz gornjeg primjera, SELinux Boolean postavke (ili samo Booleovi) su true/false pravila ugrađena u SELinux pravila. Možete ispisati sve booleove s semanage boolean -l, a alternativno ih usmjerite prema grep-u kako biste filtrirali izlaz.

PRIMJER 3: Posluživanje statične stranice iz imenika koji nije zadani

Pretpostavimo da poslužujete statičnu web stranicu koristeći drugačiji direktorij od zadanog (/var/www/html), recimo /web stranice (to bi mogao biti slučaj ako ponovno pohranjivanje vaših web datoteka u zajednički mrežni pogon, na primjer, i potrebno ga je montirati na /web stranice).

a). Stvorite datoteku index.html unutar /websites sa sljedećim sadržajem:

<html>
<h2>SELinux test</h2>
</html>

Ako to uradiš,

ls -lZ /websites/index.html

vidjet ćete da je datoteka index.html označena vrstom default_t SELinux kojoj Apache ne može pristupiti:

b). Promijenite direktivu DocumentRoot u /etc/httpd/conf/httpd.conf u /websites i ne zaboravite ažurirati odgovarajući blok imenika. Zatim ponovno pokrenite Apache.

c). Pregledajte http:// i trebali biste dobiti 503 Zabranjeni HTTP odgovor.

d). Zatim promijenite oznaku /websites, rekurzivno, u tip httpd_sys_content_t kako biste Apacheu dodijelili pristup samo za čitanje imenik i njegov sadržaj:

semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"

e). Konačno, primijenite SELinux pravilo kreirano u d):

restorecon -R -v /websites

Sada ponovno pokrenite Apache i ponovno potražite http:// i vidjet ćete ispravno prikazanu html datoteku:

Sažetak

U ovom smo članku prošli kroz osnove SELinuxa. Imajte na umu da zbog opsežnosti teme potpuno detaljno objašnjenje nije moguće u jednom članku, ali vjerujemo da će vam načela navedena u ovom vodiču pomoći da prijeđete na naprednije teme ako to želite.

Ako smijem, dopustite mi da preporučim dva bitna izvora za početak: NSA SELinux stranicu i RHEL 7 SELinux korisnički i administratorski vodič.

Ne ustručavajte se javiti nam ako imate pitanja ili komentara.