Capítulo 4. Política Destinado
La política destinada es la política predeterminada de SELinux usada en Fedora 11. Cuando la política destinada está en uso, los procesos son destinados a correr en dominios confinados, y los procesos que no son destinados a correr en un dominio corren en un dominio no confinado. Por ejemplo, por defecto, los usuarios que ingresaron corren en el dominio unconfined_t
, y los procesos del sistema iniciado por init corren en el dominio initrc_t
- ambos dominios están no confinados.
Unconfined domains (as well as confined domains) are subject to executable and writeable memory checks. By default, subjects running in an unconfined domain can not allocate writeable memory and execute it. This reduces vulnerability to
buffer overflow attacks. These memory checks are disabled by setting Booleans, which allow the SELinux policy to be modified at runtime. Boolean configuration is discussed later.
Casi todos los servicios que escuchan en la red se confinan en Fedora 11. También, la mayoría de los procesos que corren como usuario root de Linux y realizan tareas para los usuarios, tales como la aplicación passwd, están confinadas. Cuando un proceso se confina, corre en su propio dominio, tal como el proceso httpd
ejecutándose en el domino httpd_t
. Si un proceso confinado es comprometido por un atacante, dependiendo de la configuración de política de SELinux, el acceso del atacante a recursos y el posible daño que puedan causar es limitado.
El siguiente ejemplo muestra cómo previene SELinux la lectura por parte del Servidor HTTP Apache (httpd
) de archivos que no se etiquetaron correctamente, tales como archivos a usar con Samba. Este es un ejemplo, y no se debe usar en producción. Asume que los paquetes httpd, wget, setroubleshoot-server y audit están instalados, que se usa la política destinada de SELinux y que SELinux está corriendo en modo obligatorio:
Ejecute el comando sestatus
para confirmar que SELinux está activado, se ejecuta en modo obligatorio y que la política destinada se está usando:
$ /usr/sbin/sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 23
Policy from config file: targeted
SELinux status: enabled
is returned when SELinux is enabled. Current mode: enforcing
is returned when SELinux is running in enforcing mode. Policy from config file: targeted
is returned when the SELinux targeted policy is used.
Como usuario root de Linux, ejecute el comando touch /var/www/html/prueba
para crear un archivo.
Ejecute el comando ls -Z /var/www/html/prueba
para ver el contexto SELinux:
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/prueba
Por defecto, los usuarios Linux corren no confinados en Fedora 11, razón por la cual el archivo prueba
se etiqueta con el usuario SELinux unconfined_u
. RBAC se usa para procesos, y no para archivos. Los roles no tienen significado para archivos - el rol object_r
es un rol genérico usado para archivos (en sistemas de archivos persistentes y de red). Bajo el directorio /proc/
, los archivos relacionados con procesos pueden usar el rol system_r
.[] El tipo httpd_sys_content_t
permite al proceso httpd
acceder a este archivo.
Como usuario root de Linux, ejecute el comando service httpd start
para iniciar el proceso httpd
. La salida escomo sigue si httpd
inicia con éxito:
# /sbin/service httpd start
Iniciando httpd: [ OK ]
Cambie al directorio donde su usuario Linux tenga acceso de escritura y ejecute el comando wget http://localhost/prueba
. A menos que hubieran cambios en la configuración predeterminada, este comando tiene éxito:
--2009-05-06 23:00:01-- http://localhost/prueba
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/plain]
Saving to: `prueba'
[ <=> ] 0 --.-K/s in 0s
2009-05-06 23:00:01 (0.00 B/s) - `prueba' saved [0/0]
El comando chcon
reetiqueta archivos; sin embargo, tales cambios de etiquetas no sobreviven cuando el sistema se reetiqueta. Para que los cambios sobrevivan un reetiquetado del sistema, use el comando semanage
, que se discute más adelante. Como usuario root de Linux, corra el siguiente comando para cambiar el tipo a un tipo usado por Samba:
chcon -t samba_share_t /var/www/html/prueba
Ejecute el comando ls -Z /var/www/html/prueba
para ver los cambios:
-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/prueba
Nota: los permisos de DAC actuales permiten al proceso httpd
acceder al prueba
. Cambie al directorio donde el usuario Linux tenga permiso de escritura y ejecute el comando wget http://localhost/prueba
. A menos que hayan cambios en la configuración predeterminada, este comando fallará:
--2009-05-06 23:00:54-- http://localhost/prueba
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
2009-05-06 23:00:54 ERROR 403: Forbidden.
Como usuario root de Linux, corra el comando rm -i /var/www/html/prueba
para borrar prueba
.
Si no necesita que corra httpd
, como usuario root de Linux corra el comando service httpd stop
para detener a httpd
:
# /sbin/service httpd stop
Deteniendo httpd: [ OK ]
Este ejemplo muestra la seguridad adicional agregada por SELinux. Aunque las reglas de DAC permitieron al proceso httpd
acceder a prueba
en el paso 7, dado que estaba etiquetado con un tipo al que el proceso httpd
no tenía acceso, SELinux negó el acceso. Después del paso 7, un error similar al siguiente se guarda en /var/log/messages
:
May 6 23:00:54 localhost setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr"
to /var/www/html/prueba (samba_share_t). For complete SELinux messages.
run sealert -l c05911d3-e680-4e42-8e36-fe2ab9f8e654
Archivos log previos pueden usar el formato /var/log/messages.YYYYMMDD
. Cuando se ejecuta syslog-ng, los archivos log previos pueden usar el formato /var/log/messages.X
. Si los procesos setroubleshootd
y auditd
están ejecutándose, errores similares a los siguientes se registran en /var/log/audit/audit.log
:
type=AVC msg=audit(1220706212.937:70): avc: denied { getattr } for pid=1904 comm="httpd" path="/var/www/html/prueba" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
También, un error similar al siguiente se registra en /var/log/httpd/error_log
:
[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1
] (13)Permission denied: access to /prueba denied
Nota
En Fedora 11, los paquetes
setroubleshoot-server y
audit se instalan por defecto. Estos paquetes incluyen los demonios
setroubleshootd
y
auditd
respectivamente. Estos demonios se ejecutan por defecto. Detener alguno de ellos provoca un cambio de en dónde se graban las negaciones de SELinux. Vaya a
Sección 5.2, “Qué Archivo Log se usa” para más información.