Superar las limitaciones y aumentar los mecanismos de seguridad proporcionados por los estándares ugo / rwx
permisos y listas de control de acceso, la Agencia de Seguridad Nacional de los Estados Unidos (NSA) ideó un flexible Control de acceso obligatorio (MAC) método conocido como SELinux (corto para Linux con seguridad mejorada) para restringir, entre otras cosas, la capacidad de los procesos para acceder o realizar otras operaciones en los objetos del sistema (como archivos, directorios, puertos de red, etc.) con el menor permiso posible, sin dejar de permitir modificaciones posteriores a este modelo.
Otro MAC popular y ampliamente utilizado es AppArmor, que además de las características proporcionadas por SELinux, incluye un modo de aprendizaje que permite al sistema "aprender”Cómo se comporta una aplicación específica y establecer límites mediante la configuración de perfiles para un uso seguro de la aplicación.
En CentOS 7, SELinux está incorporado en el propio kernel y está habilitado en
Hacer cumplir modo por defecto (más sobre esto en la siguiente sección), a diferencia de openSUSE y Ubuntu que uso AppArmor.En este artículo explicaremos los conceptos básicos de SELinux y AppArmor y cómo utilizar una de estas herramientas para su beneficio según la distribución que elija.
Security Enhanced Linux puede funcionar de dos formas diferentes:
SELinux también se puede desactivar. Aunque no es un modo de funcionamiento en sí mismo, sigue siendo una opción. Sin embargo, aprender a usar esta herramienta es mejor que simplemente ignorarla. ¡Tenlo en mente!
Para mostrar el modo actual de SELinux, utilizar getenforce
. Si desea alternar el modo de operación, use setenforce 0
(ponerlo en Permisivo) o setenforce 1
(Hacer cumplir).
Dado que este cambio no sobrevivirá reiniciar, necesitará editar el /etc/selinux/config archivo y establezca el SELINUX variable a cualquiera hacer cumplir
, permisivo
, o desactivado
para lograr la persistencia en los reinicios:
En una nota al margen, si getenforce
devuelve Disabled, tendrás que editar /etc/selinux/config con el modo de funcionamiento deseado y reinicie. De lo contrario, no podrá configurar (o alternar) el modo de funcionamiento con setenforce
.
Uno de los usos típicos de setenforce
consiste en alternar entre los modos SELinux (desde hacer cumplir para permisivo o al revés) para solucionar problemas de una aplicación que se está comportando mal o que no funciona como se esperaba. Si funciona después de configurar SELinux en Permisivo modo, puede estar seguro de que está viendo un problema de permisos de SELinux.
Dos casos clásicos en los que probablemente tendremos que lidiar con SELinux son:
Echemos un vistazo a estos dos casos utilizando los siguientes ejemplos.
Una de las primeras cosas que hacen la mayoría de los administradores de sistemas para proteger sus servidores es cambiar el puerto en el que escucha el demonio SSH, principalmente para desalentar a los escáneres de puertos y a los atacantes externos. Para hacer esto, usamos la directiva Port en /etc/ssh/sshd_config seguido del nuevo número de puerto de la siguiente manera (usaremos el puerto 9999 en este caso):
Puerto 9999.
Después de intentar reiniciar el servicio y comprobar su estado veremos que no pudo iniciarse:
# systemctl reinicia sshd. # systemctl status sshd.
Si echamos un vistazo a /var/log/audit/audit.log, veremos eso sshd se le impidió arrancar en el puerto 9999 por SELinux porque ese es un puerto reservado para el Gestión de JBoss servicio (los mensajes de registro de SELinux incluyen la palabra "AVC" para que puedan identificarse fácilmente en otros mensajes):
# cat /var/log/audit/audit.log | grep AVC | cola -1.
En este punto, la mayoría de la gente probablemente inhabilitaría SELinux pero no lo haremos. Veremos que hay una manera de que SELinux, y sshd escuchando en un puerto diferente, vivan en armonía juntos. Asegúrate de tener el policycoreutils-python paquete instalado y ejecutado:
# yum instala policycoreutils-python.
Para ver una lista de los puertos en los que SELinux permite que sshd escuche. En la siguiente imagen también podemos ver ese puerto 9999 estaba reservado para otro servicio y, por lo tanto, no podemos usarlo para ejecutar otro servicio por el momento:
# semanage port -l | grep ssh.
Por supuesto, podríamos elegir otro puerto para SSH, pero si estamos seguros de que no necesitaremos usar este puerto específico máquina para cualquier servicio relacionado con JBoss, podemos modificar la regla SELinux existente y asignar ese puerto a SSH en lugar de:
# puerto semanage -m -t ssh_port_t -p tcp 9999.
Después de eso, podemos usar el primer semanage comando para comprobar si el puerto se asignó correctamente, o el -lC
opciones (abreviatura de lista personalizada):
# puerto semanage -lC. # semanage port -l | grep ssh.
Ahora podemos reiniciar SSH y conectarnos al servicio usando el puerto 9999. Tenga en cuenta que este cambio sobrevivirá a un reinicio.
Si lo necesitas configurar un host virtual Apache usando un directorio que no sea /var/www/html como Raiz del documento (digamos, por ejemplo, /websrv/sites/gabriel/public_html):
DocumentRoot “/ websrv / sites / gabriel / public_html”
Apache se negará a servir el contenido porque el index.html ha sido etiquetado con el default_t SELinux tipo, al que Apache no puede acceder:
# wget http://localhost/index.html. # ls -lZ /websrv/sites/gabriel/public_html/index.html.
Al igual que con el ejemplo anterior, puede utilizar el siguiente comando para verificar que se trata de un problema relacionado con SELinux:
# cat /var/log/audit/audit.log | grep AVC | cola -1.
Para cambiar la etiqueta de /websrv/sites/gabriel/public_html recursivamente a httpd_sys_content_t
, hacer:
# semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"
El comando anterior otorgará a Apache acceso de solo lectura a ese directorio y su contenido.
Finalmente, para aplicar la política (y hacer que el cambio de etiqueta sea efectivo de inmediato), haga lo siguiente:
# restorecon -R -v / websrv / sites / gabriel / public_html.
Ahora debería poder acceder al directorio:
# wget http://localhost/index.html.
Para obtener más información sobre SELinux, consulte Fedora 22 SELinux y guía del administrador.