Practica SELinux

download Practica SELinux

of 9

Transcript of Practica SELinux

  • 7/31/2019 Practica SELinux

    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 [Security-

    Enhanced Linux, enlace de la NSA] y cmo opera. Recomiendo releer la entrada sobreMAC 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 lasaplicaciones 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 ficherodel usuario con el que se lanz. Por ejemplo, Firefox jamas debera ser capaz de cambiarlos 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 -lZpara ver los atributos extendidos del directorio/etc/httpd, podremos ver que permisos le asigna una distribucin Red Hat a los ficheros deconfiguracin de Apache (la quinta lnea se ha partido para facilitar su presentacin):

    [root@localhost httpd]# ls -lZdrwxr-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 paraayudarnos 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 queutilizan estos atributos. Al ms alto nivel, existen dos tipos de polticas bsicas: targetedy

    strict:

  • 7/31/2019 Practica SELinux

    2/9

    strict: En modo estricto, por defecto todo est denegado, y tan slo se permite loespecificado 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 derestricciones. La denominacion Targetedproviene del hecho de que tan solo los

    servicios sealados sern vigilados.

    Para saber qu tipo de poltica tenemos configurada, en un sistema Red Hat podemosaveriguarlo 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 Enforcementen el cual tansolo se utiliza el atributo tipo, y es el modo usado por la poltica targeted. Existen otrosmtodos como elRole-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. Eneste 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 permitenque 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

  • 7/31/2019 Practica SELinux

    3/9

    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 deaclarar 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 loconvierten 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 tiempotranscurrido, 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 laproteccin 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 ayudade 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:

  • 7/31/2019 Practica SELinux

    4/9

    # 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 cualquierdenegacin 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 existenherramientas 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 unospermisos 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:

    Selinux Test

    < ?php

    $fp = fopen('/home/javi/.ssh/prueba_selinux', 'w');

    fwrite($fp, 'One ring to rule...');

    fclose($fp);

    ?>

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

  • 7/31/2019 Practica SELinux

    5/9

    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 unaventana 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=48fsuid=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 laspolticas 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 conla 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

  • 7/31/2019 Practica SELinux

    6/9

    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 niconvertirles 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 enmodo obligatorio:

    $ getenforce

    Enforcing

    El comando getenforce devuelve el resultado Enforcing cuando SELinux se estejecutando 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 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2852 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2853 ? 00:00:00 httpd

  • 7/31/2019 Practica SELinux

    7/9

    unconfined_u:system_r:httpd_t:s0 2854 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2855 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2856 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2857 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2858 ? 00:00:00 httpd

    unconfined_u:system_r:httpd_t:s0 2859 ? 00:00:00 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. Losarchivos 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. Losbooleanos 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 httpdescuche 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 nmerode 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 queno 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 estejecutndose:

    # service httpd status

    httpd is stopped

    Si la salida es diferente, ejecute el comando service httpd stop para detenerel proceso:

    # service httpd stop

    Stopping httpd: [ OK

    ]

  • 7/31/2019 Practica SELinux

    8/9

    2. Ejecute el comando semanage port -l | grep -w http_port_t para conocerlos puertos que SELinux le permite escuchar a httpd:

    # semanage port -l | grep -w http_port_thttp_port_t tcp 80, 443, 488, 8008, 8009, 8443

    3. Edite el archivo /etc/httpd/conf/httpd.conf como usuario root. Configure laopcin 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 ennuestro 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 hacerque escuche sobre el nuevo puerto:

    # service httpd start

    Starting httpd: [ OK ]

  • 7/31/2019 Practica SELinux

    9/9

    6. Ahora que SELinux ha sido configurado para permitir que httpd escuche en unpuerto no estndar (TCP 12345 en nuestro ejemplo), httpd se inicia exitosamenteen dicho puerto.

    7. Para verificar que httpd est escuchando y comunicndose con el puerto TCP12345, 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