Implementering af obligatorisk adgangskontrol med SELinux eller AppArmor i Linux


For at overvinde begrænsningerne og øge sikkerhedsmekanismerne leveret af standard ugo/rwx tilladelser og lister over adgangskontrol udtænkte United States National Security Agency (NSA) en fleksibel obligatorisk adgangskontrolmetode (MAC) kendt som SELinux (forkortelse for Security Enhanced Linux) for blandt andet at begrænse processers evne til at få adgang til eller udføre andre operationer på systemobjekter (såsom filer, kataloger, netværksporte osv.) til mindst mulig tilladelse, mens det stadig er muliggør senere ændringer af denne model.

En anden populær og udbredt MAC er AppArmor, der ud over de funktioner, der leveres af SELinux, inkluderer en læringstilstand, der gør det muligt for systemet at "lære", hvordan en bestemt applikation opfører sig, og at sætte grænser ved at konfigurere profiler til sikker applikationsbrug.

I CentOS 7 er SELinux inkorporeret i selve kernen og er som standard aktiveret i Enforcing-tilstand (mere om dette i næste afsnit) i modsætning til openSUSE og Ubuntu, der bruger AppArmor.

I denne artikel forklarer vi det væsentlige ved SELinux og AppArmor, og hvordan du bruger et af disse værktøjer til din fordel, afhængigt af din valgte distribution.

Introduktion til SELinux og hvordan man bruger det på CentOS 7

Sikkerhedsforbedret Linux kan fungere på to forskellige måder:

  1. Håndhævelse: SELinux nægter adgang baseret på SELinux-politikregler, et sæt retningslinjer, der styrer sikkerhedsmotoren.
  2. Tilladelig: SELinux nægter ikke adgang, men benægtelser logges for handlinger, der ville være nægtet, hvis de kører i håndhævelsestilstand.

SELinux kan også deaktiveres. Selvom det ikke i sig selv er en driftstilstand, er det stadig en mulighed. At lære at bruge dette værktøj er dog bedre end bare at ignorere det. Husk det!

For at få vist den aktuelle tilstand af SELinux skal du bruge getenforce . Hvis du vil skifte driftstilstand, skal du bruge setenforce 0 (for at indstille den til Permissive) eller setenforce 1 (Enforcing).

Da denne ændring ikke overlever en genstart, skal du redigere/etc/selinux/config-filen og indstille SELINUX-variablen til enten håndhævelse , tilladelig eller deaktiveret for at opnå vedholdenhed på tværs af genstart:

På en sidebemærkning, hvis getenforce returnerer Disabled, skal du redigere/etc/selinux/config med den ønskede driftstilstand og genstarte. Ellers vil du ikke være i stand til at indstille (eller skifte) driftstilstand med setenforce .

En af de typiske anvendelser af setenforce består i at skifte mellem SELinux-tilstande (fra håndhævelse til tilladelig eller omvendt) for at foretage fejlfinding af et program, der ikke fungerer korrekt eller ikke fungerer som forventet. Hvis det virker, efter at du har indstillet SELinux til Tilladelig tilstand, kan du være sikker på at du ser på et SELinux-tilladelsesproblem.

To klassiske tilfælde, hvor vi sandsynligvis bliver nødt til at beskæftige os med SELinux er:

  1. Ændring af standardporten, hvor en dæmon lytter.
  2. Indstilling af DocumentRoot-direktivet for en virtuel vært uden for/var/www/html.

Lad os se på disse to tilfælde ved hjælp af følgende eksempler.

En af de første ting, som de fleste systemadministratorer gør for at sikre deres servere, er at ændre porten, hvor SSH-dæmonen lytter, mest for at modvirke havnescannere og eksterne angribere. For at gøre dette bruger vi havnedirektivet i/etc/ssh/sshd_config efterfulgt af det nye portnummer som følger (vi bruger port 9999 i dette tilfælde):

Port 9999

Efter at have forsøgt at genstarte tjenesten og kontrollere dens status, ser vi, at den ikke kunne starte:

# systemctl restart sshd
# systemctl status sshd

Hvis vi ser på /var/log/audit/audit.log, vil vi se, at sshd blev forhindret i at starte på port 9999 af SELinux, fordi det er en reserveret port til JBoss Management-tjenesten (SELinux-logmeddelelser inkluderer ordet “ AVC ”, så de let kan identificeres fra andre beskeder):

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

På dette tidspunkt ville de fleste sandsynligvis deaktivere SELinux, men det gør vi ikke. Vi vil se, at der er en måde, hvorpå SELinux og sshd lytter i en anden port for at leve i harmoni sammen. Sørg for, at du har policycoreutils-python-pakken installeret og kørt:

# yum install policycoreutils-python

For at se en liste over de porte, hvor SELinux tillader sshd at lytte på. I det følgende billede kan vi også se, at port 9999 var reserveret til en anden tjeneste, og derfor kan vi ikke bruge den til at køre en anden tjeneste indtil videre:

# semanage port -l | grep ssh

Naturligvis kunne vi vælge en anden port til SSH, men hvis vi er sikre på, at vi ikke behøver at bruge denne specifikke maskine til nogen JBoss-relaterede tjenester, kan vi derefter ændre den eksisterende SELinux-regel og tildele den port til SSH i stedet:

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

Derefter kan vi bruge den første semanage-kommando til at kontrollere, om porten blev tildelt korrekt, eller indstillingerne -lC (forkortelse for listen tilpasset):

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

Vi kan nu genstarte SSH og oprette forbindelse til tjenesten ved hjælp af port 9999. Bemærk, at denne ændring overlever en genstart.

Hvis du har brug for at oprette en virtuel Apache-vært ved hjælp af en anden mappe end/var/www/html som DocumentRoot (sig f.eks./Websrv/sites/gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Apache nægter at servere indholdet, fordi index.html er mærket med standard_t SELinux-typen, som Apache ikke kan få adgang til:

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

Som med det foregående eksempel kan du bruge følgende kommando til at kontrollere, at dette virkelig er et SELinux-relateret problem:

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

For at ændre etiketten på/websrv/sites/gabriel/public_html rekursivt til httpd_sys_content_t , skal du gøre følgende:

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

Ovenstående kommando giver Apache skrivebeskyttet adgang til denne mappe og dens indhold.

Endelig skal du: for at anvende politikken (og gøre etiketændringen effektiv med det samme):

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

Nu skal du være i stand til at få adgang til biblioteket:

# wget http://localhost/index.html

For mere information om SELinux henvises til Fedora 22 SELinux og administratorvejledningen.