
Maximiliano Osorio
12.05.2013, LabComp, UTFSM.
12.05.2013, LabComp, UTFSM.
Presentación basada en:
SELINUX FOR MERE MORTALS
Thomas Cameron, Chief Architect, Red Hat
06.13.2013, RedHat Summit 2013
¿De donde viene?
- Desarrollado por la NSA como un set de parche para el Kernel de Linux
- Lanzado por la NSA bajo la licencia GNU en el 2000
- Adoptado en el kernel de linux el año 2003
¿Qué es SELinux?
- Security-Enhanced Linux (SELinux) es un módulo de seguridad para Linux kernel que proporciona el mecanismo para soportar políticas de seguridad para el control de acceso
- SElinux es un ejemplo de "Mandatory Acess Control" para Linux
DAC vs MAC
- Históricamente, Sistemas Linux y Unix usan "discretionary access control"
- Owner (usuario, grupo, otros)
- Los usuarios pueden cambiar los permisos que sus archivos.
- Un usuario puede dar un chmod +rwx a su directorio. Y nada lo va a parar.
DAC vs MAC
- Root es usuario omnipotente
DAC vs MAC
- Si tu cambias tus opciones DAC en tu home. Y si hay un política MAC en ese lugar que previene que otros usuarios o procesos tengan acceso a tus archivos. Estas un poco más seguro.
DAC vs MAC
- Las políticas pueden ser muy especificas
- Usuarios
- Archivos
- Directorios
- Memoria
- Sockets
- tcp/udp puertos
- etc
Políticas
En un sistema RedHat. Se verán dos políticas generalmente
- "targeted"
- Solo los procesos "targeted" están protegidos por SELinux (Hay unos cientos"
- Lo demás unconfined
- "mls" multilevel/multicategory
- Complejo
- Usado por organizaciones "secretas"
¿Como SELinux funciona?
- La política que estas usando la puedes ver en
/etc/selinux/config
- sestatus
- getenforce
¿Como SELinux funciona?
Bajo dos conceptos.
- Labeling
- Type enforcing
¿Como SELinux funciona?
- Labeling
- Archivos, procesos, ports, etc, son marcados con un contexto de SElinux (SELinux Context)
- Para archivos y directorios, el sistema de archivos maneja los labels
- Para procesos y puertos lo hace el kernel.
¿Como SELinux funciona?
- Labeling
- El formato de label es: user:role:type:level(optional)
- Para esta presentación trabajaremos con targeted por lo tanto el user, role o level no importa.
¿Como SELinux funciona?
- Para ver como funciona vamos a tomar un servicio complejo, que tenga accesos: network, ports y potencialmente acceso al sistema completo.
-
Apache Server.
¿Como SELinux funciona?
Apache se inicia del ejecutable que se encuentra /usr/sbin/
[root@ip251 ~]# ls -lZ /usr/sbin/httpd
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
El contexto que tiene es: httpd_exec_t
¿Como SELinux funciona?
Las configuraciones tiene label: httpd_config
[root@ip251 ~]# ls -lZ /etc | grep http
drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 httpd
¿Como SELinux funciona?
Las logs tiene label: httpd_log_t
[root@ip251 ~]# ls -lZ /var/log/ | grep http
drwx------. root root system_u:object_r:httpd_log_t:s0 httpd
¿Como SELinux funciona?
El contenido tiene label: httpd_sys_content_t
[root@ip251 ~]# ls -lZ /var/www/ | grep html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
Pregunta!
¿A quien le parece correcto que un proceso con label httpd_t pueda trabajar con un archivo con label httpd_conf_t?
Pregunta!
¿A quien le parece correcto que un proceso con label httpd_t pueda trabajar con un archivo con label shadow_t?
¿Como SELinux funciona?
- Type enforcement: Es la parte de la política que dice: "el proceso con el label httpd_t puede tener acceso al archivo con el label httpd_config_t
Como trabajar con labels.
El comando -Z permite ver el contexto
- ls -Z
- id -Z
- ps -Z
- netstat -Z
Como trabajar con labels.
Crear y modificar archivos con contexto
- cp -Z
- mkdir -Z
Como trabajar con labels.
- Existen formas de cambiar el contexto: chcon y restorecon.
- Contextos son seteados de acuerdos a sus padres
- RPM deja los contextos seteados
- Contexto default para users (targeted tiene contexto default unconfined)
Que significa si SELinux me da un error?
- Significa que algo está mal.
- Apagar SELinux es como subir el volumen de la radio cuando el auto está haciendo un ruido extraño
Que significa si SELinux me da un error?
- Quizás un label está mal.
- Más adelante veremos ejemplo
Que significa si SELinux me da un error?
- Quizás la política debe ser mejorada:
- booleans
- policy modules
Que significa si SELinux me da un error?
- Quizás exista un bug en la política.
- Abra un ticket en bugzilla
¿Qué son los booleanos?
- Un simple esto puede hacer esto otro.
- "do we allow the ftp server access to home directories"
- getsebool -a
¿Que son los booleanos?
- Para setear un boolean:
- setsebool [boolean] [0|1]
- Para hacerlo permanente -P
Consejo
Instalen setroubleshoot y setroubleshoot-server para poder manejar las políticas y mejorar los logs.
Reiniciar audit despues de instalar.
Caso real 1
El usuario mosorio quiere mostrar su página web que se encuentra en /home/mosorio/public_html
Habilitamos user_dir en apache.
Y restart al demonio
userdir - Problemas reales
chmod o+x /home/
ls -l /home/
drwx-----x. 3 mosorio mosorio 4096 dic 3 10:07 mosorio
userdir
Creamos el index.html en la carpeta public_html
¡Y!
Revisamos los logs de apache.
tailf /var/log/httpd/example/access_log
200.1.19.29 - - [03/Dec/2013:10:32:04 -0300] "GET /~mosorio/ HTTP/1.1" 403 290 200.1.19.29 - - [03/Dec/2013:10:32:22 -0300] "GET /~mosorio/ HTTP/1.1" 403 290
tailf /var/log/httpd/example/error_log
[Tue Dec 03 10:32:04 2013] [error] [client 200.1.19.29] (13)Permission denied: access to /~mosorio/ denied [Tue Dec 03 10:32:22 2013] [error] [client 200.1.19.29] (13)Permission denied: access to /~mosorio/ denied
¿que hacer?
Revisar los logs, vemos /var/log/messages
Dec 3 10:18:18 localhost setroubleshoot: SELinux is preventing /usr/sbin/httpd from search access on the directory mosorio. For complete SELinux messages. run sealert -l d83e189d-0afe-40d2-b23a-2270227c2260
Dec 3 10:18:18 localhost setroubleshoot: SELinux is preventing /usr/sbin/httpd from getattr access on the directory /home/mosorio. For complete SELinux messages. run sealert -l a4c4ef38-3541-4dac-b9ee-60914ed7cc3b
Revisando el log
- SElinux está bloqueado la lectura.
- Hacemos lo que dice selinux: "sealert -l 9f88e0bb-5f4b
-4e3a-96b2-7644917fbfc4" - Y dirá que hay dos problemas
- Leer contenido de usuario
- Acceso a la carpeta de userdir
SELinux is preventing /usr/sbin/httpd from getattr access on the directorio /home/mosorio. ***** Sugerencia de complemento catchall_boolean (47.5 confidence) ********* Sidesea allow httpd to read user content Entoncesdebe comunicarle a SELinux acerca de esto al habilitar el booleano 'httpd_read_user_content'. Para obtener mayor información, consulte la página de manual 'user_selinux'. Hacer setsebool -P httpd_read_user_content 1 ***** Sugerencia de complemento catchall_boolean (47.5 confidence) ********* Sidesea allow httpd to read home directories Entoncesdebe comunicarle a SELinux acerca de esto al habilitar el booleano 'httpd_enable_homedirs'. Para obtener mayor información, consulte la página de manual 'user_selinux'. Hacer setsebool -P httpd_enable_homedirs 1
setsebool -P httpd_read_user_content 1; setsebool -P httpd_enable_homedirs 1
Caso real 2
El usuario mosorio se aburrió su dirreción
example.com/~mosorio/
Ahora quiere un virtualhost para el solo.
Le dice al su querido sysadmin que le copie el contenido de la carpeta
a /var/www/html/
mv /home/mosorio/public_html/* /var/www/html
y test!
¡Los permisos deben ser!
-rw-rw-r--. 1 mosorio mosorio 3 dic 3 10:07 index.html
chown root:root index.html
¡Y test!

Miramos el log
Dec 3 10:57:21 localhost setroubleshoot: SELinux is preventing /usr/sbin/httpd from read access on the file index.html. For complete SELinux messages. run sealert -l f6df786d-7ca9-4848-950d-70bb1dee8936
[root@localhost html]# ls -lZ
-rw-rw-r--. mosorio mosorio unconfined_u:object_r:user_home_t:s0 index.html
Problema.
El contexto de archivo está malo.
Solución: cambiar el contexto
Dos formas.
Forma larga:
Primero miremos que debe ser:
ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
Cambiamos el contexto del archivo.
chcon -u system_u -r object_r -t httpd_sys_content /var/www/html/index.html
Forma corta
chcon -t httpd_sys_content /var/www/html/index.html
SElinux en modo targeted no usa:
- rol
- user
Forma realmente corta y floja
chcon --reference /var/www/html/ html/index.html
restorecon
Restaurar el contexto correcto que debiera tener
[root@localhost html]# restorecon -v index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
¡¿Pero como?!
restorecon
- restorecon usa la información del archivo
etc/selinux/targeted/contexts/files/file_contexts y de otros lados para determinar que contexto debe tener el archivo. - Alrededor de 4252 entradas
- ¡No los cambies directamente en el archivo! Se van a perder.
Creando políticas a mano.
Imaginemos que no existe un label o boolean que solucione tu problema.
¿que hacemos? ¡política a mano!
Creando políticas
- Ahora que sabemos que existe un falta de política. Cambiamos SELinux a permisivo y hacemos todos los casos de uso que necesitemos en la aplicación:
- Enviar correo
- Recibir correo
- El log quedará registrado pero no va denegar. Solo va informar.






Nota
El error podría ser solucionado por booleanos.
Pero se hizo la anterior para la charla
Luego levantar SElinux
setenforce 1
Resumen
- No lo apague.
- Puede salvarte la vida alguna vez.
- SELinux es mucho más facil que hace un tiempo.
- Seguridad a una alto nivel está disponible para ustedes a costo cero. ¡usalo!
Más info
Section 44 of the RHEL Deployment Guide:
http://www.redhat.com/docs/manuals/enterprise/
Fedora Project SELinux Documentation:
http://fedoraproject.org/wiki/SELinux
fedora-selinux-list (mailing list):
https://www.redhat.com/mailman/listinfo
Red Hat Training - Red Hat Enterprise SELinux Policy
Administration:
http://bit.ly/aoRDyr
SElinux
By sirspock
SElinux
- 331














