Durante esta serie, hemos explorado en detalle al menos dos métodos de control de acceso: permisos estándar ugo. rwx. (Administrar usuarios y grupos-Parte 3) y listas de control de acceso. (Configurar ACL en sistemas de archivos-Parte 7).
Examen RHCSA: SELinux Essentials and Control FileSystem Access
Aunque son necesarios como permisos de primer nivel y mecanismos de control de acceso, tienen algunas limitaciones que se abordan en Seguridad Linux mejorado. (también conocido como SELinux. para abreviar).
Una de esas limitaciones es que un usuario puede exponer un archivo o directorio a una brecha de seguridad a través de un chmod. y provocar una propagación inesperada de los derechos de acceso. Como resultado, cualquier proceso iniciado por ese usuario puede hacer lo que quiera con los archivos propiedad del usuario, donde finalmente un software malicioso o comprometido puede lograr acceso de nivel raíz a todo el sistema.
Con Teniendo en cuenta esas limitaciones, la Agencia de Seguridad Nacional de los Estados Unidos. ( NSA. diseñó por primera vez SELinux. un método flexible de control de acceso obligatorio, para restringir la capacidad de procesos para acceder o realizar otras operaciones en objetos del sistema (como archivos, directorios, puertos de red, etc.) al modelo de menor permiso, que se puede modificar posteriormente según sea necesario. En pocas palabras, a cada elemento del sistema se le da solo el acceso requerido para funcionar.
En RHEL 7. SELinux. está incorporado en el propio kernel y está habilitado en el modo Cumplimiento. de forma predeterminada. En este artículo explicaremos brevemente los conceptos básicos asociados con SELinux. y su funcionamiento.
Table of Contents
Modos SELinux
SELinux puede operar de tres formas diferentes:
- Hacer cumplir. SELinux niega el acceso según las reglas de política de SELinux, una conjunto de pautas que controlan el motor de seguridad.
- Permisivo. SELinux no niega el acceso, pero las denegaciones se registran para acciones que se habrían denegado si se ejecutaran en modo de aplicación.
- Deshabilitado. (se explica por sí mismo).
El comando getenforce muestra el modo actual de SELinux, mientras que setenforce (seguido de 1. o un 0. se utiliza para cambiar el modo a Enforcing. o Permissive. respectivamente, solo durante la sesión actual.
Para lograr la persistencia en todos los registros salidas y reinicios, deberá editar el archivo/etc/selinux/config y establecer la variable SELINUX en enforcing. permissive. o disabled.
# getenforce
# setenforce 0
# getenforce
# setenforce 1
# getenforce
# cat/etc/selinux/config Establecer el modo SELinux
Normalmente, utilizará setenforce. para alternar entre los modos SELinux (forzar a permisivo y viceversa) como primer paso de resolución de problemas. Si SELinux está configurado actualmente para hacer cumplir. mientras experimenta un determinado problema, y lo mismo desaparece cuando lo establece en permisivo. puede estar seguro de que está buscando en un problema de permisos de SELinux.
Contextos de SELinux
Un contexto de SELinux consiste en un entorno de control de acceso donde las decisiones se toman en base al usuario, rol y tipo de SELinux (y opcionalmente un nivel) :
- Un usuario de SELinux complementa una cuenta de usuario de Linux normal asignándola a una cuenta de usuario de SELinux, que a su vez se utiliza en el contexto de SELinux para los procesos en esa sesión, con el fin de definir explícitamente su roles y niveles permitidos.
- El concepto de rol actúa como un intermediario entre los dominios y los usuarios de SELinux, ya que define a qué dominios de proceso y tipos de archivos se puede acceder. Esto protegerá su sistema contra la vulnerabilidad a los ataques de escalamiento de privilegios.
- Un tipo define un tipo de archivo SELinux o un dominio de proceso SELinux. En circunstancias normales, se impide que los procesos accedan a los archivos que utilizan otros procesos y que accedan a otros procesos, por lo que el acceso solo se permite si existe una regla de política SELinux específica que lo permita.
Vamos a vea cómo funciona todo eso a través de los siguientes ejemplos.
EJEMPLO 1: Cambiar el puerto predeterminado para el demonio sshd
En Asegurar SSH-Parte 8 explicamos que cambiar el puerto predeterminado donde sshd. escucha es una de las primeras medidas de seguridad para proteger su servidor contra ataques externos. Editemos el archivo/etc/ssh/sshd_config y establezcamos el puerto en 9999.
Puerto 9999
Guarde los cambios y reinicie sshd:
# systemctl restart sshd
# systemctl status sshd Reiniciar el servicio SSH
Como puede ver, sshd no pudo iniciarse. Pero, ¿qué pasó?
Una inspección rápida de/var/log/audit/audit.log indica que a sshd se le han negado los permisos para iniciarse en el puerto 9999. (los mensajes de registro de SELinux incluyen el palabra “ AVC. para que puedan identificarse fácilmente de otros mensajes) porque ese es un puerto reservado para el servicio JBoss Management.
# cat/var/log/audit/audit.log | grep AVC | tail-1 Inspeccionar registros SSH
En este punto, puede desactivar SELinux. (¡pero no lo hagas!) como se explicó antes e intente iniciar sshd. de nuevo, y debería funcionar. Sin embargo, la utilidad semanage. puede decirnos qué necesitamos cambiar para que podamos iniciar sshd en cualquier puerto que elijamos sin problemas.
Ejecutar,
# semanage port-l | grep ssh
para obtener una lista de los puertos donde SELinux permite que sshd escuche.
Herramienta Semanage
Así que cambiemos el puerto en/etc/ssh/sshd_config al puerto 9998. agreguemos el puerto al contexto ssh_port_t. y luego reiniciemos el servicio:
# puerto semanage-a-t ssh_port_t-p tcp 9998 # systemctl restart sshd # systemctl is-active sshd Semanage Agregar puerto
Como puede ver, el servicio se inició con éxito esta vez. Este ejemplo ilustra el hecho de que SELinux controla el número de puerto TCP en sus propias definiciones internas de tipo de puerto.
EJEMPLO 2: Permitir que httpd envíe el correo electrónico de acceso
Este es un ejemplo de SELinux administrando un proceso accediendo a otro proceso. Si tuviera que implementar mod_security y mod_evasive junto con Apache en su servidor RHEL 7, debe permitir que httpd. acceda a sendmail. para enviar una notificación por correo después de un ataque (D) DoS. En el siguiente comando, omita el indicador -P. si no desea que el cambio sea persistente entre reinicios.
# semanage boolean-1 | grep httpd_can_sendmail
# setsebool-P httpd_can_sendmail 1
# semanage boolean-1 | grep httpd_can_sendmail Permitir que Apache envíe correos
Como puede ver en el En el ejemplo anterior, las configuraciones SELinux booleanas. (o simplemente booleanas) son reglas de verdadero/falso incrustadas en las políticas de SELinux. Puede enumerar todos los valores booleanos con semanage boolean-l y, alternativamente, canalizarlo a grep para filtrar la salida.
EJEMPLO 3: Sirviendo un sitio estático desde un directorio que no es el predeterminado
Suponga que está brindando servicio a un sitio web estático usando un directorio diferente al predeterminado (/var/www/html), digamos /sitios web. (este podría ser el caso si almacena sus archivos web en una unidad de red compartida, por ejemplo, y necesita montarlos en /sitios web. .
a).. Cree un archivo index.html. dentro de /websites. con el siguiente contenido:
Prueba SELinux
Si lo hace,
# ls-lZ/websites/index.html
verá que el index.html. El archivo se ha etiquetado con el tipo default_t SELinux. al que Apache no puede acceder:
Comprobar el permiso del archivo SELinux
b).. Cambie la directiva DocumentRoot. en/etc/httpd/conf/httpd.conf a /websites. y no olvide actualizar el bloque de directorio correspondiente. Luego, reinicie Apache.
c).. Busque http://<dirección IP del servidor web> y debería obtener una respuesta HTTP prohibida 503.
d).. A continuación, cambie la etiqueta de /sitios web. de forma recursiva, al tipo httpd_sys_content_t. para otorgar acceso de solo lectura a Apache. a ese directorio y su contenido:
# semanage fcontext-a-t httpd_sys_content_t “/websites(/.*)?”
e).. Finalmente, aplique la política SELinux creada en d):</×
# restorecon-R-v/websites
Ahora reinicie Apache y vaya a http://<dirección IP del servidor web> nuevamente y verá que el archivo html se muestra correctamente:
Verificar página Apache
Resumen
En este artículo hemos repasado los conceptos básicos de SELinux. Tenga en cuenta que debido a la amplitud del tema, no es posible una explicación detallada completa en un solo artículo, pero creemos que los principios descritos en esta guía lo ayudarán a pasar a temas más avanzados si así lo desea.
Si puedo, permítame recomendarle dos recursos esenciales para comenzar: la página NSA SELinux y la guía del usuario y administrador de RHEL 7 SELinux.
No dude en informarnos si tiene alguna pregunta o comentario.