Introducción a SELinux en CentOS 5 y Fedora.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2010 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales. c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

Introducción.

Suele ocurrir que al intentar mejorar el rendimiento de un sistema se recurra a la práctica de desactivar SELinux. Ciertamente consume bastantes recursos, pero brinda un nivel de seguridad superior que en un futuro, que esperemos sea muy lejano, podría ser de gran utilidad para impedir ataques dirigidos específicamente hacia GNU/Linux. La gran popularidad que están teniendo las computadoras ultra-portátiles está incrementando el número de usuarios de GNU/Linux, lo cual eventualmente también significará que irá surgiendo equipamiento lógico malicioso (malware) específicamente diseñado para GNU/Linux. A continuación explico, de forma breve, como utilizar de manera básica getsebool y setsebool (y un poco de chcon) en CentOS 5 (aplicable a Red Hat Enterprise Linux 5) y Fedora 10 (y versiones posteriores) desde la terminal, ejemplificando políticas para algunos servicios.

¿Qué es SELinux?

SELinux (del inglés Security-Enhanced Linux, que se traduce como Seguridad Mejorada de Linux) es una implementación de seguridad para GNU/Linux que provee una variedad de políticas de seguridad, incluyendo el estilo de acceso a los controles del Departamento de Defensa de EE.UU., a través del uso de módulos de Seguridad en el núcleo de Linux.

En si es una colección de parches que fueron integrados hace algunos años al núcleo de Linux, fortaleciendo sus mecanismos de control de acceso y forzando la ejecución de los procesos dentro de un entorno con los mínimos privilegios necesarios. Utiliza un modelo de seguridad de control de acceso obligatorio.

Es una implementación compleja y robusta que suele ser muy oscura para la mayoría de los usuarios. Debido a ésto, falta de documentación amistosa y que muchos servicios simplemente son imposibles de operar sin una política correspondiente, muchas personas suelen desactivarlo editando /etc/sysconfig/selinux. El objetivo de este artículo es servir como una breve introducción a los conceptos básicos de administración de SELinux.

Mandato getsebool

Este mandato permite listar políticas en SELinux y determinar si están activos o inactivos. Básicamente se utiliza de la siguiente forma:

getsebool -a |grep cadena

Donde cadena es una cadena de texto que se puede utilizar para localizar las políticas relacionados con algún servicio en particular. Por ejemplo, si se desea conocer que políticas que incluyan la cadena ftp están activos, como root se puede utilizar lo siguiente:

getsebool -a |grep ftp

Lo anterior debe regresar algo similar como lo siguiente:

allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off

Mandato setsebool.

Setsebool permite cambiar los valores para diferentes políticas de SELinux, mismas que pueden verse a través de el mandato getsebool. La sintaxis básica es la siguiente:

setsebool nombre_politica valor

Cuando se ejecuta de la manera anteriormente descrita, las políticas son aplicadas de inmediato y estarán vigentes hasta el siguiente reinicio del sistema. Para hacer permanentes las políticas, se utiliza el mismo mandato con la opción -P:

setsebool -P nombre_politica valor

A continuación se muestran algunos ejemplos de gestión de políticas para varios servicios.

Servicios de FTP.

Para el servicio de FTP, como sería a través de VSFTPD, interesan las siguientes políticas:

Para activar estas, se utiliza el mandato setsebool con el nombre de la política y el valor 0 o bien 1 para desactivar o activar, respectivamente. En el siguiente ejemplo se activa poder acceder a los directorios de inicio de los usuarios:

setsebool ftp_home_dir 1

Lo anterior permitiría que los usuarios puedan acceder a sus propios directorios de inicios a través de VSFTPD, hasta que el sistema sea reiniciado. Para hacer permanente el cambio, se utiliza setsebool con la opción -P, de ls siguiente manera:

setsebool -P ftp_home_dir 1

OpenVPN.

Otro típico ejemplo es del OpenVPN, como cliente y servidor. Existen dos políticas:

openvpn_enable_homedirs: Permite utilizar certificados almacenados en los directorios de los usuarios.
openvpn_disable_trans: Por omisión, SELinux impide utilizar OpenVPN como servidor. Esta política permite desactiva toda gestión de SELinux sobre OpenVPN, pero permite a éste funcionar como servidor.

Para la política de openvpn_enable_homedirs, bajo algunas circunstancias se necesita permitir a los usuarios poder conectarse a redes VPN utilizando certificados que el mismo usuario almacena en su directorio de inicio y esta es precisamente la política que lo permite. Con el nivel de seguridad por omisión, solo se podrían utilizar certificados definidos por el administrador en algún directorio del sistema.

Apache.

Cuando se trabaja con directorios que serán accedidos desde redes públicas, como un directorio virtual o un directorio para dominio virtual en Apache, se activa la política httpd_enable_homedirs y se utiliza el mandato chcon para permitir el acceso a los directorios ~/public_html, añadiendo el tipo httpd_sys_content_t.

setsebool -P httpd_enable_homedirs 1
chcon -R -t httpd_sys_content_t ~user/public_html

Para permitir la ejecución de programas CGI, se utiliza:

setsebool -P httpd_enable_cgi 1

Para permitir enviar correo desde apache, se utiliza:

setsebool -P httpd_can_sendmail 1

Para desactivar que SELinux controle a Apache, en su totalidad, se puede utilizar:

setsebool -P httpd_disable_trans 1

Samba.

En Samba es común la necesidad de permitir a este servicio operar como controlador de dominio. La política que lo habilita es samba_domain_controller:

setsebool -P samba_domain_controller

Si se desea permitir el acceso a los directorios de inicio de los usuarios, se utiliza la política los directorios ~/public_html:

setsebool -P samba_enable_home_dirs on

Para poder utilizar directorios que se compartirán a través de Samba, se utiliza chcon definiendo el tipo samba_share_t al contexto del directorio. En el siguiente ejemplo, se creará un directorio como /var/samba/publico:

mkdir -p /var/samba/publico

Para visualizar sus contextos en SELinux, se utiliza el mandato ls con la opción -Z:

ls -Z /var/samba/

Lo anterior debe devolver una salida como la siguiente:

drwxr-xr-x  root root unconfined_u:object_r:var_t:s0   publico

Para añadir el tipo samba_share_t, se utiliza el mandato chcon de la siguiente manera:

chcon -t samba_share_t /var/samba/publico

Al volver a visualizar el contexto del directorio con ls -Z, deberá devolver una salida como la siguiente:

ls -Z
drwxr-xr-x root root unconfined_u:object_r:samba_share_t:s0 publico

Para compartir un directorios en Samba, hay dos políticas que se pueden utilizar:

samba_export_all_ro: Permite el acceso a directorios compartidos en Samba en modo de solo lectura
samba_export_all_rw: Permite el acceso a directorios compartidos en Samba en modo de lectura y escritura.

Ejemplo:

setsebool -P samba_export_all_rw 1

Otros servicios.

En general, todos las políticas de todos los servicios pueden ser gestionadas buscando cuales están relacionadas a través del mandato getsebool. Los detalles respecto de qué es lo que hace dada política pueden consultarse a través de las páginas de manual que están instaladas en el sistema. Por ejemplo, para consultar que políticas hay para el servicio NFS, el manual que contiene las descripciones correspondientes es nfs_selinux.

man httpd_selinux

Otros manuales que pueden consultarse en el sistema para diferentes servicios son:

kerberos_selinux
named_selinux
ftpd_selinux
nis_selinux
rsync_selinux
ypbind_selinux
pam_selinux
httpd_selinux
nfs_selinux
samba_selinux