RHCSA serija: privalomos prieigos kontrolės pagrindai naudojant SELinux RHEL 7 – 13 dalis


Šios serijos metu mes išsamiai išnagrinėjome bent du prieigos kontrolės metodus: standartinius ugo/rwx leidimus (tvarkyti naudotojus ir grupes – 3 dalis) ir prieigos kontrolės sąrašus (konfigūruoti ACL). apie failų sistemas – 7 dalis).

Nors būtini kaip pirmojo lygio leidimai ir prieigos kontrolės mechanizmai, jie turi tam tikrų apribojimų, į kuriuos atsižvelgiama naudojant patobulintą „Linux“ saugą (trumpiau dar vadinamą SELinux).

Vienas iš tokių apribojimų yra tai, kad vartotojas gali pažeisti failą ar katalogą dėl prastai parengtos komandos chmod ir taip netikėtai išplatinti prieigos teises. Dėl to bet koks to vartotojo pradėtas procesas gali daryti kaip nori su vartotojui priklausančiais failais, kur galiausiai kenkėjiška ar kitaip pažeista programinė įranga gali pasiekti šakninio lygio prieigą prie visos sistemos.

Atsižvelgdama į šiuos apribojimus, Jungtinių Valstijų nacionalinio saugumo agentūra (NSA) pirmą kartą sukūrė SELinux – lankstų privalomą prieigos kontrolės metodą, kad apribotų procesų galimybė pasiekti arba atlikti kitas operacijas su sistemos objektais (pvz., failais, katalogais, tinklo prievadais ir t. t.) pagal mažiausio leidimo modelį, kurį vėliau prireikus galima modifikuoti. Žodžiu, kiekvienam sistemos elementui suteikiama tik funkcija, reikalinga prieiga.

RHEL 7 SELinux yra įtraukta į patį branduolį ir pagal numatytuosius nustatymus įgalinta Įvertinimo režimu. Šiame straipsnyje trumpai paaiškinsime pagrindines sąvokas, susijusias su SELinux ir jo veikimu.

SELinux režimai

SELinux gali veikti trimis skirtingais būdais:

  1. Įgyvendinimas: SELinux neleidžia pasiekti, remdamasi SELinux politikos taisyklėmis – saugos variklį valdančių gairių rinkiniu.
  2. Leidžiama: SELinux nedraudžia prieigos, tačiau užregistruojami atmetimai dėl veiksmų, kurie būtų buvę uždrausti, jei būtų vykdomi priverstinio režimo.
  3. Išjungta (savaime suprantama).

Komanda getenforce rodo dabartinį SELinux režimą, o setenforce (po kurio yra 1 arba 0) yra naudojamas tik dabartinės sesijos metu pakeisti režimą į Įgaliojantis arba Leidžiamasis.

Jei norite, kad atsijungimai ir perkrovimai būtų nuolatiniai, turėsite redaguoti failą /etc/selinux/config ir nustatyti SELINUX kintamąjį į įgaliojantį arba leidžiantį arba išjungta:

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

Paprastai kaip pirmąjį trikčių šalinimo veiksmą naudosite setenforce, kad perjungtumėte tarp SELinux režimų (įgaliojantį į leistiną ir atgal). Jei šiuo metu SELinux nustatytas kaip įtikinti, kol susiduriate su tam tikra problema, o tas pats išnyksta, kai nustatote leistiną, galite būti tikri, kad ieškote iškilus SELinux leidimų problemai.

SELinux kontekstai

SELinux kontekstą sudaro prieigos valdymo aplinka, kurioje sprendimai priimami remiantis SELinux vartotoju, vaidmeniu ir tipu (ir pasirinktinai lygiu):

  1. SELinux vartotojas papildo įprastą Linux vartotojo abonementą, susiedamas jį su SELinux vartotojo abonementu, kuris savo ruožtu naudojamas SELinux kontekste tos sesijos procesams, siekiant aiškiai apibrėžti leidžiamus vaidmenis ir lygius.
  2. Vaidmens sąvoka veikia kaip tarpininkas tarp domenų ir SELinux vartotojų, nes apibrėžia, kuriuos proceso domenus ir failų tipus galima pasiekti. Tai apsaugos jūsų sistemą nuo pažeidžiamumo dėl privilegijų eskalavimo atakų.
  3. Tipas apibrėžia SELinux failo tipą arba SELinux proceso domeną. Įprastomis aplinkybėmis procesams neleidžiama pasiekti failų, kuriuos naudoja kiti procesai, ir prieiti prie kitų procesų, todėl prieiga leidžiama tik tuo atveju, jei egzistuoja tam tikra SELinux politikos taisyklė, kuri tai leidžia.

Pažiūrėkime, kaip visa tai veikia per šiuos pavyzdžius.

1 PAVYZDYS: numatytojo sshd demono prievado keitimas

