Introducción a los conceptos y gestión de Selinux

Introducción a los conceptos y gestión de Selinux

Objetivo

Introducción a los conceptos y gestión de Selinux

Sistema operativo y versiones de software

  • Sistema operativo: - Distribución de Linux Agnóstico

Requisitos

  • Acceso raíz en una instalación de Linux que funciona con una política válida de Selinux
  • PolicyCoreutils PAQUETO: Proporciona getsebool, setsebool, restaurecon utilidades
  • Paquete de coreutils: proporciona utilidad CHCON
  • PolicyCoreutils-Python Paquete: Proporciona comando de semanago
  • PolicyCoreutils-Newrole: proporciona el programa Newrole
  • SETOOLS-CONSOLE: proporciona el comando SEINFO

Dificultad

MEDIO

Convenciones

  • # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
  • ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Introducción

Selinux (Security Mayanced Linux) es una implementación de un sistema de permiso de control de acceso obligatorio (Mac) en el núcleo de Linux. Este tipo de control de acceso difiere de los sistemas de control de acceso discrecional (DAC) como los ACL y los permisos estándar de UGO/RWX de UGO, en cómo se proporciona el acceso a un recurso. En el caso de Mac no es el propietario de un recurso el que decide quién y cómo puede acceder a él: este acceso se basa en las relaciones entre dominios y etiquetas, dictadas por una política y aplicada a nivel de núcleo. Es importante decir que las reglas forzadas de Selinux y los permisos estándar del sistema no son mutuamente excluyentes, y los primeros se implementan después de la segunda.

Posible estado de Selinux

Hay tres posibles estado de Selinux: discapacitado, permisivo y aplicando. En el primer caso, Selinux está completamente apagado: no tiene ningún efecto en el sistema de ejecución. Cuando en modo permisivo, Selinux está activo: registra las violaciones de la política, pero no hace nada para bloquearlas. Finalmente, cuando está en modo de aplicación, Selinux realmente hace cumplir su política.

Hay muchas maneras en que puede verificar el estado de Selinux en su sistema. El primero es usar el comando llamado getenforce. Este comando solo informa en qué de los tres estatus mencionados anteriormente es Selinux. Para tener una salida más detallada, puede usar la utilidad sestatus. Esta es la salida del comando en mi sistema (Centos 7):

Estado de Selinux: Monte Selinuxfs habilitado:/sys/fs/selinux selinux directorio raíz:/etc/selinux Nombre de la política cargada: Modo actual: Modo de aplicación de la política de ejecución de la política: Política Consejada Deny_unknown Estado: Permitido Máxico Kernel Versión de la Versión : 28 

Se proporcionan cierta información útil: en primer lugar el Selinuxfs de montaje, En este caso/sys/fs/selinux. Selinuxfs es un sistema de archivos pseudo, al igual que /proc: está poblado en tiempo de ejecución por el kernel de Linux y contiene archivos útiles para documentar el estado de selinux. El Directorio raíz de Selinux es, en su lugar, la ruta utilizada para mantener los archivos de configuración de Selinux, el principal es/etc/selinux/config (un enlace simbólico a este archivo también está presente en/etc/sysconfig/selinux). Cambiar este archivo directamente es la forma más directa de cambiar el estado y el modo de Selinux. Veamos un breve vistazo a su contenido:

$ cat/etc/selinux/config # Este archivo controla el estado de Selinux en el sistema. # Selinux = puede tomar uno de estos tres valores: # Eforce - Se aplica la política de seguridad de Selinux. # Permisivo - Selinux imprime advertencias en lugar de hacer cumplir. # Desactivado: no se carga la política de Selinux. Selinux = Elegir # selinuxtype = puede tomar uno de los tres dos valores: # dirigidos - Los procesos dirigidos están protegidos, # mínimo - modificación de la política dirigida. Solo los procesos seleccionados están protegidos. # MLS - Protección de seguridad de múltiples niveles. Selinuxtype = objetivo 

