Pakollisen pääsynhallinnan käyttöönotto SELinuxilla tai AppArmorilla Linuxissa
Yhdysvaltain kansallinen turvallisuusvirasto (NSA) kehitti joustavan ugo/rwx
-käyttöoikeuksien ja kulunvalvontaluetteloiden tarjoamien rajoitusten poistamiseksi ja niiden turvamekanismien lisäämiseksi.Pakollinen pääsynhallinta (MAC) -menetelmä, joka tunnetaan nimellä SELinux (lyhenne sanoista Security Enhanced Linux), jolla pyritään muun muassa rajoittamaan prosessien kykyä käyttää tai suorittaa muita toimintoja järjestelmäobjekteihin (kuten tiedostoihin, hakemistoihin, verkkoportteihin jne.) mahdollisimman pienillä oikeuksilla, mutta sallien kuitenkin tämän mallin myöhemmät muutokset.
Toinen suosittu ja laajalti käytetty MAC on AppArmor, joka sisältää SELinuxin ominaisuuksien lisäksi oppimistilan, jonka avulla järjestelmä voi "oppia". ” miten tietty sovellus käyttäytyy, ja asettaa rajoituksia määrittämällä profiileja turvallista sovellusten käyttöä varten.
CentOS 7:ssä SELinux on sisällytetty itse ytimeen ja se on oletuksena käytössä Pakotus-tilassa (lisätietoja seuraavassa osiossa). toisin kuin openSUSE ja Ubuntu, jotka käyttävät AppArmoria.
Tässä artikkelissa selitämme SELinuxin ja AppArmorin olennaiset ominaisuudet ja kuinka voit käyttää jotakin näistä työkaluista eduksesi riippuen valitsemastasi jakelusta.
SELinuxin esittely ja sen käyttäminen CentOS 7:ssä
Security Enhanced Linux voi toimia kahdella eri tavalla:
- Pakottaminen: SELinux estää pääsyn SELinuxin käytäntösääntöjen perusteella, jotka ovat turvallisuusmoottoria ohjaavia ohjeita.
- Sallittava: SELinux ei estä pääsyä, mutta estot kirjataan toimiin, jotka olisi evätty, jos niitä olisi suoritettu pakottavassa tilassa.
SELinux voidaan myös poistaa käytöstä. Vaikka se ei ole itse toimintatila, se on silti vaihtoehto. Tämän työkalun käytön oppiminen on kuitenkin parempi kuin vain jättää se huomiotta. Pidä se mielessä!
Voit näyttää SELinuxin nykyisen tilan käyttämällä getenforcea
. Jos haluat vaihtaa toimintatilaa, käytä setenforce 0
(asettaaksesi sen arvoon Permissive) tai setenforce 1
(Pakottaa) vahva>).
Koska tämä muutos ei kestä uudelleenkäynnistystä, sinun on muokattava /etc/selinux/config-tiedostoa ja asetettava SELINUX-muuttujaksi jompikumpi pakottaa
, salliva
tai pois käytöstä
, jotta saavutetaan pysyvyys uudelleenkäynnistysten aikana:
Sivuhuomautuksena on, että jos getenforce
palauttaa Disabled, sinun on muokattava /etc/selinux/config haluamallasi toimintatilalla ja käynnistettävä uudelleen. Muuten et voi asettaa (tai vaihtaa) toimintatilaa setenforce
-komennolla.
Yksi setenforcen
tyypillisistä käyttötavoista on vaihtaminen SELinux-tilojen välillä (pakottamisesta sallivaan tai päinvastoin) sovelluksen vianmääritykseen. toimii väärin tai ei toimi odotetulla tavalla. Jos se toimii sen jälkeen, kun olet asettanut SELinuxin Permissive-tilaan, voit olla varma, että kyseessä on SELinuxin käyttöoikeusongelma.
Kaksi klassista tapausta, joissa joudumme todennäköisesti käsittelemään SELinuxia, ovat:
- Oletusportin muuttaminen, jossa demoni kuuntelee.
- DocumentRoot-direktiivin asettaminen virtuaaliselle isännälle /var/www/html-tiedoston ulkopuolella.
Tarkastellaan näitä kahta tapausta seuraavien esimerkkien avulla.
ESIMERKKI 1: sshd-daemonin oletusportin muuttaminen
Yksi ensimmäisistä asioista, joita useimmat järjestelmänvalvojat tekevät suojatakseen palvelimiaan, on vaihtaa porttia, jossa SSH-daemon kuuntelee, lähinnä porttien skannerien ja ulkoisten hyökkääjien estämiseksi. Käytämme tätä varten porttidirektiiviä tiedostossa /etc/ssh/sshd_config ja sen jälkeen uutta porttinumeroa seuraavasti (tässä tapauksessa käytämme porttia 9999):
Port 9999
Kun olet yrittänyt käynnistää palvelun uudelleen ja tarkistanut sen tilan, näemme, että se ei käynnistynyt:
systemctl restart sshd
systemctl status sshd
Jos tarkastelemme tiedostoa /var/log/audit/audit.log, huomaamme, että sshd estettiin käynnistymästä portissa 9999. SELinux, koska se on varattu portti JBoss Management -palvelulle (SELinux-lokiviestit sisältävät sanan "AVC", jotta ne voisivat olla helposti tunnistettu muista viesteistä):
cat /var/log/audit/audit.log | grep AVC | tail -1
Tässä vaiheessa useimmat ihmiset todennäköisesti poistaisivat SELinuxin käytöstä, mutta me emme. Tulemme näkemään, että SELinuxilla ja eri portissa kuuntelevalla sshd:llä on tapa elää harmoniassa yhdessä. Varmista, että policycoreutils-python-paketti on asennettu ja suorita:
yum install policycoreutils-python
Voit tarkastella luetteloa porteista, joissa SELinux sallii sshd:n kuunnella. Seuraavassa kuvassa näkyy myös, että portti 9999 oli varattu toiselle palvelulle, joten emme voi käyttää sitä toistaiseksi toisen palvelun suorittamiseen:
semanage port -l | grep ssh
Voisimme tietysti valita toisen portin SSH:lle, mutta jos olemme varmoja, että meidän ei tarvitse käyttää tätä konetta mihinkään JBossiin liittyviin palveluihin, voimme sitten muokata olemassa olevaa SELinux-sääntöä ja määrittää sen portin SSH:lle sen sijaan:
semanage port -m -t ssh_port_t -p tcp 9999
Sen jälkeen voimme käyttää ensimmäistä semanage-komentoa tarkistaaksemme, onko portti määritetty oikein, tai vaihtoehtoja -lC
(lyhenne sanoista list custom):
semanage port -lC
semanage port -l | grep ssh
Voimme nyt käynnistää SSH:n uudelleen ja muodostaa yhteyden palveluun portin 9999 kautta. Huomaa, että tämä muutos kestää uudelleenkäynnistyksen.
ESIMERKKI 2: DocumentRootin valitseminen /var/www/html-tiedoston ulkopuolella virtuaaliselle isännälle
Jos sinun on määritettävä Apache-virtuaalinen isäntä käyttämällä muuta hakemistoa kuin /var/www/html DocumentRootina (esimerkiksi /websrv/sites /gabriel/public_html):
DocumentRoot “/websrv/sites/gabriel/public_html”
Apache kieltäytyy toimittamasta sisältöä, koska index.html on merkitty default_t SELinux -tyypillä, jota Apache ei voi käyttää:
wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html
Kuten edellisessä esimerkissä, voit käyttää seuraavaa komentoa varmistaaksesi, että tämä todellakin on SELinuxiin liittyvä ongelma:
cat /var/log/audit/audit.log | grep AVC | tail -1
Voit muuttaa /websrv/sites/gabriel/public_html-tunnisteen rekursiivisesti muotoon httpd_sys_content_t
seuraavasti:
semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"
Yllä oleva komento antaa Apachelle vain luku -oikeuden kyseiseen hakemistoon ja sen sisältöön.
Lopuksi voit ottaa käytännön käyttöön (ja ottaa tarran muutoksen voimaan välittömästi) seuraavasti:
restorecon -R -v /websrv/sites/gabriel/public_html
Nyt sinun pitäisi päästä käsiksi hakemistoon:
wget http://localhost/index.html
Lisätietoja SELinuxista on Fedora 22 SELinux and Administrator -oppaassa.