Gentoo Logo

[ << ] [ < ] [ Inicio ] [ > ] [ >> ]


4. Permisivo, no confinado, deshabilitado o lo que no...

Contenido:

4.a. Estados de SELinux

Introducción

Cuando SELinux está disponible, normalmente se encontrará en uno de los tres estados de su sistema: deshabilitado, permisivo o forzado.

Deshabilitado

Cuando la orden getenforce devuelve "Disabled", entonces SELinux no está corriendo en su sistema. Incluso aunque está construido en su núcleo, definitivamente está deshabilitado. Su sistema correrá con los controles de acceso discrecionales normales (las reglas de permiso usuales para los entornos Linux estándar), sin embargo, los controles de acceso obligatorio no estarán activos.

Cuando SELinux está deshabilitado, esto significa que los ficheros, directorios, etc que se modifican o crean no obtendrán el contexto SELinux correcto que se les debe asignar. Cuando, más adelante, arranque su sistema con SELinux habilitado (permisivo o forzado), algunos problemas podrán surgir ya que el subsistema SELinux no conoce qué etiquetas tienen los ficheros (se usará una etiqueta por defecto que no es accesible por la mayoría de los dominios).

La mejor forma de continuar en este caso es iniciar en modo permisivo y etiquetar de nuevo todo el sistema de ficheros:

Listado de Código 1.1: Etiquetar de nuevo todo el sistema de ficheros

# rlpkg -a -r

Permisivo

Cuando se activa SELinux en modo permisivo (getenforce devuelve "Permissive"), entonces SELinux está habilitado y tiene cargada una directriz. Cada acceso que realiza un proceso se comprueba en las reglas de la directriz y, en caso de que un acceso no esté permitido, éste se registrará (a menos que la denegación esté marcada como dontaudit) pero no se prohibirá.

El modo permisivo es perfecto para familiarizarse con SELinux y preparar el sistema para el modo "forzado" que se empleará en el futuro. Mientras se trabaja en modo permisivo, las aplicaciones que no están integradas con SELinux funcionará como si SELinux no estuviera instalado. Esta situación es perfecta para validar si un problema es causado por SELinux o no: si estando en modo permisivo el problema aún persiste, entonces el problema no lo está causando SELinux.

Sin embargo, hay una salvedad: si la aplicación está integrada con SELinux (es decir, sabe que está corriendo en un entorno con SELinux activado y es capaz de hacer llamadas específicas de SELinux) puede que reaccione de forma diferente. Aunque esto es a menudo (pero no siempre) debido a unas malas prácticas en la programación, algunas aplicaciones comprueban si SELinux está activado y basan su flujo funcional en este resultado, independientemente si el estado es permisivo o forzado.

Para averiguar si una aplicación está integrada o no con SELinux, simplemente compruebe si está enlazada con libselinux (haciendo ldd o scanelf, esto es parte del paquete app-misc/pax-utils):

Listado de Código 1.2: Comprobar si /bin/ls está integrada con SELinux

# scanelf -n /bin/ls
 TYPE     NEEDED FILE
ET_DYN   libselinux.so.1,librt.so.1,libc.so.6   /bin/ls

Forzado

Si la orden getenforce devuelve "Enforcing", entonces SELinux esta cargado y actuará en base a la directriz. Cuando un proceso intenta realizar alguna actividad que no está permitida por la directriz, esta actividad será registrada (a menos que se defina un dontaudit) y no se permitirá la continuidad de la actividad. Este es el único modo en el que puede decir que SELinux está verdaderamente activo, ya que es el único momento en que la directriz está actuando.

Cambiando entre estados

Dependiendo de su configuración del núcleo Linux, puede conmutar entre estados utilizando los siguientes métodos. La configuración del núcleo puede, sin embargo, hacer que alguna de estas opciones estén deshabilitadas (por ejemplo, un sistema hardened que no permita deshabilitar SELinux de ningún modo).

Usar la orden setenforce:

Listado de Código 1.3: Conmutar entre forzado y permisivo

(Cambiar al modo permisivo)
# setenforce 0

(Cambiar al modo forzado)
# setenforce 1

Usar la opción de inicio enforcing del núcleo:

Listado de Código 1.4: Conmutar entre forzado y permisivo a través de opciones de inicio

(La siguiente línea del cargador del núcleo GRUB, permitiría iniciar en modo permisivo)
kernel /kernel-2.6.39-hardened-r8 root=/dev/md3 rootflags=data=journal enforcing=0

Usar la variable SELINUX /etc/selinux/config:

