Вы находитесь на странице: 1из 9

Practica SELinux

SELinux: Teoria Por Javier Vela, 11 de Mayo de 2010 | Lo prometido es deuda, y hoy vamos a explicar un poco que es SELinux [SecurityEnhanced Linux, enlace de la NSA] y cmo opera. Recomiendo releer la entrada sobre MAC y DAC para recordar conceptos. Tras esto, qu es SELinux? SELinux es una implementacion del MAC que funciona a nivel de kernel, lo que implica que las aplicaciones no necesitan ser modificadas para aprovechar toda su potencia, ya que para ellas SELinux es transparente, algo muy importante a la hora de que el sistema sea desplegado en un entorno real. La razn de usar SELinux es limitar el acceso que tienen las aplicaciones a otras aplicaciones y a los ficheros, impidiendo que un proceso pueda modificar cualquier fichero del usuario con el que se lanz. Por ejemplo, Firefox jamas debera ser capaz de cambiar los permisos de mi clave privada ssh, lo cual con un sistema de control de acceso DAC s sera posible si un atacante toma el control del navegador. Cmo funciona SELinux? Pues se basa en atributos extendidos del sistema de ficheros que indican el tipo de usuario (que no tiene porque ser usuario del sistema), el rol, y el tipo del objeto. Por ejemplo, si hacemos un ls -lZ para ver los atributos extendidos del directorio /etc/httpd, podremos ver que permisos le asigna una distribucin Red Hat a los ficheros de configuracin de Apache (la quinta lnea se ha partido para facilitar su presentacin):
[root@localhost httpd]# ls -lZ drwxr-xr-x root root system_u:object_r:httpd_config_t conf drwxr-xr-x root root system_u:object_r:httpd_config_t conf.d lrwxrwxrwx root root system_u:object_r:httpd_log_t logs -> ../../var/log/httpd lrwxrwxrwx root root system_u:object_r:httpd_modules_t modules -> ../../usr/lib/httpd/modules lrwxrwxrwx root root system_u:object_r:httpd_config_t run -> ../../var/run

Como podemos ver, el usuario y rol es el mismo, pero el tipo cambia. Estos atributos son los que en funcin de las polticas definidas en SELinux, indican las interacciones entre ellos y los diferentes objetos del sistema. Estos atributos estn definidos en el sistema, y puede haber cientos, tantos como la granularidad que queramos obtener. La mayora de distribuciones que usan SELinux vienen ya con varios tipos predeterminados para ayudarnos en su administracin, pero nosotros podemos definir ms. Si queremos ver todos los tipos disponibles, lo podemos hacer con el comando
#getsebool -a

Ahora que ya conocemos los atributos, ahora nos falta conocer un poco las polticas que utilizan estos atributos. Al ms alto nivel, existen dos tipos de polticas bsicas: targeted y strict:

strict: En modo estricto, por defecto todo est denegado, y tan slo se permite lo especificado en la polticas. Esto, que sigue el principio de mnimo privilegio, es complicado de administrar y llevara a la mayora de los sysadmins a desactivar SELinux. targeted: Tan slo ciertos servicios estn bajo la supervisin de SELinux, como por ejemplo los demonios httpd, bind, postgresql, etc. El resto estn libres de restricciones. La denominacion Targeted proviene del hecho de que tan solo los servicios sealados sern vigilados.

Para saber qu tipo de poltica tenemos configurada, en un sistema Red Hat podemos averiguarlo en el fichero /etc/sysconfig/selinux. Por debajo de estos modos, se sitan las polticas en s, que definen las interacciones entre objetos. Dichas polticas pueden usar diferentes controles de acceso, en funcin de los atributos extra que utilicen. Normalmente se suele usar Type Enforcement en el cual tan solo se utiliza el atributo tipo, y es el modo usado por la poltica targeted. Existen otros mtodos como el Role-Based Access Control que utiliza los atributos de usuario y rol pero normalmente, dado que como poltica se utiliza targeted, el modo de acceso mas comn es el Type Enforcement. Ya tan slo nos queda saber qu es lo que exactamente permite o impide que podamos acceder a un objeto. Aqu entran en juego las polticas, que dependiendo del control de acceso utilizado y los atributos de los objetos, permiten o deniegan un acceso. As pues, si usamos el modo de Type Enforcement, es el tipo de un objecto el atributo determinante. En este caso, si un servicio esta en el modo vigilado tan solo podr acceder a objetos con un tipo similar. En las polticas se definen los tipos similares y las excepciones que permiten que el sistema funcione. As, por ejemplo, si inspeccionamos con que permisos se ejecuta el demonio Apache (la segunda lnea se ha partido para facilitar su presentacin):
[root@localhost etc]# ps auxZ | grep httpd user_u:system_r:httpd_t root 2869 0.3 0.5 10548 2924 ? Ss 15:46 0:00 /usr/sbin/httpd

