RHCSA sērija: Obligāti piekļuves kontroles pamatprincipi ar SELinux RHEL 7 - 13. daļa


Šīs sērijas laikā mēs esam detalizēti izpētījuši vismaz divas piekļuves kontroles metodes: standarta ugo/rwx atļaujas (ACL konfigurēšana failu sistēmās - 7. daļa).

Lai gan tie ir nepieciešami kā pirmā līmeņa atļaujas un piekļuves kontroles mehānismi, tiem ir daži ierobežojumi, kurus novērš uzlabotā drošība Linux (īsumā saukta arī par SELinux).

Viens no šādiem ierobežojumiem ir tāds, ka lietotājs var pakļaut failu vai direktoriju drošības pārkāpumam, izmantojot slikti izstrādātu komandu chmod, un tādējādi izraisīt negaidītu piekļuves tiesību izplatīšanos. Rezultātā jebkurš šī lietotāja sāktais process var tikt darīts pēc saviem ieskatiem ar lietotājiem piederošajiem failiem, kur visbeidzot ļaunprātīga vai citādi apdraudēta programmatūra var sasniegt saknes līmeņa piekļuvi visai sistēmai.

Paturot prātā šos ierobežojumus, Amerikas Savienoto Valstu Nacionālā drošības aģentūra (NSA) vispirms izstrādāja elastīgu obligātu piekļuves kontroles metodi SELinux, lai ierobežotu procesu iespējas piekļūt vai veikt citas darbības ar sistēmas objektiem (piemēram, failiem, direktorijiem, tīkla portiem). utt.) uz mazāko atļauju modeli, kuru pēc vajadzības var modificēt vēlāk. Dažos vārdos katram sistēmas elementam tiek piešķirta tikai piekļuve, kas nepieciešama darbībai.

RHEL 7 SELinux ir iestrādāts pašā kodolā un pēc noklusējuma ir iespējots izpildes režīmā. Šajā rakstā mēs īsi izskaidrosim pamatjēdzienus, kas saistīti ar SELinux un tā darbību.

SELinux režīmi

SELinux var darboties trīs dažādos veidos:

  1. Izpilde: SELinux liedz piekļuvi, pamatojoties uz SELinux politikas noteikumiem, vadlīniju kopumu, kas kontrolē drošības motoru.
  2. Atļauts: SELinux nenoliedz piekļuvi, taču tiek reģistrēti atteikumi darbībām, kuras būtu liegtas, ja darbotos izpildes režīmā.
  3. Invalīdi (pašsaprotami).

Komanda getenforce parāda pašreizējo SELinux režīmu, turpretī setenforce (kam seko 1 vai 0) tiek izmantots, lai režīmā mainītu attiecīgi uz Enforcing vai Permissive. tikai pašreizējā sesija.

Lai panāktu noturību visā atteikšanās un atkārtotās palaišanas laikā, jums būs jārediģē fails /etc/selinux/config un SELINUX mainīgais jāiestata kā izpildošs, atļaujošs vai atspējots:

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

Parasti kā pirmo problēmu novēršanas soli izmantosiet setenforce, lai pārslēgtos starp SELinux režīmiem (piespiešana pieļaujošam un atpakaļ). Ja SELinux pašlaik ir iestatīts kā izpilde, kamēr rodas noteikta problēma, un tas pats izzūd, kad to iestatāt kā visatļautību, varat būt drošs, ka aplūkojat SELinux atļauju problēmu.

SELinux konteksti

SELinux konteksts sastāv no piekļuves kontroles vides, kurā lēmumi tiek pieņemti, pamatojoties uz SELinux lietotāju, lomu un veidu (un pēc izvēles arī līmeni):

  1. SELinux lietotājs papildina parasto Linux lietotāja kontu, piesaistot to SELinux lietotāja kontam, kas savukārt tiek izmantots SELinux kontekstā šīs sesijas procesiem, lai skaidri noteiktu viņu atļautās lomas un līmeņus.
  2. Lomas jēdziens darbojas kā starpnieks starp domēniem un SELinux lietotājiem, jo tas nosaka, kuriem procesu domēniem un failu tipiem var piekļūt. Tas pasargās jūsu sistēmu no neaizsargātības pret privilēģiju eskalācijas uzbrukumiem.
  3. Tips nosaka SELinux faila tipu vai SELinux procesa domēnu. Normālos apstākļos procesiem tiek liegta piekļuve failiem, kurus izmanto citi procesi, un piekļuve citiem procesiem, tādējādi piekļuve ir atļauta tikai tad, ja pastāv īpašs SELinux politikas noteikums, kas to atļauj.

Apskatīsim, kā tas viss darbojas, izmantojot šādus piemērus.

