Maximiliano Osorio
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