Guía para principiantes de SELinux


Se preparó una traducción del artículo para los estudiantes del curso de seguridad de Linux.




SELinux o Security Enhanced Linux es un mecanismo de control de acceso avanzado desarrollado por la Agencia de Seguridad Nacional de los Estados Unidos (NSA) para evitar intrusiones maliciosas. Implementa un modelo de control de acceso forzado (u obligatorio) (Ing. Control de acceso obligatorio, MAC) sobre el modelo discrecional (o selectivo) existente (Ing. Control de acceso discrecional, DAC), es decir, permisos para leer, escribir, ejecutar.


SELinux tiene tres modos:


  1. Cumplimiento : denegación de acceso según las reglas de la política.
  2. Permisivo : acciones de registro que violan las políticas que estarían prohibidas en el modo obligatorio.
  3. Deshabilitado : deshabilita SELinux por completo.

Por defecto, la configuración está en /etc/selinux/config


Cambio de modos SELinux


Para averiguar el modo actual, ejecute


 $ getenforce 

Para cambiar el modo a permisivo, ejecute el siguiente comando


 $ setenforce 0 

o, para cambiar el modo de permisivo a obligatorio , hacer


 $ setenforce 1 

Si necesita deshabilitar completamente SELinux, esto solo se puede hacer a través del archivo de configuración


 $ vi /etc/selinux/config 

Para deshabilitar, cambie el parámetro SELINUX de la siguiente manera:


 SELINUX=disabled 

Configuración de SELinux


Cada archivo y proceso está marcado con un contexto SELinux, que contiene información adicional como usuario, rol, tipo, etc. Si es la primera vez que habilita SELinux, primero debe configurar el contexto y las etiquetas. El proceso de etiquetado y contexto se conoce como etiquetado. Para comenzar a marcar, en el archivo de configuración, cambie el modo a permisivo .


 $ vi /etc/selinux/config SELINUX=permissive 

Después de configurar el modo permisivo , cree un archivo oculto vacío llamado autorelabel en la raíz


 $ touch /.autorelabel 

y reinicie la computadora


 $ init 6 

Nota: utilizamos el modo permisivo para marcar, porque el uso del modo forzado puede provocar el bloqueo del sistema durante el reinicio.


No se preocupe si la descarga se atasca en algún archivo, el marcado lleva algún tiempo. Después de marcar e iniciar su sistema, puede ir al archivo de configuración y configurar el modo de ejecución , así como ejecutar:


 $ setenforce 1 

Ahora ha habilitado con éxito SELinux en su computadora.


Monitorear registros


Es posible que tenga algún tipo de error al marcar o mientras el sistema se estaba ejecutando. Para verificar si su SELinux funciona correctamente y si no bloquea el acceso a ningún puerto, aplicación, etc., debe mirar los registros. El registro de SELinux se encuentra en /var/log/audit/audit.log , pero no necesita leerlo por completo para encontrar errores. Puede usar audit2why para encontrar errores. Ejecute el siguiente comando:


 $ audit2why < /var/log/audit/audit.log 

Como resultado, obtienes una lista de errores. Si no hubo errores en el registro, no se mostrarán mensajes.


Configurar la política de SELinux


Una política de SELinux es un conjunto de reglas que guían la seguridad de SELinux. Una política define un conjunto de reglas para un entorno particular. Ahora aprenderemos cómo configurar políticas para permitir el acceso a servicios restringidos.


1. Valores lógicos (interruptores)


Los conmutadores (booleanos) le permiten cambiar partes de una política mientras trabaja, sin la necesidad de crear nuevas políticas. Le permiten realizar cambios sin reiniciar o volver a compilar las políticas de SELinux.


Ejemplo
Supongamos que queremos compartir el directorio de inicio del usuario a través de FTP para leer y escribir, y ya lo hemos compartido, pero cuando intentamos acceder, no vemos nada. Esto se debe a que la política de SELinux prohíbe que el servidor FTP lea y escriba en el directorio de inicio del usuario. Necesitamos cambiar la política para que el servidor FTP pueda acceder a los directorios principales. Veamos si hay algún cambio para esto haciendo


 $ semanage boolean -l 