El archivo está muy bien comentado: al cambiar los valores de las variables Selinux y Selinuxtype, podemos establecer respectivamente el estado de Selinux y el modo Selinux. Los modos posibles son: dirigidos (el valor predeterminado), mínimo y MLS. El modo objetivo es el valor predeterminado: cuando este modo está activo, todos los procesos dirigidos están protegidos. El modo mínimo es un subconjunto del primero, en el que solo se protegen procesos específicos. Finalmente, la política de la MLS es la más sofisticada, basada en el concepto de clasificación de seguridad: de no clasificada hasta el máximo secreto: utiliza el modelo Bell-La Padula, desarrollado para el Departamento de Defensa de los Estados Unidos.

Cambiar el estado de Selinux

Para cambiar el estado de Selinux en tiempo de ejecución, puede usar el setenforce dominio. Su sintaxis es realmente simple: especifica el estado en el que desea colocar Selinux, eligiendo entre hacer cumplir o permisos o proporcionar un valor booleano referido al estado de ejecución. Lo que no puede hacer con este comando es deshabilitar Selinux por completo. Para lograr esto (no recomendado) y hacer otros cambios persistentes, debe editar el archivo de configuración principal, como se ve anteriormente. Los cambios realizados en este archivo se aplican después de un reinicio.

¿Cómo funciona Selinux??

Básicamente, Selinux funciona en el concepto de entidades: temas, objetos y acciones. Un sujeto es una aplicación o un proceso (un servidor HTTP, por ejemplo), un objeto es un recurso en el sistema, como un archivo, un socket o un puerto. Finalmente, una acción es lo que ese sujeto específico puede realizar en el objeto. Un sujeto se ejecuta bajo un cierto dominio, que, por ejemplo, en el caso del demonio httpd es httpd_t. Esto es fácil verificable al verificar un proceso de ejecución con el comando PS: todo lo que necesitamos hacer es agregar el interruptor -z (-z Switch a menudo se asocia con Selinux en los comandos que lo admiten, como LS, por ejemplo):

$ ps -auxz | grep httpd 

El comando anterior proporciona el siguiente resultado (salida truncada):

system_u: system_r: httpd_t: s0 apache 2340 0.0 0.2 221940 2956 ? S 14:20 0:00/usr/sbin/httpd -dforeground 

Ejecutando bajo el dominio httpd_t, el servicio HTTPD (sujeto) solo puede acceder a recursos (objetos) (objetos) dentro de los tipos de selinux asociados. Una forma muy simple de verificar esto es verificar el directorio /var /www. El demonio httpd debe poder acceder a él, así que verifiquemos qué tipo tiene este directorio. Podemos hacerlo usando el comando LS con el interruptor -z:

$ ls -dz /var /www 

Los comandos nos dan este resultado:

system_u: object_r: httpd_sys_content_t: s0 /var /www 

La salida nos muestra el contexto completo de Selinux y el directorio /var /www que se etiqueta con el tipo ttpd_sys_content_t. Esto hace que sea perfectamente sentido: la política de selinux específica permite que un proceso se ejecute bajo el dominio httpd_t para acceder (en modo solo lea) todos los archivos etiquetados con el tipo httpd_sys_content_t, sin importar qué permisos DAC estén configurados en el archivo. Si el proceso intentará cualquier acción que la política no espere, Selinux registrará el error y, si está en modo de aplicación, bloquee la acción en sí misma.

Usuarios de Selinux

Vimos anteriormente cómo parece estructurarse una representación de un contexto completo de Selinux:

system_u: object_r: httpd_sys_content_t: s0 

Analicemos esta estructura teniendo en cuenta las primeras tres partes (la cuarta se refiere al modo MLS). La primera sección es sobre los usuarios de Selinux: cada usuario de Selinux tiene un conjunto diferente de restricciones y está autorizado
Para jugar solo un conjunto específico de roles de Selinux que dan acceso a dominios selinux específicos, que, a su vez, pueden acceder solo a los tipos de selinux.

Los usuarios de Selinux pueden jugar roles Selinux pueden ir a los dominios Selinux tener acceso a tipos de selinux 

