Implementació del control d'accés obligatori amb SELinux o AppArmor a Linux


Per superar les limitacions i augmentar els mecanismes de seguretat que proporcionen els permisos estàndard ugo/rwx i les llistes de control d'accés, l'Agència de Seguretat Nacional (NSA) dels Estats Units va idear un mètode flexible de control d'accés obligatori (MAC) conegut. com SELinux (abreviatura de Security Enhanced Linux) per tal de restringir, entre altres coses, la capacitat dels processos d'accedir o realitzar altres operacions en objectes del sistema (com fitxers, directoris, ports de xarxa, etc.) al mínim permís possible, tot i que encara permetent modificacions posteriors a aquest model.

Un altre MAC popular i molt utilitzat és AppArmor, que a més de les funcions que ofereix SELinux, inclou un mode d'aprenentatge que permet al sistema \aprendre com es comporta una aplicació específica i establir límits configurant perfils per a un ús segur de l'aplicació. .

A CentOS 7, SELinux s'incorpora al propi nucli i està habilitat en mode Enforcing de manera predeterminada (més sobre això a la següent secció), a diferència d'openSUSE i Ubuntu que utilitzen AppArmor.

En aquest article explicarem els aspectes bàsics de SELinux i AppArmor i com utilitzar una d'aquestes eines per al vostre benefici en funció de la distribució que trieu.

Introducció a SELinux i com utilitzar-lo a CentOS 7

Security Enhanced Linux pot funcionar de dues maneres diferents:

  1. Aplicació: SELinux denega l'accés en funció de les regles de la política de SELinux, un conjunt de directrius que controlen el motor de seguretat.
  2. Permisiu: SELinux no nega l'accés, però es registren denegacions d'accions que s'haurien denegat si s'executés en mode d'aplicació.

SELinux també es pot desactivar. Tot i que no és un mode de funcionament en si, no deixa de ser una opció. Tanmateix, aprendre a utilitzar aquesta eina és millor que ignorar-la. Tingueu-ho en compte!

Per mostrar el mode actual de SELinux, utilitzeu getenforce. Si voleu canviar el mode d'operació, utilitzeu setenforce 0 (per establir-lo com a Permissiu) o setenforce 1 (Aplicació).

Com que aquest canvi no sobreviurà a un reinici, haureu d'editar el fitxer /etc/selinux/config i establir la variable SELINUX com a enforcing, permissive o >desactivat per aconseguir la persistència en els reinicis:

A banda, si getenforce torna Desactivat, haureu d'editar /etc/selinux/config amb el mode de funcionament desitjat i reiniciar. En cas contrari, no podreu establir (o canviar) el mode de funcionament amb setenforce.

Un dels usos típics de setenforce consisteix a canviar entre els modes SELinux (d'aplicar a permissiu o al revés) per solucionar problemes d'una aplicació que es comporta malament o no funciona com s'esperava. Si funciona després d'haver configurat SELinux en mode Permissiu, podeu estar segur que esteu mirant un problema de permisos de SELinux.

Dos casos clàssics on molt probablement haurem de tractar amb SELinux són:

  1. Canviant el port predeterminat on un dimoni escolta.
  2. Configuració de la directiva DocumentRoot per a un host virtual fora de /var/www/html.

Fem una ullada a aquests dos casos utilitzant els exemples següents.

Una de les primeres coses que fan la majoria dels administradors de sistemes per protegir els seus servidors és canviar el port on escolta el dimoni SSH, sobretot per dissuadir els escàners de ports i els atacants externs. Per fer-ho, utilitzem la directiva Port a /etc/ssh/sshd_config seguida del nou número de port de la manera següent (utilitzarem el port 9999 en aquest cas):

Port 9999

Després d'intentar reiniciar el servei i comprovar el seu estat, veurem que no s'ha pogut iniciar:

# systemctl restart sshd
# systemctl status sshd

Si fem una ullada a /var/log/audit/audit.log, veurem que SELinux va impedir que sshd s'iniciés al port 9999 perquè aquest és un port reservat per al servei de gestió de JBoss (els missatges de registre de SELinux inclouen la paraula AVC” perquè es puguin identificar fàcilment a partir d'altres missatges):

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

En aquest punt, la majoria de la gent probablement desactivaria SELinux, però nosaltres no. Veurem que hi ha una manera perquè SELinux i sshd escoltin en un port diferent, visquin en harmonia junts. Assegureu-vos que teniu el paquet policycoreutils-python instal·lat i executat:

# yum install policycoreutils-python

Per veure una llista dels ports on SELinux permet que sshd escolti. A la imatge següent també podem veure que el port 9999 estava reservat per a un altre servei i, per tant, no el podem utilitzar per executar un altre servei de moment:

# semanage port -l | grep ssh

Per descomptat, podríem triar un altre port per a SSH, però si estem segurs que no haurem d'utilitzar aquesta màquina específica per a cap servei relacionat amb JBoss, llavors podem modificar la regla de SELinux existent i assignar aquest port a SSH:

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

Després d'això, podem utilitzar la primera ordre semanage per comprovar si el port s'ha assignat correctament, o les opcions -lC (abreviatura de llista personalitzada):

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

Ara podem reiniciar SSH i connectar-nos al servei mitjançant el port 9999. Tingueu en compte que aquest canvi sobreviurà a un reinici.

Si necessiteu configurar un host virtual Apache utilitzant un directori diferent de /var/www/html com a DocumentRoot (per exemple, /websrv/sites/gabriel/public_html):

DocumentRoot “/websrv/sites/gabriel/public_html”

Apache es negarà a publicar el contingut perquè index.html s'ha etiquetat amb el tipus SELinux default_t, al qual Apache no pot accedir:

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

Com amb l'exemple anterior, podeu utilitzar l'ordre següent per verificar que realment es tracta d'un problema relacionat amb SELinux:

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

Per canviar l'etiqueta de /websrv/sites/gabriel/public_html recursivament a httpd_sys_content_t, feu el següent:

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

L'ordre anterior permetrà a Apache accés de només lectura a aquest directori i al seu contingut.

Finalment, per aplicar la política (i fer que el canvi d'etiqueta sigui efectiu immediatament), feu el següent:

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

Ara hauríeu de poder accedir al directori:

# wget http://localhost/index.html

Per obtenir més informació sobre SELinux, consulteu la guia de l'administrador i SELinux de Fedora 22.