Serie RHCSA Essentials de control de acceso obligatorio con Selinux en RHEL 7 - Parte 13

Serie RHCSA Essentials de control de acceso obligatorio con Selinux en RHEL 7 - Parte 13

Durante esta serie hemos explorado en detalle al menos dos métodos de control de acceso: estándar UGO/RWX Permisos (administrar usuarios y grupos - Parte 3) y listas de control de acceso (configure los sistemas de archivos de ACL - Parte 7).

Examen RHCSA: Selinux Essentials y Control de acceso del sistema de archivos

Aunque es necesario como permisos de primer nivel y mecanismos de control de acceso, tienen algunas limitaciones abordadas por Linux mejorado con seguridad (también conocido como Selinux para abreviar).

Una de esas limitaciones es que un usuario puede exponer un archivo o directorio a una violación de seguridad a través de una chmod comandar y, por lo tanto, causar 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 de otra manera puede lograr el acceso a nivel raíz a todo el sistema.

Con esas limitaciones en mente, el Agencia de Seguridad Nacional de los Estados Unidos (NSA) Primero ideado Selinux, Un método de control de acceso obligatorio flexible para restringir la capacidad de los 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 más adelante según sea necesario. En pocas palabras, cada elemento del sistema solo recibe el acceso requerido para funcionar.

En Rhel 7, Selinux se incorpora al núcleo mismo y está habilitado en Ejecución Modo por defecto. En este artículo explicaremos brevemente los conceptos básicos asociados con Selinux y su operación.

Modos Selinux

Selinux puede operar de tres maneras diferentes:

  1. Ejecución: Selinux niega el acceso basado en las reglas de política de Selinux, un conjunto de pautas que controlan el motor de seguridad.
  2. Permisivo: Selinux no niega el acceso, pero las negaciones están registradas para acciones que se habrían negado si se ejecuta en modo de aplicación.
  3. Desactivado (Autoexplicativo).

El Getenforce El comando muestra el modo actual de Selinux, mientras que setenforce (seguido de un 1 o 0) se usa para cambiar el modo a Ejecución o Permisivo, respectivamente, solo durante la sesión actual.

Para lograr la persistencia en los cierres y reinicios, deberá editar el /etc/selinux/config archivo y establecer la variable Selinux en cualquiera ejecución, permisivo, o desactivado:

# getenforce # setenforce 0 # getenforce # setenforce 1 # getenforce # cat/etc/selinux/config 
Establecer el modo Selinux

Normalmente usarás setenforce para alternar entre los modos Selinux (aplicando a Permisive y de regreso) como un primer paso de solución de problemas. Si Selinux está configurado actualmente en ejecución Mientras experimenta un cierto problema, y ​​lo mismo desaparece cuando lo establece en permisivo, Puede estar seguro de que está viendo un problema de permisos de Selinux.

Contextos selinux

Un contexto de Selinux consiste en un entorno de control de acceso donde las decisiones se toman en función del usuario, rol y tipo de selinux (y opcionalmente un nivel):

  1. Un usuario de Selinux complementa una cuenta de usuario de Linux regular al asignarla 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, para definir explícitamente sus roles y niveles permitidos.
  2. El concepto de rol actúa como un intermediario entre los dominios y los usuarios de Selinux, ya que define a qué dominios y tipos de archivos se pueden acceder. Esto protegerá su sistema contra la vulnerabilidad a los ataques de escalada de privilegios.
  3. Un tipo define un tipo de archivo Selinux o un dominio de proceso Selinux. En circunstancias normales, se impide que los procesos accedan a archivos que otros procesos usan, y acceder a otros procesos, por lo tanto, el acceso solo se permite si existe una regla de política de Selinux específica que lo permite.

Veamos cómo funciona todo eso a través de los siguientes ejemplos.

Ejemplo 1: Cambiar el puerto predeterminado para el demonio SSHD

Al asegurar SSH - Parte 8 explicamos que cambiar el puerto predeterminado donde SSHD escuchar es una de las primeras medidas de seguridad para asegurar su servidor contra ataques externos. Editemos el /etc/ssh/sshd_config archivo y configure el puerto a 9999:

Puerto 9999 

