"Es un hecho importante y popular que las cosas no siempre son lo que parecen..."
―Douglas Adams, La guía del autoestopista galáctico
Seguridad. Endurecimiento. Cumplimiento. Política. Los cuatro jinetes del Apocalipsis SysAdmin. Además de nuestras tareas diarias (supervisión, copia de seguridad, implementación, ajuste, actualización, etc.), también estamos a cargo de proteger nuestros sistemas. Incluso aquellos sistemas en los que el proveedor externo nos indica que deshabilitemos la seguridad mejorada. Parece un trabajo para Misión Imposible de Ethan Hunt.
Ante este dilema, algunos administradores de sistemas deciden tomar la píldora azul porque creen que nunca sabrán la respuesta a la gran pregunta de la vida, el universo y todo lo demás. Y, como todos sabemos, esa respuesta es 42 .
En el espíritu de La guía del autoestopista galáctico , aquí están las 42 respuestas a las grandes preguntas sobre cómo administrar y usar SELinux con sus sistemas.
- SELinux es un sistema de ETIQUETADO, lo que significa que cada proceso tiene una ETIQUETA. Cada archivo, directorio y objeto del sistema tiene una ETIQUETA. Las reglas de política controlan el acceso entre procesos etiquetados y objetos etiquetados. El núcleo hace cumplir estas reglas.
- Los dos conceptos más importantes son:Etiquetado (archivos, procesos, puertos, etc.) y Aplicación de tipos (que aísla los procesos entre sí en función de los tipos).
- El formato de etiqueta correcto es
user:role:type:level
(opcional ).
- El propósito de la aplicación de seguridad multinivel (MLS) es controlar procesos (dominios ) en función del nivel de seguridad de los datos que vayan a utilizar. Por ejemplo, un proceso secreto no puede leer datos ultrasecretos.
- Cumplimiento de seguridad multicategoría (MCS) protege procesos similares entre sí (como máquinas virtuales, engranajes de OpenShift, sandboxes de SELinux, contenedores, etc.).
- Parámetros del núcleo para cambiar los modos de SELinux en el arranque:
autorelabel=1
→ obliga al sistema a volver a etiquetarselinux=0
→ kernel no carga ninguna parte de la infraestructura de SELinuxenforcing=0
→ arrancar en modo permisivo
- Si necesita volver a etiquetar todo el sistema:
# touch /.autorelabel
# rebootSi el etiquetado del sistema contiene una gran cantidad de errores, es posible que deba iniciar en modo permisivo para que la etiqueta automática tenga éxito.
-
Para verificar si SELinux está habilitado:
# getenforce
-
Para habilitar/deshabilitar temporalmente SELinux:
# setenforce [1|0]
-
Herramienta de estado de SELinux:
# sestatus
-
Archivo de configuración:
/etc/selinux/config
- ¿Cómo funciona SELinux? Este es un ejemplo de etiquetado para un servidor web Apache:
- Binario:
/usr/sbin/httpd
→httpd_exec_t
- Directorio de configuración:
/etc/httpd
→httpd_config_t
- Directorio del archivo de registro:
/var/log/httpd
→httpd_log_t
- Directorio de contenido:
/var/www/html
→httpd_sys_content_t
- Script de inicio:
/usr/lib/systemd/system/httpd.service
→httpd_unit_file_d
- Proceso:
/usr/sbin/httpd -DFOREGROUND
→httpd_t
- Puertos:
80/tcp, 443/tcp
→httpd_t, http_port_t
- Binario:
Un proceso que se ejecuta en httpd_t
El contexto puede interactuar con un objeto con httpd_something_t
etiqueta.
- Muchos comandos aceptan el argumento
-Z
para ver, crear y modificar contexto:ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
Los contextos se establecen cuando los archivos se crean en función del contexto de su directorio principal (con algunas excepciones). Los RPM pueden establecer contextos como parte de la instalación.
- Hay cuatro causas clave de los errores de SELinux, que se explican con más detalle en los puntos 15 a 21 a continuación:
- Problemas de etiquetado
- Algo que SELinux necesita saber
- Un error en una política/aplicación de SELinux
- Su información puede verse comprometida
- Problema de etiquetado: Si sus archivos en
/srv/myweb
no están etiquetados correctamente, es posible que se deniegue el acceso. Aquí hay algunas formas de arreglar esto:- Si conoce la etiqueta:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- Si conoce el archivo con el etiquetado equivalente:
# semanage fcontext -a -e /srv/myweb /var/www
- Restaurar el contexto (para ambos casos):
# restorecon -vR /srv/myweb
- Si conoce la etiqueta:
- Problema de etiquetado: Si mueve un archivo en lugar de copiarlo, el archivo mantiene su contexto original. Para solucionar estos problemas:
-
Cambie el comando de contexto con la etiqueta:
$ sudo chcon -t httpd_system_content_t /var/www/html/index.html
-
Cambie el comando de contexto con la etiqueta de referencia:
$ sudo chcon --reference /var/www/html/ /var/www/html/index.html
-
Restaurar el contexto (para ambos casos):
$ sudo restorecon -vR /var/www/html/
-
-
Si SELinux necesita saber HTTPD escucha en el puerto 8585, dígale a SELinux:
$ sudo semanage port -a -t http_port_t -p tcp 8585
-
SELinux necesita saber Los booleanos permiten cambiar partes de la política de SELinux en tiempo de ejecución sin ningún conocimiento de la escritura de políticas de SELinux. Por ejemplo, si desea que httpd envíe un correo electrónico, ingrese:
$ sudo setsebool -P httpd_can_sendmail 1
- SELinux necesita saber Los valores booleanos son solo configuraciones de encendido/apagado para SELinux:
- Para ver todos los valores booleanos:
# getsebool -a
- Para ver la descripción de cada uno:
# semanage boolean -l
- Para establecer una ejecución booleana:
# setsebool [_boolean_] [1|0]
- Para configurarlo permanentemente, agregue
-P
. Por ejemplo:
# setsebool httpd_enable_ftp_server 1 -P
- Para ver todos los valores booleanos:
- Las políticas/aplicaciones de SELinux pueden tener errores, incluidos:
- Rutas de código inusuales
- Configuraciones
- Redireccionamiento de
stdout
- Descriptores de archivos filtrados
- Memoria ejecutable
- Bibliotecas mal construidas
- Su información puede verse comprometida si tiene dominios confinados que intentan:
- Cargar módulos del núcleo
- Desactivar el modo de aplicación de SELinux
- Escribir a
etc_t/shadow_t
- Modificar las reglas de iptables
- Herramientas SELinux para el desarrollo de módulos de políticas:
$ yum -y install setroubleshoot setroubleshoot-server
Reiniciar o reiniciar
auditd
después de instalar.
- Usar
journalctl
para enumerar todos los registros relacionados consetroubleshoot
:$ sudo journalctl -t setroubleshoot --since=14:20
- Usar
journalctl
para enumerar todos los registros relacionados con una etiqueta SELinux en particular. Por ejemplo:$ sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
-
Utilice
setroubleshoot
log cuando ocurre un error de SELinux y sugerir algunas posibles soluciones. Por ejemplo, dejournalctl
:Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
SELinux is preventing httpd from getattr access on the file /var/www/html/index.html.
***** Plugin restorecon (99.5 confidence) suggests ************************
If you want to fix the label,
/var/www/html/index.html default label should be httpd_syscontent_t.
Then you can restorecon.
Do
# /sbin/restorecon -v /var/www/html/index.html
- Registro:SELinux registra información por todas partes:
/var/log/messages
/var/log/audit/audit.log
/var/lib/setroubleshoot/setroubleshoot_database.xml
-
Registro:buscando errores de SELinux en el registro de auditoría:
$ sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
-
Para buscar mensajes de SELinux Access Vector Cache (AVC) para un servicio en particular:
$ sudo ausearch -m avc -c httpd
- El
audit2allow
La utilidad recopila información de los registros de operaciones denegadas y luego genera reglas de autorización de políticas de SELinux. Por ejemplo:- Para producir una descripción legible por humanos de por qué se denegó el acceso:
# audit2allow -w -a
- Para ver la regla de cumplimiento de tipos que permite el acceso denegado:
# audit2allow -a
- Para crear un módulo personalizado:
# audit2allow -a -M mypolicy
El-M
crea un archivo de cumplimiento de tipos (.te) con el nombre especificado y compila la regla en un paquete de políticas (.pp):mypolicy.pp mypolicy.te
- Para instalar el módulo personalizado:
# semodule -i mypolicy.pp
- Para producir una descripción legible por humanos de por qué se denegó el acceso:
- Para configurar un solo proceso (dominio) para ejecutar permisivo:
# semanage permissive -a httpd_t
- Si ya no desea que un dominio sea permisivo:
# semanage permissive -d httpd_t
-
Para deshabilitar todos los dominios permisivos:
$ sudo semodule -d permissivedomains
-
Habilitación de la política MLS de SELinux:
$ sudo yum install selinux-policy-mls
En
/etc/selinux/config:
SELINUX=permissive
SELINUXTYPE=mlsAsegúrese de que SELinux se esté ejecutando en modo permisivo:
$ sudo setenforce 0
Usa los
fixfiles
secuencia de comandos para garantizar que los archivos se vuelvan a etiquetar en el próximo reinicio:$ sudo fixfiles -F onboot
$ sudo reboot
-
Cree un usuario con un rango MLS específico:
$ sudo useradd -Z staff_u tux
Usando el
useradd
comando, asigne el nuevo usuario a un usuario de SELinux existente (en este caso,staff_u
).
-
Para ver la asignación entre los usuarios de SELinux y Linux:
$ sudo semanage login -l
-
Defina un rango específico para un usuario:
$ sudo semanage login --modify --range s2:c100 tux
-
Para corregir la etiqueta en el directorio de inicio del usuario (si es necesario):
$ sudo chcon -R -l s2:c100 /home/tux
-
Para enumerar las categorías actuales:
$ sudo chcat -L
-
Para modificar las categorías o empezar a crear las suyas propias, modifique el archivo de la siguiente manera:
/etc/selinux/_<selinuxtype>_/setrans.conf
-
Para ejecutar un comando o script en un archivo, función y contexto de usuario específicos:
$ sudo runcon -t initrc_t -r system_r -u user_u yourcommandhere
- -t es el contexto del archivo
- -r es el contexto del rol
- -u es el contexto de usuario
- Contenedores que se ejecutan con SELinux deshabilitado:
- Con Podman:
# podman run --security-opt label=disable …
- Con Docker:
# docker run --security-opt label=disable …
- Con Podman:
- Si necesita otorgar a un contenedor acceso completo al sistema:
- Con Podman:
# podman run --privileged …
- Con Docker:
# docker run --privileged …
- Con Podman:
Y con esto, ya sabes la respuesta. Así que, por favor: No se asuste y encienda SELinux .
Fuentes:
- SELinux por Dan Walsh
- Su guía práctica visual para la aplicación de políticas de SELinux también por Dan Walsh
- Linux con seguridad mejorada para simples mortales por Thomas Cameron
- El libro para colorear de SELinux de Máirín Duffy
- Guía del administrador y del usuario de SELinux:Red Hat Enterprise Linux 7