SSH apsauga – 8 dalis paaiškinome, kad numatytojo prievado, kuriame klausosi sshd, pakeitimas yra viena iš pirmųjų saugos priemonių, skirtų apsaugoti serverį nuo išorinių atakų. Redaguokite /etc/ssh/sshd_config failą ir nustatykime prievadą į 9999:

Port 9999

Išsaugokite pakeitimus ir iš naujo paleiskite sshd:

systemctl restart sshd
systemctl status sshd

Kaip matote, sshd nepavyko paleisti. Bet kas atsitiko?

Greitas /var/log/audit/audit.log patikrinimas rodo, kad sshd nebuvo leista paleisti 9999 prievado (SELinux žurnalo pranešimuose yra žodis „AVC“, kad juos būtų galima lengvai atpažinti iš kitų pranešimų), nes tai yra rezervuotas prievadas JBoss valdymo paslaugai:

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

Šiuo metu galite išjungti SELinux (bet ne!), kaip paaiškinta anksčiau, ir bandyti iš naujo paleisti sshd, ir tai turėtų veikti. Tačiau semanage programa gali mums pasakyti, ką turime pakeisti, kad galėtume be problemų paleisti sshd bet kuriame pasirinktame prievade.

Bėk,

semanage port -l | grep ssh

Norėdami gauti prievadų, kuriuose SELinux leidžia klausytis sshd, sąrašą.

Taigi pakeiskime prievadą /etc/ssh/sshd_config į prievadą 9998, pridėkite prievadą prie ssh_port_t konteksto ir paleiskite paslaugą iš naujo :

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

Kaip matote, šį kartą paslauga buvo pradėta sėkmingai. Šis pavyzdys iliustruoja faktą, kad SELinux valdo TCP prievado numerį pagal savo prievado tipo vidinius apibrėžimus.

2 PAVYZDYS: Leidžiama httpd siųsti prieigą sendmail

Tai pavyzdys, kaip SELinux valdo procesą, pasiekiantį kitą procesą. Jei savo RHEL 7 serveryje įdiegėte mod_security ir mod_evasive kartu su Apache, turite leisti httpd pasiekti sendmail, kad išsiųstumėte pranešimą el. paštu po (D)DoS ataka. Šioje komandoje praleiskite žymą -P, jei nenorite, kad pakeitimas būtų nuolatinis perkrovimo metu.

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

Kaip galite suprasti iš anksčiau pateikto pavyzdžio, SELinux loginiai nustatymai (arba tiesiog loginiai parametrai) yra teisingos/klaidingos taisyklės, įterptos į SELinux politiką. Visus loginius parametrus galite išvardyti naudodami semanage boolean -l arba įvesti jį į grep, kad filtruotumėte išvestį.

3 PAVYZDYS: statinės svetainės aptarnavimas iš kito katalogo nei numatytasis

Tarkime, kad aptarnaujate statinę svetainę naudodami kitą katalogą nei numatytasis (/var/www/html), tarkime /websites (taip gali būti, jei pvz., iš naujo saugoti žiniatinklio failus bendrame tinklo diske ir juos reikia prijungti adresu /websites).

a). Sukurkite index.html failą /websites su tokiu turiniu:

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

Jei darai,

ls -lZ /websites/index.html

pamatysite, kad failas index.html buvo pažymėtas default_t SELinux tipu, kurio „Apache“ negali pasiekti:

b). Pakeiskite DocumentRoot direktyvą /etc/httpd/conf/httpd.conf į /websites ir nepamirškite atnaujinti atitinkamo katalogo bloko. Tada iš naujo paleiskite „Apache“.

c). Naršykite adresu http://<žiniatinklio serverio IP adresas> ir turėtumėte gauti 503 uždraustas HTTP atsakymą.

d). Tada rekursyviai pakeiskite /websites etiketę į httpd_sys_content_t tipą, kad suteiktumėte „Apache“ tik skaitymo prieigą. katalogas ir jo turinys:

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

e). Galiausiai taikykite SELinux politiką, sukurtą d):

restorecon -R -v /websites

Dabar iš naujo paleiskite „Apache“ ir dar kartą naršykite į http://<žiniatinklio serverio IP adresas> ir pamatysite teisingai rodomą html failą:

Santrauka

Šiame straipsnyje apžvelgėme SELinux pagrindus. Atminkite, kad dėl temos platumo viename straipsnyje neįmanoma pateikti išsamaus išsamaus paaiškinimo, tačiau manome, kad šiame vadove išdėstyti principai padės pereiti prie sudėtingesnių temų, jei to norėsite.

Jei galiu, leiskite man rekomenduoti du pagrindinius išteklius, nuo kurių pradėti: NSA SELinux puslapį ir RHEL 7 SELinux vartotojo ir administratoriaus vadovą.

Nedvejodami praneškite mums, jei turite klausimų ar komentarų.