Una guía para principiantes de SELinux

Una guía para principiantes de SELinux

Traducción del artículo elaborado para los alumnos del curso. "Seguridad Linux"

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:

  1. Hacer cumplir — denegación de acceso basada en reglas de política.
  2. Permisivo — mantener un registro de las acciones que violan la política, que estarían prohibidas en el modo de aplicación.
  3. 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/htmlporque 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

Añadir un comentario