Vemos que dicho demonio tan solo podr interactuar con objetos de un tipo similar, como por ejemplo los que estn en el directorio /etc/httpd. Esto implica que aunque nosotros tuviramos un fichero con permisos de lectura y escritura para todos, como por ejemplo:
[root@localhost jvela]# ls -lZ /home/jvela drwxr-xrwx jvela jvela user_u:object_r:user_home_t prueba_selinux

Un atacante que comprometiera el demonio de httpd no podra acceder porque dicho demonio esta en el dominio de SELinux y el tipo de nuestro archivo no pertenece a la familia httpd. Hemos visto por encima que es SElinux, cmo esta estructurado y como consigue aplicar el MAC a un sistema GNU\Linux. Por supuesto, como pasa siempre, la mejor manera de comprender su funcionamiento es jugando con l y ponindolo en marcha, algo a lo que les

invito. No obstante, si les queda alguna duda o hay algo de lo dicho sobre lo que les gustara que incidiese, no tienen ms que indicarlo en los comentarios y estar encantado de aclarar las dudas que tengan. En la siguiente entrada pasaremos de la teora a la prctica, con ejemplos de su funcionamiento y las mltiples opciones de configuracin que lo convierten en un sistema tan flexible.

SELinux II: Prctica Por Javier Vela, 16 de Junio de 2010 | Bueno, lo prometido es deuda, y aunque debera de pagar intereses por el tiempo transcurrido, vamos a pasar de la teora de SElinux a la prctica. Lo primero antes de trabajar con SElinux, es asegurarse de que lo tenemos habilitado, de que esta configurado en el modo adecuado y de la poltica de que tenemos. Para todo ello, en un sistema Red Hat, inspeccionamos el fichero /etc/sysconfig/selinux
jvela@centos:~$ less /etc/sysconfig/selinux SELINUX=enforcing SELINUXTYPE=targeted

Lo primero que deberemos aprender es cmo configurar los servicios que estn bajo la proteccin de selinux. Para ello, man es nuestro amigo y consejero. Si ejecutamos man selinux, aparte de bastante informacin, veremos al final cuales son los ficheros de ayuda de selinux para los diferentes servicios del sistema.
jvela@centos:~$ man selinux (...) SEE ALSO booleans(8), setsebool(8), selinuxenabled(8), togglesebool(8), restorecon(8), setfiles(8), ftpd_selinux(8), named_selinux(8), rsync_selinux(8), httpd_selinux(8), nfs_selinux(8), samba_selinux(8), kerberos_selinux(8), nis_selinux(8), ypbind_selinux(8)

En este momento ya podemos intuir que si queremos configurar, por ejemplo, el vstftpd deberemos consultar la ayuda ftpd_selinux. Como ejemplo, si quisiramos configurar vsftp para que los usuarios annimos puedan leer y escribir en el directorio /var/ftp la propia ayuda nos indica los pasos a realizar. En nuestro caso, deberemos asignar correctamente el contexto del directorio y habilitar las polticas que permiten a los usuarios annimos escribir:

# Asignamos el tipo adecuado al directorio root@centos:~# chcon -R -t public_content_rw_t /var/ftp # Habilitamos la opcion de escritura para usuarios annimos root@centos:~# setsebool -P allow_ftpd_anon_write on

Cuando ejecutemos las pruebas, setroubleshoot nos avisar en tiempo real de cualquier denegacin por parte de Selinux, y nos mostrara una pantalla grfica (gracias a sealert) de los problemas que vayan ocurriendo, por qu han ocurrido y si sabe, cmo solucionarlos. Hasta aqu, con la ayuda de las paginas man, el comando setsebool para definir los booleanos y el comando chcon para cambiar el tipo podemos ajustar totalmente la configuracin bsica de Selinux. Y si queremos realizar alguna tarea que no esta prevista en las polticas que trae por defecto Selinux y ningn booleano nos permite cambiar su funcionamiento? Debemos comenzar a escribir nuestras propias polticas y comenzar a investigar en las tripas de Selinux? Por suerte para nosotros no es as, ya que existen herramientas que automatizan dicho proceso. Para ilustrar el ejemplo, vamos a realizar una pagina web muy simple en PHP que accede a la clave privada ssh de un usuario. Con este ejemplo mataremos dos pjaros de un tiro: veremos como SElinux nos protege incluso aunque hayamos cometido un error al dar permisos a otros usuarios del sistema a nuestra clave privada, y podremos configurar SElinux para que finalmente permita realizar esta accin (la razn la eligen ustedes, porque a m no se me ocurre ninguna para que un script ejecutado en un servidor web escriba en mi clave privada.) Pongmonos en antecedentes: tenemos una clave el directorio /home/javi/.ssh/ con unos permisos errneos, porque somos unos manazas con el comando chmod y el tipo SElinux home_ssh
javi@centos:~/.ssh/ls -lZ rw-rw-rw-. javi javi user_u:object_r:home_ssh_t:s0 prueba_selinux