Guarde los cambios y reinicie SSHD:

# SystemCTL reiniciar sshd # systemctl sshd sshd 
Reiniciar el servicio SSH

Como puede ver, SSHD no ha podido comenzar. Pero qué pasó?

Una rápida inspección de /var/log/audit/audit.registro indica que a SSHD se les ha negado los permisos para comenzar en el puerto 9999 (Los mensajes de registro de Selinux incluyen la palabra "AVC"Para que puedan identificarse fácilmente de otros mensajes) porque ese es un puerto reservado para el Gestión de JBoss servicio:

# cat/var/log/audit/audit.registro | Grep AVC | cola -1 
Inspeccionar registros de SSH

En este punto podrías deshabilitar Selinux (pero no!) como se explicó anteriormente e intenta comenzar SSHD de nuevo, y debería funcionar. sin embargo, el semanago La utilidad puede decirnos qué debemos cambiar para que podamos iniciar SSHD en cualquier puerto que elijamos sin problemas.

Correr,

# Puerto de semanage -l | grep ssh 

Para obtener una lista de los puertos donde Selinux permite que SSHD escuche en.

Herramienta de semanago

Así que cambiemos el puerto en /etc/ssh/sshd_config hacia el puerto 9998, Agregue el puerto al contexto ssh_port_t, y luego reinicie el servicio:

# Port Semanage -A -T SSH_PORT_T -P TCP 9998 # SystemCTL reiniciar 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 a sus propias definiciones internas del tipo de puerto.

Ejemplo 2: Permitir que HTTPD envíe acceso a Sendmail

Este es un ejemplo de Selinux que administra un proceso que accede a otro proceso. Si implementara MOD_SECURITY y MOD_EVASIVE junto con Apache en su servidor RHEL 7, debe permitir httpd acceder enviar correo Para enviar una notificación por correo a raíz de un (D) DOS ataque. En el siguiente comando, omita el -PAG bandera Si no desea que el cambio sea persistente en 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 ejemplo anterior, Selinux booleano La configuración (o simplemente booleans) son reglas verdaderas / falsas integradas en las políticas de Selinux. Puedes enumerar todos los booleanos con semanage booleano -l, y alternativamente víale a Grep para filtrar la salida.

Ejemplo 3: Servir un sitio estático desde un directorio que no sea el predeterminado

Supongamos que está sirviendo un sitio web estático utilizando un directorio diferente al predeterminado (/var/www/html), decir /Sitios web (Este podría ser el caso si está almacenando sus archivos web en una unidad de red compartida, por ejemplo, y necesita montarlo en /Sitios web).

a). Crear un índice.html Archivo en el interior /Sitios web Con el siguiente contenido:

 

Prueba de Selinux

Si lo haces,

# ls -lz /sitios web /índice.html 

Verás que el índice.html el archivo ha sido etiquetado con el default_t selinux Tipo, a qué apache no puede acceder:

Verifique el permiso del archivo de Selinux

b). Cambiar el Raiz del documento directivo en /etc/httpd/conf/httpd.confusión a /Sitios web y no olvide actualizar el bloque de directorio correspondiente. Entonces, reinicie Apache.

C). Buscar http: //, y deberías obtener una respuesta HTTP prohibida 503.

d). A continuación, cambie la etiqueta de /Sitios web, recursivamente, al httpd_sys_content_t Escriba para otorgar acceso de solo lectura de Apache a ese directorio y su contenido:

# semanage fcontext -a -t httpd_sys_content_t "/sitios web (/.*)?" 

mi). Finalmente, aplique la política de Selinux creada en d):

# restaurecon -r -v /sitios web 

Ahora reinicie Apache y navegue a http: // de nuevo y verá el archivo HTML que se muestra correctamente:

Verificar la página Apache

Resumen

En este artículo hemos pasado por los conceptos básicos de Selinux. Tenga en cuenta que debido a la inmensidad del sujeto, una explicación detallada completa no es posible 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 lo desea.

Si puedo, permítanme recomendar dos recursos esenciales para comenzar: la página de NSA Selinux y la Guía del usuario y administrador de Rhel 7 Selinux.

No dude en hacernos saber si tiene alguna pregunta o comentario.