SELinux II: Práctica

Bueno, lo prometido es deuda, y aunque debería de pagar intereses por el tiempo transcurrido, vamos a pasar de la teoría de SElinux a la práctica.

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 política 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 cómo configurar los servicios que están bajo la protección de selinux. Para ello, man es nuestro amigo y consejero. Si ejecutamos man selinux, aparte de bastante información, 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 quisiéramos configurar vsftp para que los usuarios anónimos 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 políticas que permiten a los usuarios anónimos 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 anónimos
root@centos:~# setsebool -P allow_ftpd_anon_write on

Cuando ejecutemos las pruebas, setroubleshoot nos avisará en tiempo real de cualquier denegación por parte de Selinux, y nos mostrara una pantalla gráfica (gracias a sealert) de los problemas que vayan ocurriendo, por qué han ocurrido y si sabe, cómo 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 configuración básica de Selinux. ¿Y si queremos realizar alguna tarea que no esta prevista en las políticas que trae por defecto Selinux y ningún booleano nos permite cambiar su funcionamiento? ¿Debemos comenzar a escribir nuestras propias políticas 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 pájaros 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 acción (la razón 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.)

Pongámonos en antecedentes: tenemos una clave el directorio /home/javi/.ssh/ con unos permisos erróneos, 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

También 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 gráfico, veremos que nos aparece una ventana indicándonos un denial en SElinux (sino, lo podemos ver lanzándolo 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 información.

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 debería tener acceso, por lo que deniega la petición. Hasta aquí todo perfecto, pero ¿y si queremos permitirlo? Pues usamos la herramienta audit2allow, que inspecciona las alertas de SElinux y crea las políticas 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 definición de la política. Ahora debemos cargarlo y esperar que audit2allow haya funcionado correctamente, pues no es infalible y de vez en cuando no consigue generar una política 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 producción, ni en su ordenador personal. Usen una máquina 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 básico 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 próxima.

Trackbacks

  1. […] SELinux II: Práctica (SELinux [Security-Enhanced Linux, enlace de la NSA]) […]