Listado de Código 1.5: Ajuste SELinux /etc/selinux/config

# cat /etc/selinux/config
# This file controls the state of SELinux on the system on boot.

# SELINUX can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=enforcing

# SELINUXTYPE can take one of these four values:
#       targeted - Only targeted network daemons are protected.
#       strict   - Full SELinux protection.
#       mls      - Full SELinux protection with Multi-Level Security
#       mcs      - Full SELinux protection with Multi-Category Security
#                  (mls, but only one sensitivity level)
SELINUXTYPE=strict

Cuando quiera cambiar del modo permisivo al forzado, se recomienda hacerlo en el orden descrito arriba:

  1. En primer lugar inicie el sistema en modo permisivo, entre en él y verifique que su contexto es correcto (id -Z), luego conmute a forzado (setenforce 1). Puede comprobar ahora si su sistema está funcionado correctamente.
  2. A continuación, inicie el sistema con el parámetro del núcleo enforcing=1 (a menos que inicie con un initramfs, lea más arriba en este mismo manual). De esta forma, sus sistema se iniciará en modo forzado, si las cosas van mal, simplemente reinicie, elimine la opción y volverá al modo permisivo.
  3. Finalmente, edite /etc/selinux/config para que los cambios sean persistentes.

Modo Dominio permisivo

Puede también optar por marcar un solo dominio permisivo mientras ejecuta el resto del sistema en modo forzado. Por ejemplo, para marcar mplayer_t como un dominio permisivo (lo que implica que SELinux no forzará nada):

Listado de Código 1.6: Marcar mplayer_t como permisivo

# semanage permissive -a mplayer_t

Con la opción -d, puede eliminar la marca permisiva de nuevo.

4.b. Tipos de directriz SELinux

Introducción

Aparte del estado de SELinux, también se ofrecen distintos tipos de directriz. Estos tipos se diferencian entre ellos en que tienen características específicas de SELinux habilitadas o deshabilitadas. Dentro de Gentoo, se soportan tres (una cuarta también está disponible, como veremos): targeted, strict, mcs (y mls).

El tipo utilizado en un sistema se declara en /etc/selinux/config:

Listado de Código 2.1: La información SELINUXTYPE en /etc/selinux/config

# cat /etc/selinux/config
# This file controls the state of SELinux on the system on boot.

# SELINUX can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=enforcing

# SELINUXTYPE can take one of these four values:
#       targeted - Only targeted network daemons are protected.
#       strict   - Full SELinux protection.
#       mls      - Full SELinux protection with Multi-Level Security
#       mcs      - Full SELinux protection with Multi-Category Security
#                  (mls, but only one sensitivity level)
SELINUXTYPE=strict

strict (sin dominios no confinados)

El tipo de directriz strict es aquél que se describió en capítulos anteriores y casualmente se trata del tipo más fácil de comprender. Con el tipo de directriz strict, todas y cada una de las aplicaciones que se ejecutan lo hacen en un dominio que tiene privilegios limitados. Aunque hay dominios altamente privilegiados, nunca son ilimitados en sus privilegios.

targeted (utilizando dominios no confinados)

El tipo de directriz targeted es similar al strict con un añadido importante: el soporte para dominios no confinados. Las aplicaciones (o usuarios) que corren en un dominio no confinado prácticamente no tienen límite en sus privilegios. Los dominios no confinados se utilizan normalmente para los usuarios y las aplicaciones de usuario, sin embargo, el inicio del sistema y otros dominios se marcan también como "no confinados".

La idea detrás de la directriz targeted es que los servicios orientados a red que están corriendo en dominios (confinados) regulares mientras que el resto utiliza el control de acceso discrecional estándar que ofrece Linux. Estos otros dominios corren como "no confinados".

mcs (utiliza categorías múltiples)

La introducción de mls y mcs ofrece la capacidad multi-tenancy: varias instancias de la misma aplicación pueden ejecutarse, pero cada instancia se debe confinar respecto a las otras (en lugar de tener todos los procesos en el mismo dominio y por lo tanto los mismo privilegios).

Un ejemplo sencillo es la virtualización: una máquina virtual que corre en el dominio qemu_t necesita privilegios de escritura en el fichero imagen que contiene el sistema operativo de la máquina virtual. Sin embargo, si correo dos máquinas, no deseará que una de ellas escriba en el fichero imagen de la otra y viceversa. Con dominios regulares, necesitará ofrecer este comportamiento. Con mcs, puede darle a cada instancia en ejecución una categoría específica (un número) y únicamente conceder privilegios de escritura al fichero de la máquina virtual con la categoría (el número) correcta.