Para tener una idea clara de los usuarios disponibles de Selinux, podemos ejecutar:

# Semanage User -l

Este comando nos da una visión general clara de los usuarios: relaciones de roles:

Selinux User Prefix MCS Level MCS Range Roles Selinux Guest_u User S0 S0 Guest_r Root User S0 S0: C0.C1023 Staff_R Sysadm_R System_R Unconfined_R Staff_U User S0 S0-S0: C0.C1023 Staff_R Sysadm_R System_R Unconfined_R Sysadm_u Usuario S0-S0: C0.C1023 SYSADM_R SYSTEM_U Usuario S0-S0: C0.C1023 System_R no Confined_r Unconfined_U User S0-S0: C0.C1023 System_R Unconfined_R User_U User S0 S0 USER_R XGUEST_U USER S0 S0 XGUEST_R 

Veamos brevemente a qué están autorizados algunos de los usuarios de Selinux descritos:

  • invitado_u: Este tipo de usuario no tiene acceso a las redes, no hay privilegios de ejecución de script en /inicio, ni puede utilizar comandos sudo o SU para obtener privilegios más altos. Solo puede usar el rol de invitado_r
  • personal_u: Los usuarios del sistema asignados a este usuario de Selinux tienen acceso a la GUI, a las redes y al uso del comando sudo para obtener privilegios. Puede cambiar entre los roles Stuff_R, Sysadm_r, System_R y Unconfined_R
  • sysadmin_u: Igual que el anterior, Plus puede usar también el comando SU. Solo puede desempeñar el papel sysadm_r
  • system_u: Este es el usuario asignado a los servicios del sistema, no se deben asignar usuarios del sistema a él
  • no confinado_u: Este tipo de usuario no tiene restricciones. Tiene roles no confined_r y system_r asociados con él
  • xguest_u: Este usuario de Selinux tiene acceso a la GUI y a la red, pero solo a través del navegador Firefox. No tiene derechos de ejecución para archivos debajo /home y solo tiene el papel xguest_r asociado con él

Como puede ver, el usuario de Selinux es identificable, en el contexto, que tiene el sufijo _U. Debe quedar claro que son algo totalmente diferente de los usuarios del sistema. Existe un mapa entre los dos, y es posible verlo corriendo Semanage Login -L dominio:

# Semanage -L Iniciar sesión

Que nos da la siguiente salida:

Nombre de inicio de sesión Servicio Selinux User MLS/MCS Range Service __default__ Unconfined_u S0-S0: C0.C1023 * raíz no confinado_u S0-S0: C0.C1023 * 

La raíz del usuario del sistema se asigna al usuario de Selinux no Confined_U, por lo tanto, no tiene restricciones. Ningún otro usuarios se mapean explícitamente, por lo que, por defecto, están asociados al usuario no confinado_u Selinux.

Cambiar el usuario de Selinux

En este punto, puede preguntar cómo es posible establecer un mapa entre un usuario del sistema y uno Selinux. Realizamos esta tarea utilizando el comando de inicio de sesión de semanage. En el siguiente ejemplo, cambio la asignación predeterminada, asociando al usuario ficticio en mi sistema al usuario de Selinux invitado_U:

# Semanage Login -A -S Guest_u Dummy 

El interruptor -a es corto para -add y se usa para agregar un registro, mientras que el -s uno (abreviatura de -seuser) especifica el usuario de Selinux al usuario del sistema debe asignarse. Vamos a ejecutar de nuevo Semanage Iniciar sesión -l para ver si algo cambió:

Nombre de inicio de sesión Servicio Selinux User MLS/MCS Range Service __default__ Unconfined_u S0-S0: C0.C1023 * Dummy Guest_u S0 * raíz no confined_u S0-S0: C0.C1023 * System_U System_u S0-S0: C0.C1023 * 

Como se esperaba, el usuario ficticio del sistema ahora está asociado con el usuario de Selinux invitados, que, como se dice anteriormente, no tiene acceso a la red. Veamoslo de la manera más simple: intentamos hacer ping a Google y ver cuál es el resultado:

