Traducción del artículo elaborado para los alumnos del curso.
SELinux o Security Enhanced Linux es un mecanismo de control de acceso mejorado desarrollado por la Agencia de Seguridad Nacional de EE. UU. (NSA) para evitar intrusiones maliciosas. Implementa un modelo de control de acceso forzado (u obligatorio) (Control de acceso obligatorio en inglés, MAC) además del modelo discrecional (o selectivo) existente (Control de acceso discrecional en inglés, DAC), es decir, permisos para leer, escribir y ejecutar.
SELinux tiene tres modos:
- Hacer cumplir — denegación de acceso basada en reglas de política.
- Permisivo — mantener un registro de las acciones que violan la política, que estarían prohibidas en el modo de aplicación.
- Discapacitado — desactivación completa de SELinux.
Por defecto, la configuración está en /etc/selinux/config
Cambiar los modos SELinux
Para conocer el modo actual, ejecute
$ getenforce
Para cambiar el modo a permisivo ejecute el siguiente comando
$ setenforce 0
o, para cambiar el modo de permisivo en hacer cumplir, ejecutar
$ 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 deshabilitarlo, cambie el parámetro SELINUX de la siguiente manera:
SELINUX=disabled
Configurando 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 deberá configurar el contexto y las etiquetas. El proceso de asignar etiquetas y contexto se conoce como etiquetado. Para empezar a marcar, en el archivo de configuración cambiamos el modo a permisivo.
$ vi /etc/selinux/config
SELINUX=permissive
Después de configurar el modo permisivo, cree un archivo oculto vacío en la raíz con el nombre autorelabel
$ touch /.autorelabel
y reinicia la computadora
$ init 6
Nota: Usamos el modo permisivo para marcar, ya que el uso del modo hacer cumplir puede causar que el sistema falle durante el reinicio.
No te preocupes si la descarga se atasca en algún archivo, el marcado lleva un tiempo. Una vez que se completa el marcado y se inicia su sistema, puede ir al archivo de configuración y configurar el modo hacer cumpliry también ejecutar:
$ setenforce 1
Ahora ha habilitado SELinux con éxito en su computadora.
Monitoreo de los registros
Es posible que haya encontrado algunos errores durante el marcado o mientras el sistema se estaba ejecutando. Para comprobar si su SELinux está funcionando correctamente y si no está bloqueando el acceso a ningún puerto, aplicación, etc., debe consultar los registros. El registro de SELinux se encuentra en /var/log/audit/audit.log
, pero no es necesario leerlo completo para encontrar errores. Puede utilizar la utilidad audit2why para encontrar errores. Ejecute el siguiente comando:
$ audit2why < /var/log/audit/audit.log
Como resultado, recibirá una lista de errores. Si no hubo errores en el registro, no se mostrará ningún mensaje.
Configuración de la política SELinux
Una política de SELinux es un conjunto de reglas que gobiernan el mecanismo de seguridad de SELinux. Una política define un conjunto de reglas para un entorno específico. Ahora aprenderemos cómo configurar políticas para permitir el acceso a servicios prohibidos.
1. Valores lógicos (interruptores)
Los modificadores (booleanos) le permiten cambiar partes de una política en tiempo de ejecución, sin tener que crear nuevas políticas. Le permiten realizar cambios sin reiniciar ni volver a compilar las políticas de SELinux.
ejemplo
Digamos que queremos compartir el directorio de inicio de un usuario mediante lectura/escritura FTP y ya lo hemos compartido, pero cuando intentamos acceder a él, no vemos nada. Esto se debe a que la política de SELinux impide 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 de inicio. Veamos si hay algún interruptor para esto haciendo
$ semanage boolean -l
Este comando enumerará los interruptores disponibles con su estado actual (activado o desactivado) y descripción. Puede refinar su búsqueda agregando grep para encontrar resultados solo para ftp:
$ semanage boolean -l | grep ftp
y encontraras lo siguiente
ftp_home_dir -> off Allow ftp to read & write file in user home directory
Este interruptor está deshabilitado, por lo 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 conmutadores disponibles sin descripción haciendo getsebool -a
2. Etiquetas y contexto
Esta es la forma más común de implementar la política SELinux. Cada archivo, carpeta, proceso y puerto está marcado con el contexto 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 etiquetado lo administra el kernel y puede ver estas etiquetas de la siguiente manera:
proceso
$ ps –auxZ | grep httpd
puerto
$ netstat -anpZ | grep httpd
ejemplo
Ahora veamos un ejemplo para comprender mejor las etiquetas y el contexto. Digamos que tenemos un 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á ver sus 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 predeterminado, utilice 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 archivos html. Necesitamos establecer este contexto de seguridad para nuestro directorio actual, que actualmente tiene el siguiente contexto:
-rw-r—r—. dan dan system_u:object_r:user_home_t:s0 /home/dan/html/
Un comando alternativo para comprobar el contexto de seguridad de un archivo o directorio:
$ semanage fcontext -l | grep '/var/www'
También usaremos semanage para cambiar el contexto una vez que hayamos encontrado 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 restaurarcon cargará el contexto predeterminado para archivos y directorios. Nuestro servidor web ahora podrá leer archivos de la carpeta /home/dan/html
porque el contexto de seguridad para 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 no le sean útiles y obtenga errores (avc/denial) en audit.log. Cuando esto sucede, es necesario crear una política local. Puede encontrar todos los errores utilizando audit2why, como se describe anteriormente.
Puede crear una política local para resolver errores. Por ejemplo, obtenemos un error relacionado con httpd (apache) o smbd (samba), registramos 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_policy
es http_policy
и smb_policy
son los nombres de las políticas locales que creamos. Ahora necesitamos cargar estas políticas locales creadas en la política SELinux actual. Esto puede hacerse de la siguiente manera:
$ semodule –I http_policy.pp
$ semodule –I smb_policy.pp
Nuestras políticas locales se han descargado y ya no deberíamos recibir ningún avc o denail en audit.log.
Este fue mi intento de ayudarlo a comprender SELinux. Espero que después de leer este artículo te sientas más cómodo con SELinux.
Fuente: habr.com