Implementering av obligatorisk tilgangskontroll med SELinux eller AppArmor i Linux


For å overvinne begrensningene til og øke sikkerhetsmekanismene gitt av standard ugo/rwx-tillatelser og tilgangskontrolllister, utviklet United States National Security Agency (NSA) en fleksibel Obligatorisk tilgangskontroll (MAC) metode kjent som SELinux (forkortelse for Security Enhanced Linux) for å begrense blant annet prosessens evne til å få tilgang til eller utfør andre operasjoner på systemobjekter (som filer, kataloger, nettverksporter osv.) med minst mulig tillatelse, samtidig som det er mulig for senere modifikasjoner av denne modellen.

En annen populær og mye brukt MAC er AppArmor, som i tillegg til funksjonene som tilbys av SELinux, inkluderer en læringsmodus som lar systemet «lære ” hvordan en spesifikk applikasjon oppfører seg, og å sette grenser ved å konfigurere profiler for sikker applikasjonsbruk.

I CentOS 7 er SELinux integrert i selve kjernen og er aktivert i Enforcing-modus som standard (mer om dette i neste avsnitt), i motsetning til openSUSE og Ubuntu som bruker AppArmor.

I denne artikkelen vil vi forklare det vesentlige av SELinux og AppArmor og hvordan du bruker et av disse verktøyene til din fordel avhengig av din valgte distribusjon.

Introduksjon til SELinux og hvordan du bruker det på CentOS 7

Security Enhanced Linux kan fungere på to forskjellige måter:

  1. Håndheving: SELinux nekter tilgang basert på SELinux policyregler, et sett med retningslinjer som kontrollerer sikkerhetsmotoren.
  2. Tillatende: SELinux nekter ikke tilgang, men avslag logges for handlinger som ville blitt nektet hvis de kjørte i håndhevingsmodus.

SELinux kan også deaktiveres. Selv om det ikke er en driftsmodus i seg selv, er det fortsatt et alternativ. Men å lære å bruke dette verktøyet er bedre enn å bare ignorere det. Husk på!

For å vise gjeldende modus for SELinux, bruk getenforce. Hvis du vil veksle mellom operasjonsmodus, bruk setenforce 0 (for å sette den til Tillatende) eller setenforce 1 (Enforcing sterk>).

Siden denne endringen ikke vil overleve en omstart, må du redigere /etc/selinux/config-filen og sette SELINUX-variabelen til enten håndhever, tillatende eller deaktivert for å oppnå utholdenhet ved omstart:

Hvis getenforce returnerer Disabled, må du redigere /etc/selinux/config med ønsket driftsmodus og starte på nytt. Ellers vil du ikke kunne stille inn (eller bytte) operasjonsmodus med setenforce.

En av de typiske bruksområdene for setenforce består i å veksle mellom SELinux-moduser (fra håndhevende til tillatelse eller omvendt) for å feilsøke et program som oppfører seg dårlig eller ikke fungerer som forventet. Hvis det fungerer etter at du har satt SELinux til Tillatende-modus, kan du være sikker på at du ser på et problem med SELinux-tillatelser.

To klassiske tilfeller der vi mest sannsynlig må forholde oss til SELinux er:

  1. Endre standardporten der en demon lytter på.
  2. Angi DocumentRoot-direktivet for en virtuell vert utenfor /var/www/html.

La oss ta en titt på disse to tilfellene ved å bruke følgende eksempler.

EKSEMPEL 1: Endre standardporten for sshd-demonen

Noe av det første de fleste systemadministratorer gjør for å sikre serverne sine, er å endre porten der SSH-demonen lytter på, mest for å motvirke portskannere og eksterne angripere. For å gjøre dette bruker vi portdirektivet i /etc/ssh/sshd_config etterfulgt av det nye portnummeret som følger (vi bruker port 9999 i dette tilfellet):


Port 9999

Etter å ha forsøkt å starte tjenesten på nytt og sjekke statusen, vil vi se at den ikke kunne starte:


systemctl restart sshd
systemctl status sshd

Hvis vi tar en titt på /var/log/audit/audit.log, vil vi se at sshd ble forhindret fra å starte på port 9999 av SELinux fordi det er en reservert port for JBoss Management-tjenesten (SELinux-loggmeldinger inkluderer ordet “AVC” slik at de kan være enkle identifisert fra andre meldinger):


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

På dette tidspunktet ville nok de fleste deaktivert SELinux, men vi vil ikke. Vi vil se at det er en måte for SELinux, og sshd-lytting på en annen port, å leve i harmoni sammen. Sørg for at du har pakken policycoreutils-python installert og kjør:


yum install policycoreutils-python

For å se en liste over portene der SELinux lar sshd lytte på. I det følgende bildet kan vi også se at port 9999 var reservert for en annen tjeneste, og derfor kan vi ikke bruke den til å kjøre en annen tjeneste foreløpig:


semanage port -l | grep ssh

Selvfølgelig kan vi velge en annen port for SSH, men hvis vi er sikre på at vi ikke trenger å bruke denne spesifikke maskinen for noen JBoss-relaterte tjenester, kan vi endre den eksisterende SELinux-regelen og tilordne den porten til SSH i stedet:


semanage port -m -t ssh_port_t -p tcp 9999

Etter det kan vi bruke den første semanage-kommandoen for å sjekke om porten ble riktig tildelt, eller -lC-alternativene (forkortelse for list custom):


semanage port -lC
semanage port -l | grep ssh

Vi kan nå starte SSH på nytt og koble til tjenesten ved hjelp av port 9999. Merk at denne endringen VIL overleve en omstart.

EKSEMPEL 2: Velge en DocumentRoot utenfor /var/www/html for en virtuell vert

Hvis du trenger å konfigurere en virtuell Apache-vert ved å bruke en annen katalog enn /var/www/html som DocumentRoot (f.eks. /websrv/sites /gabriel/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

Apache vil nekte å vise innholdet fordi index.html har blitt merket med default_t SELinux-typen, som Apache ikke har tilgang til:


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

Som med forrige eksempel kan du bruke følgende kommando for å bekrefte at dette virkelig er et SELinux-relatert problem:


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

For å endre etiketten for /websrv/sites/gabriel/public_html rekursivt til httpd_sys_content_t, gjør du:


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

Kommandoen ovenfor vil gi Apache skrivebeskyttet tilgang til den katalogen og dens innhold.

Til slutt, for å bruke retningslinjene (og gjøre etikettendringen gjeldende umiddelbart), gjør du:


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

Nå skal du få tilgang til katalogen:


wget http://localhost/index.html

For mer informasjon om SELinux, se Fedora 22 SELinux og administratorveiledningen.