[ << ]
[ < ]
[ 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 |
# setenforce 0
# 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 |
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:
-
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.
-
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.
-
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 |
# 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 |
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 ]
[ > ]
[ >> ]
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logotipo y nombre de Gentoo.
|