Implementación del control de acceso obligatorio con SELinux o AppArmor en Linux

Implementación del control de acceso obligatorio con SELinux o AppArmor en Linux

Para superar las limitaciones y aumentar los mecanismos de seguridad proporcionados por los permisos ugo/rwx estándar y las listas de control de acceso, la Agencia de Seguridad Nacional de los Estados Unidos. (NSA) ideó un Acceso obligatorio flexible Método de control. (MAC) conocido como SELinux. (abreviatura de Security Enhanced Linux. para restringir, entre otras cosas, la capacidad de los procesos para acceder o realizar otras operaciones en objetos del sistema (como archivos, directorios, puertos de red, etc.) con el menor permiso posible, sin dejar de permitir modificaciones posteriores a este modelo.

 SELinux y AppArmor Security Hardening Linux  SELinux y AppArmor Security Hardening Linux SELinux y AppArmor Security Hardening Linux

Otro MAC popular y ampliamente utilizado es AppArmor. que además de las funciones 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 el modo Enforcing. de forma predeterminada (más sobre esto en la siguiente sección), a diferencia de openSUSE. y Ubuntu. que usan 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.

Introducción a SELinux y cómo utilizarlo en CentOS 7

Security Enhanced Linux puede operar de dos formas diferentes:

  1. Hacer cumplir. SELinux niega el acceso basado en las reglas de política de SELinux, una conjunto de pautas que controlan el motor de seguridad.
  2. Permisivo. SELinux no niega el acceso, pero las denegaciones se registran para acciones que se habrían denegado si se ejecutaran en modo de aplicación.

freestar.config.enabled_slots.push

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. ¡Téngalo en cuenta!

Para mostrar el modo actual de SELinux. use getenforce. Si desea alternar el modo de operación, use setenforce 0 (para establecerlo en Permisivo. o setenforce 1 ( Enforcing. .

Dado que este cambio no sobrevivirá a un reinicio. deberá editar el archivo /etc/selinux/config. y configurar SELINUX. variable a forzar, permisiva o inhabilitada para lograr la persistencia en los reinicios:

Cómo habilitar y deshabilitar el modo SELinux  Cómo habilitar y deshabilitar el modo SELinux Cómo habilitar y deshabilitar el modo SELinux

En una nota al margen, si getenforce devuelve Disabled, tendrá que editar /etc/selinux/config. con el modo de operación y reiniciar. De lo contrario, no podrá configurar (o alternar) el modo de operación con setenforce.

Uno de los usos típicos de setenforce consiste en alternar entre los modos SELinux (de imponer. a permisivo. o al revés) para solucionar problemas de una aplicación que se está portando mal o no funciona como se esperaba. Si funciona después de configurar SELinux en modo permisivo. 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:

  1. Cambiar el puerto predeterminado donde escucha un demonio.
  2. Establecer la directiva DocumentRoot. para un host virtual fuera de /var/www/html.

Echemos un vistazo a estos dos casos usando los siguientes ejemplos.

EJEMPLO 1: Cambiar el puerto predeterminado para el demonio sshd

Una de las primeras cosas que hacen la mayoría de los administradores de sistemas para proteger sus servidores es cambiar el puerto donde escucha el demonio SSH, principalmente para desalentar los escáneres de puertos y atacantes externos. Para hacer esto, usamos la directiva Port en /etc/ssh/sshd_config. seguida 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 se pudo iniciar:

# systemctl restart sshd # systemctl status sshd  Verificar el estado del servicio SSH  Verificar el estado del servicio SSH Comprobar el estado del servicio SSH

Si echamos un vistazo a /var/log/audit/audit.log. lo haremos ver que se ha impedido que sshd. se inicie en p ort 9999. por SELinux. porque es un puerto reservado para el servicio JBoss Management. (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 | tail-1  Verificar registros de auditoría de Linux Verificar los registros de auditoría de Linux Verificar los registros de auditoría de Linux

En este punto, la mayoría de las personas probablemente deshabilitarían 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úrese de tener el paquete policycoreutils-python. instalado y ejecute:

# yum install policycoreutils-python

Para ver una lista de los puertos donde SELinux permite que sshd escuche. En la siguiente imagen también podemos ver que el 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 esta máquina específica para ningún servicio relacionado con JBoss, podemos modificar la regla SELinux existente y asignar ese puerto a SSH en su lugar:

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

Después de eso, podemos usar el primer comando semanage. para verificar si el puerto fue asignado correctamente, o el-lC ​​opciones (abreviatura de lista personalizada):

# semanage port-lC # semanage port-l | grep ssh  Asignar puerto a SSH Asignar puerto a SSH Asignar puerto a SSH

Ahora podemos reiniciar SSH y conectarnos al servicio usando el puerto 9999. Tenga en cuenta que este cambio sobrevivirá a un reinicio.

EJEMPLO 2: Elegir un DocumentRoot fuera de/var/www/html para un host virtual

Si necesita configurar un host virtual Apache usando un directorio que no sea /var/www/html. como DocumentRoot. (por ejemplo, /websrv/sites/gabriel/public_html. :

DocumentRoot “/websrv/sites/gabriel/public_html ”

Apache se negará a entregar el contenido porque el index.html. ha sido etiquetado con el tipo default_t SELinux. que Apache puede ‘ t acceso:

# wget http://localhost/index.html # ls-lZ/websrv/sites/gabriel/public_html/index.html  Etiquetado como default_t SELinux Type  Etiquetado como default_t SELinux Tipo Etiquetado como default_t SELinux Type

Como en el ejemplo anterior, puede usar el siguiente comando para verificar que se trata de un problema relacionado con SELinux:

# cat/var/log/audit/audit.log | grep AVC | tail-1  Verificar registros en busca de problemas con SELinux  Revisar registros para problemas de SELinux Revisar registros para problemas de SELinux

Para cambiar la etiqueta de /websrv/sites/gabriel/public_html. recursivamente a httpd_sys_content_t, haz:

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

El comando anterior le 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 inmediatamente), haga:

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

Ahora debería poder acceder al directorio:

# wget http://localhost/index.html  Acceder al directorio de Apache  Acceder al directorio de Apache Acceder al directorio de Apache

Para obtener más información sobre SELinux, consulte la guía del administrador y SELinux de Fedora 22.

Leave a comment

Your email address will not be published. Required fields are marked *