mls (utilizando múltiples niveles de seguridad)

El tipo de directriz mls está disponible, pero aún no está soportado por Gentoo Hardened. Con este tipo de directriz, es posible ofrecer niveles de sensibilidad a ficheros y recursos así como a dominios. Los niveles de sensibilidad se pueden expresar mejor en los términos public, private, confidential o strictly confidential (público, privado, confidencial o estrictamente confidencial). Con MLS, puede marcar un fichero con un (o un conjunto) nivel de sensibilidad y asegurarse de que únicamente los dominios con el nivel de sensibilidad correcto puede acceder a él.

Conmutando entre tipos

No se recomienda conmutar entre tipos con frecuencia. En el mejor de los casos, elegimos un tipo de directriz en el momento de instalar y nos ajustamos a él. No es imposible (ni tampoco muy difícil) cambiar entre tipos.

Asegúrese de que su variable POLICY_TYPES en make.conf ya contiene el tipo de directriz destino y que se han reconstruido los paquetes de la directriz de SELinux. Si este no es su caso, edite la variable POLICY_TYPES para incluir la directriz destino y reconstruya todos los paquetes de directriz SELinux utilizando emerge $(qlist -IC sec-policy).

Ahora cambie sus sistema la modo permisivo (permissive) utilizando setenforce 0 o, si su sistema no permite el cambio de modo, edite /etc/selinux/config para que el sistema arranque en modo permisivo. Si no puede utilizar setenforce 0 entonces necesitará reiniciar ahora de modo que el sistema funcione en modo permisivo.

A continuación, edite /etc/selinux/config y cambie la variable SELINUXTYPE de la directriz actual a la nueva. Esto le indicará a SELinux que cargue la directriz correcta cuando se inicie el sistema.

Ahora vaya a los módulos construidos para la directriz en /usr/share/selinux ya que necesitamos cargar la nueva directriz (ya que actualmente el sistema está corriendo con la antigua). El ejemplo de abajo muestra como hacer esto si viene de un tipo de directriz estricto strict y quiere ir al tipo mcs:

Listado de Código 2.2: Cargar la directriz mcs

# cd /usr/share/selinux/mcs
# semodule -b base.pp -i $(ls *.pp | grep -v base.pp | grep -v unconfined.pp)

Ahora su sistema está corriendo con la directriz mcs cargada, pero observará que se producen múltiples denegaciones de acceso a la hora de realizar cualquier acción en el sistema de ficheros, ya que los ficheros de su sistema no están etiquetados correctamente: El tipo de directriz mcs requiere a las etiquetas tener una etiqueta de sensibilidad sobre ellas, lo cual no es el caso si utiliza la directriz estricta. Por lo tanto, reetiquetemos completamente el sistema de ficheros, incluyendo aquéllas localizaciones que podrían estar ocultas debido a que otros sistemas de ficheros se han montado sobre ellas.

Listado de Código 2.3: Reetiquetar completamente el sistema de ficheros

(Sustituya "strict" por su SELINUXTYPE, y utilice "lib" en lugar de "lib64" si tiene un sistema de 32 bits)
# rlpkg -a -r
# mount -o bind / /mnt/gentoo
# setfiles -r /mnt/gentoo /etc/selinux/strict/contexts/files/file_contexts /mnt/gentoo/dev
# setfiles -r /mnt/gentoo /etc/selinux/strict/contexts/files/file_contexts /mnt/gentoo/lib64
# umount /mnt/gentoo

Para terminar, edite /etc/fstab y actualice los parámetros rootcontext= para incluir también una etiqueta de sensibilidad (en caso de que cambiara a mcs o mls) o ninguna (en caso de que cambiara a targeted o strict).

Listado de Código 2.4: Cambiar /etc/fstab

# Ejemplo cuando cambiamos de strict a mcs
tmpfs  /tmp  tmpfs  defaults,noexec,nosuid,rootcontext=system_u:object_r:tmp_t:s0  0 0

Una vez realizadas todas estas acciones, reinicie su sistema para asegurarse de que funciona correctamente (también la secuencia de arranque).


[ << ] [ < ] [ Inicio ] [ > ] [ >> ]


Imprimir

Ver completo

Página actualizada 22 de enero, 2013

Sumario: Su sistema puede encontrarse en muchos estados SELinux. En este capítulo, el ayudaremos a cambiar entre varios estados y directrices.

Chris PeBenito
Autor

Sven Vermeulen
Autor

Chris Richards
Autor

José María Alonso
Traductor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.