Tambin tenemos un script en PHP que accede a dicha clave:


<html> <head> <title>Selinux Test</title> </head> <body> < ?php $fp = fopen('/home/javi/.ssh/prueba_selinux', 'w'); fwrite($fp, 'One ring to rule...'); fclose($fp); ?> </body> </html>

Dicho script se ejecuta en un Apache con el siguiente contexto SElinux:

root@centos:~# ps auxZ | grep httpd user_u:system_r:httpd_t root 2869 0.3 0.5 10548 2924 ? Ss 15:46 0:00 /usr/sbin/httpd

Al lanzar la pagina, si estamos ejecutando el modo grfico, veremos que nos aparece una ventana indicndonos un denial en SElinux (sino, lo podemos ver lanzndolo en modo texto con sealert -a /var/log/audit/audit.log > output.txt). El contenido se acorta, mostrando tan solo la alerta en crudo. La herramienta nos proporciona mucha mas informacin.
Summary: SELinux is preventing /usr/sbin/httpd from using potentially mislabeled files prueba_selinux. (...) Raw Audit Messages node=fedorapc type=AVC msg=audit(1276210048.84:25): avc: denied { write } for pid=1710 comm="httpd" name="prueba_selinux" dev=sda8 ino=474 scontext=system_u:system_r:httpd_t:s0 tcontext=user_u:object_r:home_ssh_t:s0 tclass=file node=fedorapc type=SYSCALL msg=audit(1276210048.84:25): arch=c000003e syscall=2 success=no exit=-13 a0=7f91750f6dc8 a1=241 a2=1b6 a3=21 items=0 ppid=1697 pid=1710 auid=4294967295 uid=48 gid=489 euid=48 suid=48 fsuid=48 egid=489 sgid=489 fsgid=489 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)

Si inspeccionamos un poco vemos que efectivamente, SElinux ha detectado un acceso del demonio httpd a un fichero con un tipo al que en principio no debera tener acceso, por lo que deniega la peticin. Hasta aqu todo perfecto, pero y si queremos permitirlo? Pues usamos la herramienta audit2allow, que inspecciona las alertas de SElinux y crea las polticas necesarias para que dichas acciones sean permitidas si puede (no es infalible). En nuestro caso:
root@centos:~# grep httpd /var/log/audit/audit.log | audit2allow -M apache_ssh

Esto crear varios ficheros, un binario (el modulo para SElinux) y un archivo de texto con la definicin de la poltica. Ahora debemos cargarlo y esperar que audit2allow haya funcionado correctamente, pues no es infalible y de vez en cuando no consigue generar una poltica a partir de las alertas del audit.log.
root@centos:~# semodule -i apache_ssh.pph

Si todo ha ido bien, ya podremos acceder desde el demonio httpd a nuestra clave privada. Tengan en cuenta que esto es un ejemplo, no lo hagan en un entorno ni de produccin, ni en su ordenador personal. Usen una mquina de pruebas o un entorno controlado. Hasta aqu la mini serie de SElinux, que espero que no les haya aburrido. Por supuesto, el objetivo de estas entradas no era descubrirles todas las posibilidades de Selinux ni convertirles en expertos, sino mostrarles el manejo bsico para poder administrar maquinas con SElinux y lidiar con los posibles problemas que nos podamos encontrar. Como saben, cualquier duda que les surja pueden dejarla en los comentarios, y en la medida de mis posibilidades intentar resolverla. Saludos y hasta la prxima.

4.1. El servidor HTTP Apache y SELinux


When SELinux is enabled, the Apache HTTP Server (httpd) runs confined by default. Confined processes run in their own domains, and are separated from other confined processes. If a confined process is compromised by an attacker, depending on SELinux policy configuration, an attacker's access to resources and the possible damage they can do is limited. The following example demonstrates the httpd processes running in their own domain. This example assumes the httpd package is installed: 1. Ejecute el comando getenforce para confirmar que SELinux est ejecutndose en modo obligatorio:
$ getenforce Enforcing

El comando getenforce devuelve el resultado Enforcing cuando SELinux se est ejecutando en modo obligatorio. 2. Ejecute el comando service httpd start como usuario root para iniciar httpd:
# service httpd start Starting httpd: [ OK ]