Este comando mostrará una lista de interruptores disponibles con su estado actual (encendido / encendido o apagado / apagado) y descripción. Puede refinar su búsqueda agregando grep para encontrar solo resultados relacionados con ftp:


 $ semanage boolean -l | grep ftp 

y encuentra lo siguiente


 ftp_home_dir -> off Allow ftp to read & write file in user home directory 

Este interruptor está desactivado, así que lo habilitaremos con setsebool $ setsebool ftp_home_dir on


Ahora nuestro demonio ftp podrá acceder al directorio de inicio del usuario.
Nota: también puede obtener una lista de modificadores disponibles sin descripción haciendo getsebool -a


2. Etiquetas y contexto


Esta es la forma más común de implementar políticas SELinux. Cada archivo, carpeta, proceso y puerto está marcado con un contexto SELinux:


  • Para los archivos y carpetas, las etiquetas se almacenan como atributos extendidos en el sistema de archivos y se pueden ver con el siguiente comando:
     $ ls -Z /etc/httpd 
  • Para procesos y puertos, el núcleo controla el marcado y puede ver estas etiquetas de la siguiente manera:

el proceso


 $ ps –auxZ | grep httpd 

puerto


 $ netstat -anpZ | grep httpd 

Ejemplo
Ahora veamos un ejemplo para comprender mejor las etiquetas y el contexto. Supongamos que tenemos un servidor web que /var/www/html/ /home/dan/html/ lugar del directorio /var/www/html/ /home/dan/html/ . SELinux considerará esto como una violación de la política y es posible que no pueda navegar por sus páginas web. Esto se debe a que no hemos configurado el contexto de seguridad asociado con los archivos HTML. Para ver el contexto de seguridad predeterminado, use el siguiente comando:


 $ ls –lz /var/www/html -rw-r—r—. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/ 

Aquí tenemos httpd_sys_content_t como contexto para los archivos html. Necesitamos establecer este contexto de seguridad para nuestro directorio actual, que ahora tiene el siguiente contexto:


 -rw-r—r—. dan dan system_u:object_r:user_home_t:s0 /home/dan/html/ 

Comando alternativo para verificar el contexto de seguridad de un archivo o directorio:


 $ semanage fcontext -l | grep '/var/www' 

También usaremos semanage para cambiar el contexto después de encontrar el contexto de seguridad correcto. Para cambiar el contexto de / home / dan / html, ejecute los siguientes comandos:


 $ semanage fcontext -a -t httpd_sys_content_t '/home/dan/html(/.*)?' $ semanage fcontext -l | grep '/home/dan/html' /home/dan/html(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 $ restorecon -Rv /home/dan/html 

Después de cambiar el contexto usando semanage, el comando restorecon cargará el contexto predeterminado para archivos y directorios. Nuestro servidor web ahora podrá leer archivos de la carpeta /home/dan/html , ya que el contexto de seguridad de esta carpeta se ha cambiado a httpd_sys_content_t .


3. Crear políticas locales


Puede haber situaciones en las que los métodos anteriores son inútiles para usted y obtiene errores (avc / negación) en audit.log. Cuando esto sucede, debe crear una política local. Puede encontrar todos los errores con audit2why, como se describió anteriormente.


Para resolver errores, puede crear una política local. Por ejemplo, obtenemos un error relacionado con httpd (apache) o smbd (samba), grep errores y creamos una política para ellos:


 apache $ grep httpd_t /var/log/audit/audit.log | audit2allow -M http_policy samba $ grep smbd_t /var/log/audit/audit.log | audit2allow -M smb_policy 

Aquí http_policy y smb_policy son los nombres de las políticas locales que creamos. Ahora necesitamos cargar estas políticas locales creadas en la política actual de SELinux. Esto se puede hacer de la siguiente manera:


 $ semodule –I http_policy.pp $ semodule –I smb_policy.pp 

Se cargaron nuestras políticas locales, y ya no deberíamos recibir ningún avc o denail en audit.log.




Fue mi intento de ayudarlo a comprender SELinux. Espero que después de leer este artículo se sienta más cómodo con SELinux.

Source: https://habr.com/ru/post/460387/


All Articles