
La traducción del artículo se ha preparado para los estudiantes del curso
SELinux o Security Enhanced Linux es un mecanismo mejorado de gestión de acceso desarrollado por la Agencia de Seguridad Nacional de EE. UU. (NSA) para prevenir intrusiones maliciosas. Implementa un modelo de control de acceso obligatorio (Mandatory Access Control, MAC) sobre el modelo discrecional existente (Discretionary Access Control, DAC), es decir, permisos de lectura, escritura y ejecución.
SELinux tiene tres modos:
- Enforcing — se prohíbe el acceso en función de las reglas de la política.
- Permissive — registro de acciones que violarían la política en modo enforcing que estarían prohibidas.
- Disabled — desactivación completa de SELinux.
Por defecto, la configuración se encuentra en /etc/selinux/config
Cambio de modos de SELinux
Para saber el modo actual, ejecuta
$ getenforcePara cambiar el modo a permissive, ejecuta el siguiente comando
$ setenforce 0o para cambiar el modo de permissive en a enforcing, ejecuta$ setenforce 1
Si necesitas desactivar completamente SELinux, solo se puede hacer a través del archivo de configuración$ vi /etc/selinux/config
Para desactivar, cambia el parámetro SELINUX de la siguiente manera:SELINUX=disabled
Configuración de SELinuxCada archivo y proceso se etiqueta con un contexto de SELinux, que contiene información adicional, como el usuario, rol, tipo, etc. Si habilitas SELinux por primera vez, primero debes configurar el contexto y las etiquetas. El proceso de asignación de etiquetas y contexto se conoce como etiquetado. Para comenzar a etiquetar, cambia el modo en el archivo de configuración a
$ vi /etc/selinux/config SELINUX=permissive permissive.
Una vez establecido el modo, crearemos un archivo oculto vacío llamado permissiveautorelabel $ touch /.autorelabel
y reinicia el ordenador$ init 6
Nota: usamos el modopara etiquetar, ya que usar el modo permissive puede causar fallos en el sistema durante el reinicio. a enforcing, ejecuta No te preocupes si el inicio se queda atascado en algún archivo, el etiquetado toma tiempo. Después de completar el etiquetado y de arrancar tu sistema, puedes ir al archivo de configuración y establecer el modo
, además de ejecutar: a enforcing, ejecutaAhora has habilitado SELinux en tu ordenador con éxito.
Si necesitas desactivar completamente SELinux, solo se puede hacer a través del archivo de configuraciónMonitoreando los registros
Monitorizamos los registros
Es posible que haya encontrado algún error durante la etiquetación o mientras el sistema estaba en funcionamiento. Para verificar si su SELinux está funcionando correctamente y si está bloqueando el acceso a algún puerto, aplicación, etc., es necesario revisar los registros. El registro de SELinux se encuentra en /var/log/audit/audit.log, pero no necesita leerlo completamente para encontrar errores. Puede utilizar la herramienta audit2why para buscar errores. Ejecute el siguiente comando:
$ audit2why < /var/log/audit/audit.logComo resultado, obtendrá una lista de errores. Si no hubo errores en el registro, no se mostrará ningún mensaje.
Configuración de la política SELinux
La política de SELinux es un conjunto de reglas que rige el mecanismo de seguridad de SELinux. La política define un conjunto de reglas para un entorno específico. Ahora vamos a estudiar cómo configurar políticas para permitir el acceso a servicios prohibidos.
1. Valores lógicos (interruptores)
Los interruptores (booleans) permiten modificar partes de la política en tiempo de ejecución, sin necesidad de crear nuevas políticas. Permiten hacer cambios sin reiniciar o recompilar las políticas de SELinux.
Ejemplo
Supongamos que queremos proporcionar acceso compartido al directorio personal de un usuario por FTP para lectura y escritura, y ya lo hemos compartido, pero al intentar acceder no vemos nada. Esto se debe a que la política de SELinux impide que el servidor FTP lea y escriba en el directorio personal del usuario. Necesitamos modificar la política para que el servidor FTP pueda acceder a los directorios personales. Verificamos si hay algunos interruptores para esto, ejecutando
$ semanage boolean -lEste comando generará una lista de interruptores disponibles con su estado actual (activado/on o desactivado/off) y una descripción. Puede afinar la búsqueda agregando grep para encontrar resultados relacionados solo con ftp:
$ semanage boolean -l | grep ftpy encontrará lo siguiente
ftp_home_dir -> off Permitir que ftp lea y escriba archivos en el directorio home del usuarioEste interruptor está desactivado, así que lo activaremos usando setsebool ftp_home_dir on
Ahora nuestro demonio ftp podrá acceder al directorio personal del usuario.
Nota: también puede obtener una lista de interruptores disponibles sin descripción, ejecutando getsebool -a
2. Etiquetas y contexto
Este es el método más común de implementación de políticas SELinux. Cada archivo, carpeta, proceso y puerto está etiquetado con un contexto de SELinux:
- Para 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 gestiona las etiquetas, y se pueden ver de la siguiente manera:
proceso
$ ps –auxZ | grep httpdpuerto
$ netstat -anpZ | grep httpdEjemplo
Ahora consideremos un ejemplo para entender mejor las etiquetas y el contexto. Supongamos que tenemos servidor web, que en lugar de un directorio /var/www/html/ использует /home/dan/html/. SELinux considerará esto una violación de la política y no podrás ver tus páginas web. Esto se debe a que no hemos establecido el contexto de seguridad asociado con los archivos HTML. Para ver el contexto de seguridad por defecto, utiliza 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í hemos obtenido httpd_sys_content_t como el 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/Un comando alternativo para verificar el contexto de seguridad de un archivo o directorio:
$ semanage fcontext -l | grep ' /var/www'También utilizaremos semanage para cambiar el contexto, después de encontrar el contexto de seguridad correcto. Para cambiar el contexto de /home/dan/html, ejecuta los siguientes comandos:
$ semanage fcontext -a -t httpd_sys_content_t '/home/dan/html ( /.*)?'
$ semanage fcontext -l | grep '/home/dan/html'
/home/dan/html( /.*)? todos los archivos system_u:object_r:httpd_sys_content_t:s0
$ restorecon -Rv /home/dan/htmlUna vez que el contexto haya sido cambiado con semanage, el comando restorecon cargará el contexto por defecto para archivos y directorios. Nuestro servidor web ahora podrá leer archivos de la carpeta /home/dan/html, ya que el contexto de seguridad para esta carpeta ha sido cambiado a httpd_sys_content_t.
3. Creación de políticas locales
Pueden ocurrir situaciones en las que los métodos anteriores no te sean útiles, y recibas errores (avc/denial) en audit.log. Cuando esto sucede, es necesario crear una política local (Local policy). Puedes encontrar todos los errores utilizando audit2why, como se describió anteriormente.
Para resolver los errores, se puede crear una política local. Por ejemplo, si recibimos un error asociado con httpd (apache) o smbd (samba), buscamos los 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_policyAquí http_policy y smb_policy Son los nombres de las políticas locales que hemos creado. 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.ppNuestras políticas locales han sido cargadas y no deberíamos recibir más avc o denail en audit.log.
Este fue mi intento de ayudarles a entender SELinux. Espero que después de leer este artículo se sientan más cómodos con SELinux.
Fuente: habr.com