3. Ejecute el comando ps -eZ | grep httpd para observar los procesos httpd:
$ ps -eZ | grep httpd unconfined_u:system_r:httpd_t:s0 2850 ? unconfined_u:system_r:httpd_t:s0 2852 ? unconfined_u:system_r:httpd_t:s0 2853 ? 00:00:00 httpd 00:00:00 httpd 00:00:00 httpd

unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0 unconfined_u:system_r:httpd_t:s0

2854 2855 2856 2857 2858 2859

? ? ? ? ? ?

00:00:00 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00

httpd httpd httpd httpd httpd httpd

El contexto SELinux asociado con los procesos httpd es unconfined_u:system_r:httpd_t:s0. La segunda ltima parte del contexto, httpd_t, es el tipo. Un tipo define un dominio para los procesos, y un tipo para los archivos. En este caso, los procesos httpd estn siendo ejecutados en el dominio httpd_t: La poltica de SELinux define cmo los procesos ejecutados en dominios confinados (como lo es httpd_t), interactan con archivos, otros procesos, y con el sistema en general. Los archivos deben estar etiquetados correctamente para permitir el acceso de httpd a ellos. Por ejemplo, httpd, puede leer archivos etiquetados con el tipo httpd_sys_content_t, pero no puede escribir en ellos, ni an cuando lo permitan los permisos Linux. Los booleanos deben definirse con valor "on" para permitir determinados comportamientos: ciertos scripts que permiten el acceso a la red, habilitando a httpd para que pueda acceder a sistemas de archivos NFS y CIF5; o que a httpd se le permita ejecutar scripts CGI (Common Gateway Interface). Cuando /etc/httpd/conf/httpd.conf se encuentre configurado de modo tal que httpd escuche sobre puerto diferente a los puertos TCP predeterminados (80, 443, 488, 8008, 8009, o 8443), debe utilizarse el comando semanage port para agregar el nuevo nmero de puerto a la configuracin de polticas de SELinux. El ejemplo que ofrecemos a continuacin demuestra como configurar httpd para que escuchar sobre un puerto que no se encuentre definido en las polticas de SELinux para httpd, y cuya consecuencia es que httpd no pueda iniciarse. Adems, nuestro ejemplo muestra como configurar luego el sistema SElinux para permitir que httpd escuche exitosamente un puerto no estndar que no se encuentre todava definido en la poltica. Estos ejemplos presuponen que el paquete httpd se encuentra instalado. Ejecute cada comando como usuario root: 1. Ejecute el comando service httpd status para confirmar que httpd no est ejecutndose:
# service httpd status httpd is stopped

Si la salida es diferente, ejecute el comando service httpd stop para detener el proceso:
# service httpd stop Stopping httpd: ] [ OK

2. Ejecute el comando semanage port -l | grep -w http_port_t para conocer los puertos que SELinux le permite escuchar a httpd:
# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443

3. Edite el archivo /etc/httpd/conf/httpd.conf como usuario root. Configure la opcin Listen de modo que liste los puertos que no estn configurados en el archivo de configuracin de polticas SELinux para httpd. En nuestro ejemplo, httpd se encuentra configurado para escuchar el puerto 12345:
# Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses (0.0.0.0) # #Listen 12.34.56.78:80 Listen 127.0.0.1:12345

4. Ejecute el comando service httpd start para iniciar httpd:


# service httpd start Starting httpd: (13)Permission denied: make_sock: could not bind to address 127.0.0.1:12345 no listening sockets available, shutting down Unable to open logs [FAILED]

Una negacin de SELinux similar a la siguiente se encuentra registrada en el archivo /var/log/messages:


setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert l f18bca99-db64-4c16-9719-1db89f0d8c77

5. PAra que SELinux permita a httpd escuchar en el puerto 12345, tal como en nuestro ejemplo, el necesario ejecutar el siguiente comando:
# semanage port -a -t http_port_t -p tcp 12345

Ejecute nuevamente el comando service httpd start para iniciar httpd, y hacer que escuche sobre el nuevo puerto:
# service httpd start Starting httpd: [ OK ]

6. Ahora que SELinux ha sido configurado para permitir que httpd escuche en un puerto no estndar (TCP 12345 en nuestro ejemplo), httpd se inicia exitosamente en dicho puerto. 7. Para verificar que httpd est escuchando y comunicndose con el puerto TCP 12345, inicie una conexin telnet en el puerto especfico y envi un comando HTTP GET de la siguiente manera:
# telnet localhost 12345 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.0 HTTP/1.1 200 OK Date: Tue, 31 Mar 2009 13:12:10 GMT Server: Apache/2.2.11 (Fedora) Accept-Ranges: bytes Content-Length: 3918 Content-Type: text/html; charset=UTF-8 [...continues...]

http://es.scribd.com/doc/13665834/Manual-Selinux