Pakollisen kulunvalvonnan käyttöönotto SELinuxilla tai AppArmorilla Linuxissa


Yhdysvaltojen kansallinen turvallisuusvirasto (NSA) on suunnitellut joustavan pakollisen kulunvalvonnan (MAC) menetelmän voittamaan rajoitukset ja parantamaan ugo/rwx -käyttöoikeuksien ja kulunvalvontaluetteloiden tarjoamia suojausmekanismeja. SELinuxina (lyhenne sanoista Security Enhanced Linux), jotta rajoitettaisiin muun muassa prosessien kykyä käyttää tai suorittaa muita operaatioita järjestelmän objekteille (kuten tiedostoille, hakemistoille, verkkoportteille jne.) mahdollisimman vähäiseen lupaan, mutta silti mahdollista myöhemmin muutoksia tähän malliin.

Toinen suosittu ja yleisesti käytetty MAC on AppArmor, joka SELinuxin tarjoamien ominaisuuksien lisäksi sisältää oppimistilan, jonka avulla järjestelmä voi "oppia" tietyn sovelluksen käyttäytymisen ja asettaa rajoituksia määrittämällä profiileja sovellusten turvallista käyttöä varten.

CentOS 7: ssä SELinux on sisällytetty itse ytimeen ja se on oletusarvoisesti käytössä Enforcing-tilassa (tarkemmin tästä seuraavassa osassa) toisin kuin OpenSUSE ja Ubuntu, jotka käyttävät AppArmoria.

Tässä artikkelissa kerromme SELinuxin ja AppArmorin olennaisista osista ja siitä, miten yhtä näistä työkaluista voidaan hyödyttää valitsemastasi jakelusta riippuen.

Johdanto SELinuxiin ja miten sitä käytetään CentOS 7: ssä

Security Enhanced Linux voi toimia kahdella eri tavalla:

  1. Pakottaminen: SELinux kieltää pääsyn SELinux-käytäntösääntöjen perusteella, joukko ohjeita, jotka hallitsevat tietoturvamoduulia.
  2. Sallittu: SELinux ei estä pääsyä, mutta evästeet kirjataan toimille, jotka olisi evätty, jos ne suoritettaisiin valvontatilassa.

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 sivuuttaminen. Pidä se mielessä!

Näytä nykyinen SELinux-tila käyttämällä getenforce . Jos haluat vaihtaa käyttötilaa, käytä setenforce 0 (asettaaksesi sen arvoon Permissive) tai setenforce 1 (pakottaminen).

Koska tämä muutos ei selviä uudelleenkäynnistyksestä, sinun on muokattava/etc/selinux/config-tiedostoa ja asetettava SELINUX-muuttujaksi joko pakottava , salliva tai poistettu käytöstä pysyvyyden saavuttamiseksi uudelleenkäynnistyksissä:

Sivuhuomautuksessa, jos getenforce palauttaa Disabled-vaihtoehdon, sinun on muokattava tiedostoa/etc/selinux/config halutulla toimintatilalla ja käynnistettävä uudelleen. Muussa tapauksessa et voi asettaa (tai vaihtaa) toimintatilaa setenforce -toiminnolla.

Yksi tyypillisistä setenforce -käytöistä koostuu vaihtamisesta SELinux-tilojen välillä (pakottamisesta sallivaan tai päinvastoin) virheellisen toiminnan tai odotusten mukaisen sovelluksen vianmääritykseen. Jos se toimii sen jälkeen, kun olet asettanut SELinuxin sallivaan tilaan, voit olla varma, että tarkastelet SELinux-käyttöoikeusongelmaa.

Kaksi klassista tapausta, joissa meidän on todennäköisesti käsiteltävä SELinuxia, ovat:

  1. Oletusportin muuttaminen, kun daemon kuuntelee.
  2. DocumentRoot-käskyn asettaminen virtuaaliselle isännälle/var/www/html: n ulkopuolella.

Tarkastellaan näitä kahta tapausta seuraavien esimerkkien avulla.

Yksi ensimmäisistä asioista, joita useimmat järjestelmänvalvojat tekevät palvelintensa suojaamiseksi, on muuttaa porttia, jossa SSH-daemon kuuntelee, lähinnä kannustamaan porttiskannereita ja ulkoisia hyökkääjiä. Tätä varten käytämme porttidirektiiviä tiedostossa/etc/ssh/sshd_config, jota seuraa uusi porttinumero seuraavasti (käytämme tässä tapauksessa porttia 9999):

Port 9999

Yritettyä käynnistää palvelu uudelleen ja tarkistanut sen tila näemme, että se ei käynnistynyt:

# systemctl restart sshd
# systemctl status sshd

Jos katsomme /var/log/audit/audit.log, näemme, että SELinux esti sshd: n käynnistymästä portilta 9999, koska se on varattu portti JBoss Management -palvelulle (SELinux-lokiviesteissä on sana " AVC ”, jotta ne voidaan helposti tunnistaa muista viesteistä):

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

Tässä vaiheessa useimmat ihmiset todennäköisesti poistavat SELinuxin käytöstä, mutta me emme. Näemme, että SELinuxilla ja eri portilla kuuntelevilla sshd: llä on tapa elää sopusoinnussa yhdessä. Varmista, että policycoreutils-python-paketti on asennettu ja suoritettu:

# yum install policycoreutils-python

Voit tarkastella luetteloa porteista, joissa SELinux sallii sshd: n kuunnella. Seuraavassa kuvassa näkyy myös, että portti 9999 on varattu toiselle palvelulle, joten emme voi tällä hetkellä käyttää sitä toisen palvelun suorittamiseen:

# semanage port -l | grep ssh

Tietysti voisimme valita toisen portin SSH: lle, mutta jos olemme varmoja siitä, että meidän ei tarvitse käyttää tätä tiettyä laitetta mihinkään JBossiin liittyviin palveluihin, voimme sitten muokata olemassa olevaa SELinux-sääntöä ja osoittaa sen portin SSH: lle:

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

Sen jälkeen voimme käyttää ensimmäistä semanage-komentoa tarkistaaksesi, onko portti määritetty oikein, tai vaihtoehtoja -lC (lyhenne luettelon mukautetusta):

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

Voimme nyt käynnistää SSH: n uudelleen ja muodostaa yhteyden palveluun portilla 9999. Huomaa, että tämä muutos selviää uudelleenkäynnistyksestä.

Jos sinun on määritettävä Apache-virtuaaliasema käyttämällä muuta hakemistoa kuin/var/www/html DocumentRoot-tiedostona (sanokaa esimerkiksi/websrv/sites/gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Apache kieltäytyy tarjoamasta 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ä on todellakin SELinuxiin liittyvä ongelma:

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

Jos haluat muuttaa/websrv/sites/gabriel/public_html -tunnisteen rekursiivisesti muotoon httpd_sys_content_t , toimi seuraavasti:

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

Yllä oleva komento antaa Apachelle vain luku -oikeuden hakemistoon ja sen sisältöön.

Lopuksi voit soveltaa käytäntöä (ja tehdä tunnisteiden muutoksen voimaan välittömästi) seuraavasti:

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

Nyt sinun pitäisi pystyä käyttämään hakemistoa:

# wget http://localhost/index.html

Lisätietoja SELinuxista on Fedora 22: n SELinux- ja järjestelmänvalvojan oppaassa.