Sadaļā Secure SSH - 8. daļa mēs paskaidrojām, ka noklusējuma porta maiņa, kur klausās sshd, ir viens no pirmajiem drošības pasākumiem, lai aizsargātu jūsu serveri pret ārējiem uzbrukumiem. Rediģēsim failu /etc/ssh/sshd_config un iestatiet portu uz 9999:

Port 9999

Saglabājiet izmaiņas un restartējiet sshd:

# systemctl restart sshd
# systemctl status sshd

Kā redzat, sshd neizdevās sākt. Bet kas notika?

Ātra /var/log/audit/audit.log pārbaude norāda, ka sshd ir liegtas atļaujas sākt 9999 portā (SELinux žurnāla ziņojumos ir vārds “AVC”, lai tos varētu viegli identificēt. no citiem ziņojumiem), jo tas ir rezervēts JBoss pārvaldības pakalpojuma ports:

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

Šajā brīdī jūs varētu atspējot SELinux (bet nedariet!) Kā paskaidrots iepriekš, un mēģināt vēlreiz palaist sshd, un tam vajadzētu darboties. Tomēr semanage lietderība var mums pateikt, kas mums jāmaina, lai mēs varētu bez problēmām sākt sshd jebkurā izvēlētajā ostā.

Skriet,

# semanage port -l | grep ssh

lai iegūtu sarakstu ar ostām, kurās SELinux ļauj sshd klausīties.

Mainīsim portu /etc/ssh/sshd_config uz 9998 portu, pievienojiet portu kontekstā ssh_port_t un pēc tam restartējiet pakalpojumu:

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

Kā redzat, pakalpojums šoreiz tika veiksmīgi palaists. Šis piemērs ilustrē faktu, ka SELinux kontrolē TCP porta numuru atbilstoši sava porta tipa iekšējām definīcijām.

Šis ir piemērs, kā SELinux pārvalda procesu, piekļūstot citam procesam. Ja savā RHEL 7 serverī kopā ar Apache būtu jāievieš mod_security un mod_evasive, jums jāļauj vietnei httpd piekļūt sendmail, lai pēc (D) DoS uzbrukuma nosūtītu pasta paziņojumu. Šajā komandā izlaidiet karodziņu -P, ja nevēlaties, lai izmaiņas atkārtoti sāktu pastāvīgi.

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

Kā jūs varat pateikt no iepriekš minētā piemēra, SELinux būla iestatījumi (vai tikai booleans) ir patiesi/nepatiesi noteikumi, kas iegulti SELinux politikās. Varat uzskaitīt visus loģiskos parametrus ar semanage boolean -l un alternatīvi ievadīt to grep, lai filtrētu izvadi.

Pieņemsim, ka jūs apkalpojat statisku vietni, izmantojot citu direktoriju nekā noklusējuma (/var/www/html ), teiksim/websites (tas varētu notikt, ja savus tīmekļa failus glabājat piemēram, koplietojamā tīkla disks, un tas jāpiestiprina vietnē/websites).

a). Iekšpusē/vietnēs izveidojiet failu index.html ar šādu saturu:

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

Ja jūs to darāt,

# ls -lZ /websites/index.html

jūs redzēsiet, ka fails index.html ir apzīmēts ar default_t SELinux tipu, kuram Apache nevar piekļūt:

b). Mainiet DocumentRoot direktīvu mapē /etc/httpd/conf/httpd.conf uz/websites un neaizmirstiet atjaunināt atbilstošo direktoriju bloku. Pēc tam restartējiet Apache.

c). Pārlūkojiet līdz http:// , un jums jāsaņem 503 Aizliegta HTTP atbilde.

d). Pēc tam rekursīvi nomainiet etiķeti/websites uz httpd_sys_content_t veidu, lai piešķirtu Apache tikai lasīšanas piekļuvi šim direktorijam un tā saturam:

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

e). Visbeidzot, lietojiet d) izveidoto SELinux politiku:

# restorecon -R -v /websites

Tagad restartējiet Apache un pārlūkojiet vēlreiz http:// , un jūs redzēsiet, ka html fails tiek parādīts pareizi:

Kopsavilkums

Šajā rakstā mēs esam izgājuši SELinux pamatus. Ņemiet vērā, ka tēmas plašuma dēļ pilnīgs detalizēts paskaidrojums vienā rakstā nav iespējams, taču mēs uzskatām, ka šajā rokasgrāmatā izklāstītie principi palīdzēs jums pāriet uz progresīvākām tēmām, ja vēlaties to darīt.

Ja drīkstu, ļaujiet man ieteikt divus būtiskus resursus: RHEL 7 SELinux lietotāja un administratora rokasgrāmatu.

Nekautrējieties informēt mūs, ja jums ir kādi jautājumi vai komentāri.