• NADIA ARELI ELIAS MARTINEZ

    ISC 3°B

    ITESZ

    SELinux

    Sistemas Operativos

    Bruno Barboza Orozco

  • SELinux (“Security Enhanced Linux”)

    Es un sistema de control obligatorio de acceso basado en la interfaz LMS. En la práctica, el número pregunta a SELinux antes de cada llamada al sistema para saber si un proceso está autorizado a realizar dicha operación.
    La seguridad mejorada de Linux utiliza una serie de reglas conocidas en conjunto como una política, para autorizar o denegar operaciones. Estas reglas son difíciles de crear. Afortunadamente se proporcionan dos políticas estándar (dirigida y estricta) para evitar gran parte del trabajo de configuración.
    Con SELinux, la gestión de permisos es completamente distinta a las de los sistemas Unix tradicionales. Los permisos de un proceso dependen de su contexto de seguridad. El contexto está definido por la identidad del usuario que lanza el proceso y el rol y el dominio del usuario tenía en ese momento. Los permisos realmente dependen del dominio, pero los oles controlan la tradición entre dominios.

  • Contextos de seguridad y usuarios Unix

    A un usuario se le asigna un contexto de seguridad predeterminado al iniciar sesión. Se define como el dominio actual y el dominio de todos los procesos hijos que lance. Si se desea cambiar el rol actual y su dominio asociado, debe ejecutar newrole -r rol_r -t dominio_t (habitualmente se permite un único dominio para el rol determinado por lo que puede omitir el parámetro –t). Este programa lo autenticará pidiéndole que ingrese su contraseña. Esta característica impide que los programas cambien de rol de forma autentica. Los cambios solo pueden ocurrir si se permiten explícitamente en la política de seguridad de SELinux.

  • Los programas heredan el dominio del usuario que los ejecuta de forma predeterminada, pero las políticas estándar de SELinux esperan que muchos programas importantes se ejecuten en dominios dedicados. El mecanismo de transición automática de dominios permite otorgar exclusivamente los permisos que requiere cada programa. Es un principio fundamental de SELinux.

  • CONFIGURACION DE SELinux

    Todos los núcleos estándar que debían proporcionar incluyen compatibilidad con SELinux. Todas las herramientas básicas Unix son compatibles con SELinux sin ninguna modificación. Es relativamente sencillo habilitar SELinux.
    El paquete selinux-policy-default contiene un conjunto de reglas estándar. De forma predeterminada, esta política sólo restringe el acceso a algunos servicios expuestos ampliamente. Las sesiones de usuario no están restringidas y, por lo tanto, es improbable que SELinux bloquee una operación legítima de un usuario. Sin embargo, mejora la seguridad de los servicios del sistema que estén ejecutando en la máquina. Para establecer una política equivalente a las reglas «estrictas» antiguas debe deshabilitar el módulo unconfined (detallamos la gestión de módulos más adelante en esta sección).

  • Después de instalar una política, debe etiquetar todos los archivos disponibles (lo que quiere decir asignarles un tipo). Debe iniciar esta operación manualmente con fixfiles relabel.

    Ahora el sistema SELinux está listo. Para habilitarlo debe añadir el parámetro selinux=1 security=selinux al núcleo Linux. El parámetro audit=1 habilita los registros de SELinux que graban todas las operaciones denegadas. Por último, el parámetro enforcing=1 hace que se apliquen las reglas: sin él, SELinux trabaja en el modo predeterminado permissive (permisivo) en el que las acciones prohibidas son registradas pero son ejecutadas de todas formas. Por lo tanto, debe modificar el archivo de configuración del gestor de arranque GRUB para añadir los parámetros que desee.

  • Es importante saber que el script selinux-activate automatiza todas estas operaciones y fuerza el etiquetado de archivos en el siguiente reinicio (lo que evita que se creen nuevos archivos sin etiquetar cuando SELinux aún no está activo mientras se realiza el etiquetado).

  • Gestión de un sistema SELinux

    La política SELinux consiste en un conjunto de reglas modular, y su instalación detecta y habilita automáticamente todos los módulos necesarios en función de los servicios que se encuentren instalados. El sistema, por lo tanto, se encuentra operativo de forma inmediata. Sin embargo, cuando instale un servicio después de haber instalado la política SELinux deberá habilitar el módulo correspondiente manualmente. Para ello existe el programa semodule. Lo que es más, debería tener la capacidad de definir los roles que cada usuario puede adoptar, lo que puede realizar con el programa semanage.

  • Gestión de módulos SELinux

    Los módulos SELinux disponibles se almacenan en el directorio /usr/share/selinux/default/. Para habilitar uno de estos módulos en la configuración actual debe ejecutar semodule -i módulo.pp.bz2. La extensión pp.bz2 significa paquete de política («policy package») comprimido mediante bzip2.

  • Puede eliminar un módulo de la configuración actual con semodule -r módulo. Por último, semodule -l enumera los módulos instalados actualmente. También imprime los números de versión correspondientes. Los módulos pueden ser activados selectivamente con semodule -e y desactivados mediante semodule -d.

    Semodule carga inmediatamente la nueva configuración a menos que utilice la opción -n. De forma predeterminada, el programa actúa sobre la configuración actual (indicada por la variable SELINUXTYPE en el archivo /etc/selinux/config), pero también puede modificar una distinta especificándola con la opción -s.

  • Gestión de identidades

    Cada vez que un usuario inicia sesión, se le asigna una identidad SELinux. Esta identidad determina los roles que puede adoptar. Puede configurar estas correspondencias (entre el usuario y la identidad y entre la identidad y los roles) con el programa semanage.
    Es muy recomendable que lea la página de manual semanage (8), incluso cuando la sintaxis del programa tienda a ser similar para todos los conceptos que gestiona. Encontrará muchas opciones comunes a todas las subórdenes: -a para agregar, -d para borrar, -m para modificar, -l para enumerar y -t para indicar un tipo (o dominio).

  • Semanage login -l enumera las correspondencias actuales entre identificadores de usuarios y entidades SELinux. Los usuarios que no aparecen explícitamente poseen la identidad predeterminada, que corresponde al elemento default. Si ejecuta semanage login -a -s user_u usuario, asociará la identidad user_u con el usuario dado. Por último, semanage login -d usuario elimina la asociación asignada al usuario.

  • Gestión de contextos de archivos, puertos y valores booleanos

    Cada módulo de SELinux proporciona un conjunto de reglas de etiquetado de archivos, pero también es posible crear reglas de etiquetado personalizadas para adaptarse a algún caso específico. La primera ejecución registra las nuevas reglas de etiquetado, mientras que la segunda hace que se reinicialicen los tipos de archivo según las reglas de etiquetado actuales.

  • Algunos módulos de SELinux exportan opciones booleanas que puede ajustar para alterar el comportamiento de las reglas predeterminadas. Puede utilizar la herramienta getsebool para inspeccionar estas opciones (getsebool opcion_booleana muestra una opción concreta, mientras que getsebool -a muestra todas). La orden setsebool opción_booleana valor cambia el valor de una opción booleana. La opción -P hace que el cambio sea permanente, es decir que el nuevo valor se convierte en el predeterminado y se mantiene después de reiniciar el equipo.

  • Adaptación de las reglas

    Puesto que la política SELinux es modular, puede ser interesante desarrollar nuevos módulos para aplicaciones (posiblemente propias) que carezcan de uno. Estos nuevos módulos completarán la política de referencia.
    El archivo .te es el más importante. Define las reglas. El archivo .fc define los «contextos de archivo», es decir los tipos asignados a los archivos relacionados con este módulo. Los datos del archivo .fc se utilizan durante el paso de etiquetado de archivos. Por último, el archivo .if define la interfaz del módulo: es una serie de «funciones públicas» que otros módulos pueden utilizar para interactuar con el módulo que se está creando.

  • Creación de un archivo .fc

    Puede utilizar expresiones regulares para asignar el mismo contexto de seguridad a múltiples archivos, o incluso a un árbol de directorios completo.

    Creación de un archivo .if

    La primera interfaz («myapp_domtrans») controla quién puede utilizar la aplicación. La segunda («myapp_read_log») otorga permisos de escritura a los archivos de registro de la aplicación.
    Cada interfaz debe generar un conjunto de reglas válido que pueda ser integrado en un archivo .te. Por lo tanto, debe declarar todos los tipos que utilizará (con el macro gen_require) y utilizar directivas estándar para otorgar permisos. Sepa que puede utilizar interfaces proporcionadas por otros módulos. La siguiente sección dará más explicaciones sobre cómo expresar estos permisos.

  • Escritura de un archivo .te

    Para estructurar la política correctamente, los desarrolladores de SELinux utilizaron un procesador de macros. En lugar de duplicar muchas directivas allow similares, crearon «funciones macro» para utilizar una lógica de más alto nivel que también resulta en una política mucho más legible.

    Las «interfaces» SELinux son sólo funciones macro que serán substituidas por un conjunto de reglas en tiempo de compilación. De la misma forma, algunos permisos son en realidad conjuntos de permisos que son reemplazados por sus valores en tiempo de compilación.

  • Análisis de una traza SELinux