[Dummy@linuxconfig ~] $ ping google.com ping: socket: permiso denegado 

Como se esperaba, el usuario ficticio no puede usar la red, por lo que el comando ping falla. Para eliminar la asignación, usamos el interruptor -d (abreviatura de -delete):

# Semanage login -d -s invitados_u ficticio 

Al no tener una asignación específica, el usuario ficticio se retirará al usuario de Selinux no confinado_u. Dado que este último no tiene restricciones, si lo intentamos nuevamente el comando anterior, ahora debería tener éxito:

[Dummy@linuxconfig ~] $ ping google.comiendo google.com (216.58.205.206) 56 (84) bytes de datos. 64 bytes de MIL04S29-In-F14.1e100.neto (216.58.205.206): icmp_seq = 1 ttl = 52 time = 29.2 ms [] 

Tenga en cuenta que los cambios en la asignación entre usuarios y usuarios de Selinux serán efectivos solo después de un nuevo inicio de sesión.

Roles Selinux

La segunda parte en un contexto selinux se trata de roles. Como puede ver en la salida de Semanage user -l Arriba, cada usuario de Selinux puede desempeñar un conjunto especificado de roles Selinux: cuando hay múltiples roles para un usuario de Selinux, el usuario también puede cambiar entre ellos utilizando el nuevo rol comando, usando la siguiente sintaxis:

$ newrole -r newrole 

Para verificar a qué dominios puede acceder un papel específico, debe ejecutar el Seinfo dominio. Esto es proporcionado por el setools-console paquete. Por ejemplo, para verificar a qué dominios se puede acceder desde el rol Stuff_r, ejecutamos:

# seinfo -rstuff_r -x 
$ SEINFO -RSTAFF_R -X (Output Truncated) Roles dominados por personal: staff_r tipos: Abrt_helper_t alsa_home_t antivirus_home_t httpd_user_content_t httpd_user_htaccess_t [...] 

Dominios y tipos

La tercera parte de un contexto de Selinux se trata de dominios y tipos, y es identificable al tener el sufijo _T en la representación del contexto. Nos referimos a él como tipo si estamos hablando de un objeto o como dominio si estamos hablando de un proceso. Vamos a ver.

He creado un simple .archivo html dentro del apache virtualhost predeterminado en mi máquina CentOS 7: como puede ver el archivo heredado el contexto selinux del directorio en el que se creó:

-RW-R-R--. raíz raíz no confined_u: object_r: httpd_sys_content_t: prueba s0.html 

Con el httpd_sys_content_t, El proceso HTTPD puede leer el archivo, como se confirma navegando en el navegador.

Ahora intentemos cambiar el tipo de archivo y ver el efecto que tiene este cambio. Para manipular el contexto de Selinux usamos el chcon dominio:

# chcon -t user_home_t/var/www/html/test.html 

Cambiamos el tipo selinux del archivo a user_home_t: Este es el tipo utilizado por los archivos ubicados en los usuarios
Directorios de inicio por defecto. Ejecutar LS -Z en el archivo nos da la confirmación:

no confined_u: object_r: user_home_t: s0/var/www/html/test.html 

Si ahora intentamos llegar al archivo desde el navegador, como se esperaba.

El chcon El comando se puede utilizar no solo para cambiar el tipo de archivo, sino también el usuario y la parte de rol del contexto de Selinux. Al usarlo para cambiar un contexto de directorio, también puede ejecutarse de manera recursiva con el conmutador -r, y puede asignar un contexto también por referencia: en este caso no especificamos las partes del contexto que se cambiarán directamente, pero proporcionamos la referencia a el archivo o directorio El contexto debe cumplir con. Por ejemplo, hagamos la prueba.Archivo HTML anterior, adquiere el contexto del directorio/var/www/html:

# chcon --reference/var/www/html/var/www/html/test.html && ls -z/var/www/html/test.html 

