miércoles, 3 de marzo de 2010

SELinux

ahora vamos a hablar un poquito de SELinux, Security Enhnaced Linux,

SELinux proporciona un sistema flexible de control de acceso mandatorio (mandatory access control, MAC) incorporado en el kernel. Bajo Linux estándar se utiliza el control de acceso a discrecional (discretionary access control, DAC), en el que un proceso o aplicación ejectutándose como un usuario (UID o SUID) tiene los permisos y de ese usuario en los objetos, archivos y otros procesos. Al ejecutar un kernel SELinux MAC se protege al sistema de aplicaciones maliciosas que pueden perjudicar o destruir el sistema. SELinux define el acceso y los derechos de transición de cada usuario, aplicación, proceso y archivo en el sistema. SELinux gobierna la interacción de estos sujetos y objectos usando una política de seguridad que especifica cuán estricta o indulgente una instalación de Red Hat Enterprise Linux dada debería de ser.


En su mayor parte, SELinux es casi invisible para la mayoría de los usuarios. Solamente los administradores de sistemas se deben de preocupar sobre lo estricto que debe ser una política a implementar en sus entorno de servidores. La política puede ser tan estricta o tan indulgente como se requiera, y es bastante detallada. Este detalle le dá al kernel SELinux un control total y granular sobre el sistema completo.


Cuando un sujeto, tal como una aplicación, intenta acceder a un objeto tal como a un archivo, el servidor de aplicación de políticas verifica un caché de vector de acceso (AVC), donde se registran los permisos de objeto y del sujeto. Si no se puede tomar una decisión basado en los datos en el AVAC, la petición continua al servidor de seguridad, el cual busca el contexto de seguridad de la aplicación y del archivo en una matriz. Los permisos son entonces otorgados o negados, con un mensaje de avc: denied detallado en /var/log/messages. Los sujetos y objetos reciben su contexto de seguridad a partir de la política instalada, que también proporciona información para llenar la matriz de seguridad del servidor.

Además de ejecutarse en un modo impositivo, SELinux puede ejecutarse en un modo permisivo, donde el AVC esverificado y se registran los rechazos, pero SELinux no hace cumplir esta política.


veamos algo basico de SELinux

el archivo de configuración principal de selinux se encuenta /etc/sysconfig/selinux, donde podemos definir el nivel de seguridad que aplicara SELinux

SELINUX=(enforcing|permissive|disabled) (impositivo,advierte pero no impone, deshabilidado).
SELINUXTYPE=(targeted|strict) ( solo servicios especificos, todo )

para activar boleanos de manera grafica podemos utilizar "system-config-securitylevel" otras herramientas que nos pueden servir son "/usr/bin/setenforce (1|0)" el cual habilita y deshabilita SELinux, el comando "/usr/bin/sestatus -v" verificara el estado de SELinux, "/sbin/fixfiles" verifica y corrige errores en políticas en los archivos.


Veamos un ejemplo, para nfs, en modo targeted, habilitaremos "use_nfs_home_dirs"

# ls /selinux/booleans/ | grep nfs
========================

allow_ftpd_use_nfs
allow_nfsd_anon_write
httpd_use_nfs
nfsd_disable_trans
nfs_export_all_ro
nfs_export_all_rw
qemu_use_nfs
samba_share_nfs
use_nfs_home_dirs
virt_use_nfs

=======================

al tener localizado el boleano necesario ejecutamos

# setsebool -P use_nfs_home_dirs 1

y habilitaremos la regla en se linux, lo difícil de esto es saber que regla tenemos que habilitar o desactivar que ponga en riesgo nuestro.

ahora en los directorios también se manejan LABELS , para esto tenemos el comando "chcon", el cual tiene usuario: rol : tipo . veamos un ejemplo

# ls -Z /var

=====================
user : rol : tipo
drwxr-xr-x root root system_u:object_r:var_spool_t spool
drwxrwxrwt root root system_u:object_r:tmp_t tmp
drwx------ root root system_u:object_r:var_t tux
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t www
drwxr-xr-x root root system_u:object_r:var_yp_t yp

====================

para cambiar estas características ejecutamos chcon con las opciones (u,r,t) el comando tiene mas opciones les recomiendo echarles una revisada .

crearemos otro folder para web con los mismos labels igual al /var/www/html

# mkdir /var/web
# chcon -R -u system_u -r object_r -t httpd_sys_content_t /var/web
# ls -Z /var/web

debe ser exactamente igual al www .

Muchas veces requeriremos hacer cambios en los puertos y que SELinux nos permita conectarnos a dichos puertos a requerir un servicio, en este caso seguiremos con el servidor web, antes de esto debemos modificar nuestros demonios y nuestro firewall.

# semanage port -a -t http_port_t -p tcp 81

hacemos un listado de los puertos permitidos por SELinux

# semanage port -l


Muchas ocasiones nos encontraremos con algunos problemas con SELinux, los problemas mas comunes son :

archivos con Label erronea
procesos corriendo bajo una directiva incorrecta
un bug en la política aplicada, o políticas que sobreponen a otra
Intento de intrusion.

Para solucionarlas hay que poner especial atencion a los logs que se estan generado, los logs por default son generados /var/log/audit/audit.log o en algunos casos /var/log/messages, los logs son etiquetados con "AVC" por lo cual son faciles de filtrar de otros mensajes. esitesn herramientas que peden hacernos la vida mas sencilla ejemplos

# sealert -b

o si requerimos un archivo para anlizar en forma de texto ..

# sealert -a /var/log/audit/audit.log > /my/archivo.txt




espero les sirva esta pequeña explicación de SELinux

1 comentario:

  1. estimado muchas gracias!!! gran aporte. Si me permites.. podrias explicar un poco mas sobrel el uso de selinux aplicado a puertos? por ejemplo la parte de " semanage port". Por otro lado no tengo el programa "sealert" y no lo veo en mis repos.

    Nuevamente gracias!!!

    ResponderEliminar