{"cards":[{"_id":"7b0780a6553bbadd5c000015","treeId":"7b083423553bbadd5c000010","seq":11708607,"position":0.5,"parentId":null,"content":"![](https://www.filepicker.io/api/file/sDGHPJwR8OcJdOA2ZtyI)"},{"_id":"7b08340a553bbadd5c000012","treeId":"7b083423553bbadd5c000010","seq":11709326,"position":1,"parentId":null,"content":"# **NADIA ARELI ELIAS MARTINEZ**\n## ISC 3°B\n## ITESZ\n## SELinux\n## Sistemas Operativos\n## Bruno Barboza Orozco\n"},{"_id":"7b07946a553bbadd5c000013","treeId":"7b083423553bbadd5c000010","seq":11709323,"position":1,"parentId":"7b08340a553bbadd5c000012","content":"# **SELinux (“Security Enhanced Linux”)**\nEs un sistema de control obligatorio de acceso basado en la interfaz LMS. En la práctica, el número pregunta a SELinux antes de cada llamada al sistema para saber si un proceso está autorizado a realizar dicha operación.\nLa seguridad mejorada de Linux utiliza una serie de reglas conocidas en conjunto como una política, para autorizar o denegar operaciones. Estas reglas son difíciles de crear. Afortunadamente se proporcionan dos políticas estándar (dirigida y estricta) para evitar gran parte del trabajo de configuración.\nCon SELinux, la gestión de permisos es completamente distinta a las de los sistemas Unix tradicionales. Los permisos de un proceso dependen de su contexto de seguridad. El contexto está definido por la identidad del usuario que lanza el proceso y el rol y el dominio del usuario tenía en ese momento. Los permisos realmente dependen del dominio, pero los oles controlan la tradición entre dominios.\n"},{"_id":"7afba6a3cca9adbf5c00000e","treeId":"7b083423553bbadd5c000010","seq":11708911,"position":0.5,"parentId":"7b07946a553bbadd5c000013","content":"## **Contextos de seguridad y usuarios Unix**\nA un usuario se le asigna un contexto de seguridad predeterminado al iniciar sesión. Se define como el dominio actual y el dominio de todos los procesos hijos que lance. Si se desea cambiar el rol actual y su dominio asociado, debe ejecutar newrole -r rol_r -t dominio_t (habitualmente se permite un único dominio para el rol determinado por lo que puede omitir el parámetro –t). Este programa lo autenticará pidiéndole que ingrese su contraseña. Esta característica impide que los programas cambien de rol de forma autentica. Los cambios solo pueden ocurrir si se permiten explícitamente en la política de seguridad de SELinux."},{"_id":"7afbb1c8cca9adbf5c000008","treeId":"7b083423553bbadd5c000010","seq":11708910,"position":1,"parentId":"7b07946a553bbadd5c000013","content":"Los programas heredan el dominio del usuario que los ejecuta de forma predeterminada, pero las políticas estándar de SELinux esperan que muchos programas importantes se ejecuten en dominios dedicados. El mecanismo de transición automática de dominios permite otorgar exclusivamente los permisos que requiere cada programa. Es un principio fundamental de SELinux. \n"},{"_id":"7afa8645cca9adbf5c00001e","treeId":"7b083423553bbadd5c000010","seq":11709301,"position":0.5,"parentId":"7afbb1c8cca9adbf5c000008","content":""},{"_id":"7afbaaaccca9adbf5c00000b","treeId":"7b083423553bbadd5c000010","seq":11708913,"position":1,"parentId":"7afbb1c8cca9adbf5c000008","content":"## **CONFIGURACION DE SELinux**\n\nTodos los núcleos estándar que debían proporcionar incluyen compatibilidad con SELinux. Todas las herramientas básicas Unix son compatibles con SELinux sin ninguna modificación. Es relativamente sencillo habilitar SELinux.\nEl paquete selinux-policy-default contiene un conjunto de reglas estándar. De forma predeterminada, esta política sólo restringe el acceso a algunos servicios expuestos ampliamente. Las sesiones de usuario no están restringidas y, por lo tanto, es improbable que SELinux bloquee una operación legítima de un usuario. Sin embargo, mejora la seguridad de los servicios del sistema que estén ejecutando en la máquina. Para establecer una política equivalente a las reglas «estrictas» antiguas debe deshabilitar el módulo unconfined (detallamos la gestión de módulos más adelante en esta sección).\n"},{"_id":"7afba901cca9adbf5c00000c","treeId":"7b083423553bbadd5c000010","seq":11708907,"position":2,"parentId":"7afbb1c8cca9adbf5c000008","content":"Después de instalar una política, debe etiquetar todos los archivos disponibles (lo que quiere decir asignarles un tipo). Debe iniciar esta operación manualmente con fixfiles relabel.\n\nAhora el sistema SELinux está listo. Para habilitarlo debe añadir el parámetro selinux=1 security=selinux al núcleo Linux. El parámetro audit=1 habilita los registros de SELinux que graban todas las operaciones denegadas. Por último, el parámetro enforcing=1 hace que se apliquen las reglas: sin él, SELinux trabaja en el modo predeterminado permissive (permisivo) en el que las acciones prohibidas son registradas pero son ejecutadas de todas formas. Por lo tanto, debe modificar el archivo de configuración del gestor de arranque GRUB para añadir los parámetros que desee. \n\n"},{"_id":"7afa85b9cca9adbf5c00001f","treeId":"7b083423553bbadd5c000010","seq":11709307,"position":0.5,"parentId":"7afba901cca9adbf5c00000c","content":"![](https://www.filepicker.io/api/file/UkSAbtNUQhuRk4XzXNV7)"},{"_id":"7afba463cca9adbf5c00000f","treeId":"7b083423553bbadd5c000010","seq":11708912,"position":1,"parentId":"7afba901cca9adbf5c00000c","content":"## **Gestión de un sistema SELinux**\n\nLa política SELinux consiste en un conjunto de reglas modular, y su instalación detecta y habilita automáticamente todos los módulos necesarios en función de los servicios que se encuentren instalados. El sistema, por lo tanto, se encuentra operativo de forma inmediata. Sin embargo, cuando instale un servicio después de haber instalado la política SELinux deberá habilitar el módulo correspondiente manualmente. Para ello existe el programa semodule. Lo que es más, debería tener la capacidad de definir los roles que cada usuario puede adoptar, lo que puede realizar con el programa semanage.\n"},{"_id":"7afba0b8cca9adbf5c000011","treeId":"7b083423553bbadd5c000010","seq":11708915,"position":1,"parentId":"7afba463cca9adbf5c00000f","content":"## **Gestión de módulos SELinux**\n\nLos módulos SELinux disponibles se almacenan en el directorio /usr/share/selinux/default/. Para habilitar uno de estos módulos en la configuración actual debe ejecutar semodule -i módulo.pp.bz2. La extensión pp.bz2 significa paquete de política («policy package») comprimido mediante bzip2.\n"},{"_id":"7afba031cca9adbf5c000012","treeId":"7b083423553bbadd5c000010","seq":11708916,"position":2,"parentId":"7afba463cca9adbf5c00000f","content":"Puede eliminar un módulo de la configuración actual con semodule -r módulo. Por último, semodule -l enumera los módulos instalados actualmente. También imprime los números de versión correspondientes. Los módulos pueden ser activados selectivamente con semodule -e y desactivados mediante semodule -d.\n\nSemodule carga inmediatamente la nueva configuración a menos que utilice la opción -n. De forma predeterminada, el programa actúa sobre la configuración actual (indicada por la variable SELINUXTYPE en el archivo /etc/selinux/config), pero también puede modificar una distinta especificándola con la opción -s.\n"},{"_id":"7afa8299cca9adbf5c000021","treeId":"7b083423553bbadd5c000010","seq":11709310,"position":0.5,"parentId":"7afba031cca9adbf5c000012","content":"![](https://www.filepicker.io/api/file/3aIhBmtrS9y1TLxtPJBl)"},{"_id":"7afb9e9bcca9adbf5c000013","treeId":"7b083423553bbadd5c000010","seq":11708918,"position":1,"parentId":"7afba031cca9adbf5c000012","content":"## **Gestión de identidades**\n\nCada vez que un usuario inicia sesión, se le asigna una identidad SELinux. Esta identidad determina los roles que puede adoptar. Puede configurar estas correspondencias (entre el usuario y la identidad y entre la identidad y los roles) con el programa semanage.\nEs muy recomendable que lea la página de manual semanage (8), incluso cuando la sintaxis del programa tienda a ser similar para todos los conceptos que gestiona. Encontrará muchas opciones comunes a todas las subórdenes: -a para agregar, -d para borrar, -m para modificar, -l para enumerar y -t para indicar un tipo (o dominio).\n"},{"_id":"7afb9c66cca9adbf5c000015","treeId":"7b083423553bbadd5c000010","seq":11708922,"position":1,"parentId":"7afb9e9bcca9adbf5c000013","content":"## **Gestión de contextos de archivos, puertos y valores booleanos**\n\nCada módulo de SELinux proporciona un conjunto de reglas de etiquetado de archivos, pero también es posible crear reglas de etiquetado personalizadas para adaptarse a algún caso específico. La primera ejecución registra las nuevas reglas de etiquetado, mientras que la segunda hace que se reinicialicen los tipos de archivo según las reglas de etiquetado actuales.\n"},{"_id":"7afb677bcca9adbf5c000017","treeId":"7b083423553bbadd5c000010","seq":11709012,"position":1,"parentId":"7afb9c66cca9adbf5c000015","content":"## **Adaptación de las reglas**\n\nPuesto que la política SELinux es modular, puede ser interesante desarrollar nuevos módulos para aplicaciones (posiblemente propias) que carezcan de uno. Estos nuevos módulos completarán la política de referencia.\nEl archivo .te es el más importante. Define las reglas. El archivo .fc define los «contextos de archivo», es decir los tipos asignados a los archivos relacionados con este módulo. Los datos del archivo .fc se utilizan durante el paso de etiquetado de archivos. Por último, el archivo .if define la interfaz del módulo: es una serie de «funciones públicas» que otros módulos pueden utilizar para interactuar con el módulo que se está creando.\n"},{"_id":"7afb601dcca9adbf5c00001a","treeId":"7b083423553bbadd5c000010","seq":11709048,"position":1,"parentId":"7afb677bcca9adbf5c000017","content":"## **Análisis de una traza SELinux**"},{"_id":"7afb5e26cca9adbf5c00001c","treeId":"7b083423553bbadd5c000010","seq":11709054,"position":1.5,"parentId":"7afb677bcca9adbf5c000017","content":"![](https://www.filepicker.io/api/file/p1dAE4MiTcOPAtzy3Ily)"},{"_id":"7afb6682cca9adbf5c000018","treeId":"7b083423553bbadd5c000010","seq":11709018,"position":2,"parentId":"7afb9c66cca9adbf5c000015","content":"### **Creación de un archivo .fc**\n\nPuede utilizar expresiones regulares para asignar el mismo contexto de seguridad a múltiples archivos, o incluso a un árbol de directorios completo.\n\n### **Creación de un archivo .if**\nLa primera interfaz («myapp_domtrans») controla quién puede utilizar la aplicación. La segunda («myapp_read_log») otorga permisos de escritura a los archivos de registro de la aplicación.\nCada interfaz debe generar un conjunto de reglas válido que pueda ser integrado en un archivo .te. Por lo tanto, debe declarar todos los tipos que utilizará (con el macro gen_require) y utilizar directivas estándar para otorgar permisos. Sepa que puede utilizar interfaces proporcionadas por otros módulos. La siguiente sección dará más explicaciones sobre cómo expresar estos permisos.\n"},{"_id":"7afb6397cca9adbf5c000019","treeId":"7b083423553bbadd5c000010","seq":11709025,"position":3,"parentId":"7afb9c66cca9adbf5c000015","content":"### **Escritura de un archivo .te**\n\nPara estructurar la política correctamente, los desarrolladores de SELinux utilizaron un procesador de macros. En lugar de duplicar muchas directivas allow similares, crearon «funciones macro» para utilizar una lógica de más alto nivel que también resulta en una política mucho más legible.\n\nLas «interfaces» SELinux son sólo funciones macro que serán substituidas por un conjunto de reglas en tiempo de compilación. De la misma forma, algunos permisos son en realidad conjuntos de permisos que son reemplazados por sus valores en tiempo de compilación.\n"},{"_id":"7afb9a7acca9adbf5c000016","treeId":"7b083423553bbadd5c000010","seq":11708924,"position":2,"parentId":"7afb9e9bcca9adbf5c000013","content":"Algunos módulos de SELinux exportan opciones booleanas que puede ajustar para alterar el comportamiento de las reglas predeterminadas. Puede utilizar la herramienta getsebool para inspeccionar estas opciones (getsebool opcion_booleana muestra una opción concreta, mientras que getsebool -a muestra todas). La orden setsebool opción_booleana valor cambia el valor de una opción booleana. La opción -P hace que el cambio sea permanente, es decir que el nuevo valor se convierte en el predeterminado y se mantiene después de reiniciar el equipo. "},{"_id":"7afa81a2cca9adbf5c000022","treeId":"7b083423553bbadd5c000010","seq":11709317,"position":3,"parentId":"7afb9e9bcca9adbf5c000013","content":"![](https://www.filepicker.io/api/file/mzngAHzQ8aJPYNEKNoNg)"},{"_id":"7afb9d47cca9adbf5c000014","treeId":"7b083423553bbadd5c000010","seq":11708919,"position":2,"parentId":"7afba031cca9adbf5c000012","content":"Semanage login -l enumera las correspondencias actuales entre identificadores de usuarios y entidades SELinux. Los usuarios que no aparecen explícitamente poseen la identidad predeterminada, que corresponde al elemento __default__. Si ejecuta semanage login -a -s user_u usuario, asociará la identidad user_u con el usuario dado. Por último, semanage login -d usuario elimina la asociación asignada al usuario."},{"_id":"7afa83bccca9adbf5c000020","treeId":"7b083423553bbadd5c000010","seq":11709309,"position":3,"parentId":"7afba463cca9adbf5c00000f","content":"![](https://www.filepicker.io/api/file/frPUaxxURUmre1lRFLvN)"},{"_id":"7afba242cca9adbf5c000010","treeId":"7b083423553bbadd5c000010","seq":11709289,"position":2,"parentId":"7afba901cca9adbf5c00000c","content":""},{"_id":"7afba805cca9adbf5c00000d","treeId":"7b083423553bbadd5c000010","seq":11708908,"position":3,"parentId":"7afbb1c8cca9adbf5c000008","content":"Es importante saber que el script selinux-activate automatiza todas estas operaciones y fuerza el etiquetado de archivos en el siguiente reinicio (lo que evita que se creen nuevos archivos sin etiquetar cuando SELinux aún no está activo mientras se realiza el etiquetado)."},{"_id":"7afbaca3cca9adbf5c00000a","treeId":"7b083423553bbadd5c000010","seq":11708903,"position":2,"parentId":"7b07946a553bbadd5c000013","content":"![](https://www.filepicker.io/api/file/zrUidxLsSSSZmRzC7HtX)"},{"_id":"7afbae82cca9adbf5c000009","treeId":"7b083423553bbadd5c000010","seq":11708898,"position":2,"parentId":"7b08340a553bbadd5c000012","content":"![](https://www.filepicker.io/api/file/UoFO6jZoQJecZdrnxcvy)"}],"tree":{"_id":"7b083423553bbadd5c000010","name":"SELinux","publicUrl":"selinux","latex":true}}