Podemos ver en la salida de los comandos anteriores, que ahora el contexto del archivo ha cambiado nuevamente, y ahora es el mismo que el del directorio/var/www/html:

system_u: object_r: httpd_sys_content_t: s0/var/www/html/test.html 

Observe que los cambios realizados con el comando CHCON sobrevivirán a un reinicio pero no un reiniciado de los archivos: en ese caso, los archivos se establecerán de acuerdo con la política original de Selinux, y los cambios se perderán. Entonces, ¿cómo podemos hacer que el cambio sea persistente?? Debemos agregar una nueva regla a la política de Selinux utilizando el comando semanage.

Digamos que queremos agregar una regla dictando que todos los archivos creados en el directorio/inicio/EGDOC/prueba deberían tener, por defecto, el httpd_sys_content_t type. Aquí está el comando que debemos ejecutar:

Semanage fcontext -a -t httpd_sys_content_t/home/egdoc/test (/.*)? 

Primero invocamos el comando de semanage especificando fcontext Para modificar los contextos de archivo, luego agregamos el -a cambiar para agregar un registro y el -T uno, para especificar que queremos cambiar el tipo de parte del contexto a la que sigue inmediatamente.

Finalmente, proporcionamos la ruta del directorio junto con una expresión regular que significa: /home /egdoc /ruta de prueba seguida de /carácter, seguido de cualquier número de carácter, toda la expresión coincide 0 o 1 vez. Esta expresión regular coincidirá con todos los nombres de archivo.

Ahora corremos el restaurante comando con el -Riñonal opción (recursiva) en el directorio, para aplicar la política. Dado que ahora la regla que agregamos anteriormente es parte de la política en sí, todos los archivos contenidos en el directorio, y también los recién creados, tendrán el contexto que especificamos en la regla.

Configuración booleana de Selinux

La configuración de los booleanos de Selinux puede cambiar el comportamiento de Selinux y se manejan mediante el uso de valores booleanos. Podemos interactuar con ellos mediante el uso de dos comandos: getsebool y setsebool, el primero se usa para consultar el estado de una opción y el segundo para cambiarlo.

Si pasamos la opción que queremos verificar para obtener GetSebool, nos dará el estado de esa opción, si la proporcionamos el -a Cambiar, en su lugar, nos mostrará todas las configuraciones disponibles y su respectivo estado booleano. Por ejemplo, si queremos verificar el estado de las opciones relacionadas con HTTPD, podríamos ejecutar:

$ getsebool -a | grep httpd 

Aquí hay un extracto muy corto de la salida:

[[email protected] ~] $ getsebool -a | GREP httpd httpd_anon_write -> Off httpd_builtin_scripting -> on […] 

Intentemos cambiar el estado de la opción httpd_anon_write y activarlo. Como se mencionó anteriormente, usamos setseBool para la tarea:

# setsebool httpd_anon_write 1 

Si ahora verificamos el valor de la opción, debería haberse activado:

[[email protected] ~] $ getsebool -a | GREP httpd_anon_write httpd_anon_write -> en 

Todo salió como se esperaba. Sin embargo, los cambios realizados de esta manera no sobrevivirán a un reinicio. Para lograr esta tarea debemos usar el mismo comando, pero agregando el -PAG Switch: al usarlo, los cambios se escribirán en la política y persistirán.

Hay muchas cosas que uno debe considerar al usar Selinux, y ajustarlo para obtener un comportamiento específico, mientras que mantener los permisos menos posibles puede ser una tarea que requiere mucho tiempo. Sin embargo, no es una buena idea, en miopinion, para apagarlo por completo. Siga experimentando hasta que esté satisfecho con los resultados y llegue a la configuración deseada:
Obtendrá tanto en seguridad como en conocimiento.

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Comandos de Linux: los 20 comandos más importantes que necesitas ..
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Comandos básicos de Linux
  • Descarga de Linux
  • Instale Arch Linux en VMware Workstation
  • ¿Puede Linux obtener virus?? Explorando la vulnerabilidad de Linux ..
  • Registro avanzado y auditoría en Linux