Configuración y primeros pasos con selinux
Para todos aquellos que deseen saber como configurar y utilizar selinus ajunto información.
y quiero dar las gracias a todos aquellos entendidos que han puesto algún comentario sobre selinux y de donde he podido obtener información.
PROLOGO
Este manual lo he creado sobre apuntes, notas o manuales que existen en diferentes paginas web.
1.¿QUE ES, QUIEN LO CREO , ETC... ?
Security-Enhanced Linux o SELinux, es una arquitectura de seguridad integrada en el kernel 2.6.x usando los módulos de seguridad linux (o linux security modules, LSM). Este es un proyecto de la Agencia de Seguridad Nacional (NSA) de los Estados Unidos y de la comunidad SELinux.
SELinux proporciona un sistema flexible de control de acceso obligatorio (mandatory access control, MAC) incorporado en el kernel. Bajo el Linux estándar se utiliza el control de acceso a discreción (discretionary access control, DAC), en el que un proceso o aplicación ejecutándose como un usuario (UID o SUID) tiene los permisos y de ese usuario en los objetos, archivos, zócalos y otros procesos. Al ejecutar un kernel SELinux MAC se protege al sistema de aplicaciones maliciosas o dañadas 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 objetos 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 es verificado y se registran los rechazos, pero SELinux no hace cumplir esta política.
2.ARCHIVOS DE CONFIGURCIÓN
Los siguientes ficheros son los que tengo en mi directorio /etc/selinux en un linux debian etch. El directorio /etc/selinux es la ubicación principal para todos los archivos de políticas así como también para el archivo de configuración principal.
Debian:/etc/selinux# ls -R
.:
config refpolicy-strict refpolicy-targeted semanage.conf
./refpolicy-strict:
contexts modules policy setrans.conf users
./refpolicy-strict/contexts:
customizable_types default_contexts failsafe_context initrc_context userhelper_context
dbus_contexts default_type files removable_context users
./refpolicy-strict/contexts/files:
media
./refpolicy-strict/contexts/users:
root
./refpolicy-strict/modules:
active semanage.read.LOCK semanage.trans.LOCK
./refpolicy-strict/modules/active:
file_contexts.local modules
./refpolicy-strict/modules/active/modules:
./refpolicy-strict/policy:
./refpolicy-strict/users:
local.users system.users
./refpolicy-targeted:
contexts modules policy setrans.conf seusers users
./refpolicy-targeted/contexts:
customizable_types default_contexts failsafe_context initrc_context removable_context users
dbus_contexts default_type files netfilter_contexts userhelper_context
./refpolicy-targeted/contexts/files:
file_contexts file_contexts.homedirs file_contexts.local homedir_template media
./refpolicy-targeted/contexts/users:
root
./refpolicy-targeted/modules:
active previous semanage.read.LOCK semanage.trans.LOCK
./refpolicy-targeted/modules/active:
base.linked commit_num file_contexts.local homedir_template netfilter_contexts seusers.final
base.pp file_contexts file_contexts.template modules policy.kern users_extra
./refpolicy-targeted/modules/active/modules:
acct.pp audio_entropy.pp clamav.pp dcc.pp gpg.pp privoxy.pp telnet.pp
ada.pp authbind.pp comsat.pp ddclient.pp hal.pp procmail.pp tor.pp
afs.pp automount.pp courier.pp dhcp.pp inetd.pp pythonsupport.pp udev.pp
alsa.pp avahi.pp cpucontrol.pp dictd.pp java.pp remotelogin.pp usbmodules.pp
amanda.pp backup.pp cvs.pp distcc.pp loadkeys.pp rssh.pp wine.pp
amavis.pp bind.pp cyrus.pp dmidecode.pp mozilla.pp sasl.pp xserver.pp
apache.pp bluetooth.pp daemontools.pp evolution.pp mysql.pp setroubleshoot.pp
apm.pp canna.pp dante.pp finger.pp openca.pp snort.pp
arpwatch.pp cdrecord.pp dbskk.pp ftp.pp openct.pp ssh.pp
asterisk.pp cipe.pp dbus.pp gnome.pp portmap.pp tcpd.pp
./refpolicy-targeted/modules/previous:
base.linked commit_num file_contexts.local homedir_template netfilter_contexts seusers.final
base.pp file_contexts file_contexts.template modules policy.kern users_extra
./refpolicy-targeted/modules/previous/modules:
acct.pp audio_entropy.pp clamav.pp dcc.pp gpg.pp privoxy.pp telnet.pp
ada.pp authbind.pp comsat.pp ddclient.pp hal.pp procmail.pp tor.pp
afs.pp automount.pp courier.pp dhcp.pp inetd.pp pythonsupport.pp udev.pp
alsa.pp avahi.pp cpucontrol.pp dictd.pp java.pp remotelogin.pp usbmodules.pp
amanda.pp backup.pp cvs.pp distcc.pp loadkeys.pp rssh.pp wine.pp
amavis.pp bind.pp cyrus.pp dmidecode.pp mozilla.pp sasl.pp xserver.pp
apache.pp bluetooth.pp daemontools.pp evolution.pp mysql.pp setroubleshoot.pp
apm.pp canna.pp dante.pp finger.pp openca.pp snort.pp
arpwatch.pp cdrecord.pp dbskk.pp ftp.pp openct.pp ssh.pp
asterisk.pp cipe.pp dbus.pp gnome.pp portmap.pp tcpd.pp
2.1 El archivo /etc/selinux/config,
A continuación se explica el subconjunto completo de opciones disponibles para la configuración:
SELINUX= — Define el estado superior para SELinux en un sistema.
enforcing o 'impositivo' — Se impone la política de seguridad SELinux.
permissive o 'permisivo' — El sistema SELinux advierte pero no impone la política. Esto es útil para propósitos de depuración o de resolución de problemas. En modo permisivo, se registrarán más rechazos, pues los sujetos podrán continuar con acciones que de lo contrario serían rechazadas en el modo impositivo. Por ejemplo, navegar en un árbol de directorios producirá varios mensajes de avc: denied para cada nivel de directorio leído, pero un kernel en modo impositivo habría detenido la primera acción de este tipo, previniendo que se produjeran más mensajes de rechazo.
disabled o 'inhabilitado' — SELinux está completamente desactivado. Los ganchos de SELinux no están conectados al kernel y el pseudo sistema de archivos no está registrado.
SELINUXTYPE= — Especifica cuál política está siendo implantada actualmente por SELinux.
targeted (objetivo) — Solamente se protegen ciertos demonios particulares.
La imposición de políticas para estos demonios se puede activar y desactivar. Al activar un valor boleano para un demonio objetivo se desactiva la transición de políticas para ese demonio, lo que previene, por ejemplo, que init pase a dhcpd desde el dominio unconfined_t (ilimitado) al dominio especificado en dhcpd.te. El dominio unconfined_t permite a los sujetos y objetos con ese contexto de seguridad a ejecutarse bajo la seguridad estándar de Linux.
strict (estricta) — Protección SELinux completa, para todos los demonios. Se definen los contextos de seguridad para todos los sujetos y objetos y cada simple acción es procesada por el servidor de aplicación de políticas.
SETLOCALDEFS=
SETLOCALDEFS habla sobre los procesos init y load_policy y si se está usando la nueva infraestructura de gestión o no.
2.2 Archivo local.users
Este archivo se encuentra en etc/selinux/refpolicy-targeted/users o en etc/selinux/refpolicy-strict/users. Dependiendo de nuestra politica si es strict o targeted.
Este fichero define usuarios adicionales reconocidos por selinux. Si un usuario es introducido en este fichero formará parte de su contexto de seguridad.
Por ejemplo:
user juan roles { user_r };
2.2.1 Roles
Cuando tenemos todos los servicios de red y sistema confinados, tenemos un mayor control de seguridad, porque no comprometemos al sistema, aislando cada servicio como una entidad independiente.
user_r → Es por defecto el rol de usuario de un usuario regular Linux.
Staff-r → Administrador del sistema que realiza funciones de usuario regular.
sysadm_r → Este es el rol del administrador del sistema. Si te logeas como “root” puedes configurar el rol de staff_r pero cuando tengas que realizar acciones de administrador deberás correr “newrole -r sysadm_r” antes.
Tras definir a los usuarios con sus respectivas políticas de seguridad, debemos cargar los módulos y configurar los booleanos.
3. ARRANCANDO SELINUX
3.1 Modificar el archivo config
Este archivo controla el estado de selinux en el sistema. Debemos configurarlo con el policy que deseemos.( ver apartado 2.1 de este manual para las opciones)
Primero :
SELINUX=enforcing
Segundo:
SELINUXTYPE=refpolicy-targeted
3.2 Configurando Kernel
Una vez que hemos configurado la politica de selinus llega el momento de arrancarlo. ¿Como ?
Lo primero que demos hacer es cambiar un archivo, menu.lst se encuentra en :
/boot/grub
Al editarlo encontraremos algo como esto:
title Debian GNU/Linux, kernel 2.6.18-6-686
root (hd0,0)
kernel /vmlinuz-2.6.18-6-686 root=/dev/mapper/Debian-root ro
initrd /initrd.img-2.6.18-6-686
savedefault
Debemos añadir selinux=1 de forma que nos queda así, recordar meterlo al final de la linea “kernel”:
title Debian GNU/Linux, kernel 2.6.18-6-686
root (hd0,0)
kernel /vmlinuz-2.6.18-6-686 root=/dev/mapper/Debian-root ro selinux=1
initrd /initrd.img-2.6.18-6-686
savedefault
Con esto se carga Selinux desde el arranque. Solo tenemos que reiniciar la computadora y ya está.
Antes de reiniciar la maquina asegurate que tienes la opción de arrancar el ordenador con una configuración sin selinux por si fallan las cosas ya que en modo strict tienes que configurarlo muy bien sino ni te arracará. Si deseas ponerlo en modo strict vete directamente al paso 4.1 sin reiniciar el ordenador.
4. PRIMER ARRANQUE
Durante el primer arranque veremos un montón de ordenes selinux y “bloqueos” como este :
Jun 25 10:55:35 localhost kernel: audit(1214384135.492:25): avc: denied { append } for pid=2621 comm="syslogd"name="syslog" dev=dm-1 ino=803348 scontext=system_u:system_r:syslogd_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=file
Esto es algo normal al principio.
4.1 Carga de módulos
Ahora hay que cargar todos los módulos de seguridad en kernel que nos sean necesarios.
Los módulos los tenéis en /etc/selinux/refpolicy-targeted/modules/active/modules
Cada modulo está nombrado por el servicio que hace referencia, por ejemplo telnet.pp hace referencia al servicio telnet.
Si queremos saber que módulos están cargados en kernel solo tenemos que poner este comando:
semodule -l ( “ele” de L )
Y nos mostrará todos los módulos que ya están cargados en kernel.
Para instalar un module tenemos que poner el siguiente comando:
semodule -i
Y para borrar un modulo , previamente instalado, tenemos que poner:
semodule -r
Por ejemplo para instalar el modulo Telnet:
semodule -i /etc/selinux/refpolicy-targeted/modules/active/modules/telnet.pp
Así uno a uno debemos instalar todos lo modulos que nos es necesarios.
4.2 Booleanos
Los booleanos son ajustes que controlan los permisos de ejecución de una serie de aplicaciones predefinidas.
Para saber que booleanos tenemos ejecutamos:
getsebool -a
Y nos mostraran todos aquellos que están activos (on) o desactivados (off).
Ejemplo:
Debian:# getsebool -a
afs_bosserver_disable_trans --> off
allow_cvs_read_shadow --> off
allow_daemons_use_tty --> off
allow_execheap --> off
allow_execmem --> off
allow_httpd_anon_write --> off
Para activar un booleano en concreto debemos ejecutar:
setsebool 1 ( el 1 activa el booleano el 0 (cero) lo desactiva)
Por ejemplo si ejecutamos:
setsebool 1 allow_httpd_anon_write
Estaremos ejecutando el booleanos allow_httpd_anon_write. Para cambiar el estado permanente del booleano:
setsebool -P allow_httpd_anon_write=1
5.Información
Para saber el estado de selinus podemos ejecutar:
sestatus :
Debian:# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 20
Policy from config file: refpolicy-targeted
O podemos ampliar la información ejecutando seinfo :
Debian:/etc/selinux/refpolicy-targeted/modules/active/modules# seinfo
Statistics for policy file: /etc/selinux/refpolicy-targeted/policy/policy.20
Policy Version & Type: v.20 (binary, MLS)
Classes: 58 Permissions: 210
Types: 1038 Attributes: 93
Users: 3 Roles: 7
Booleans: 108 Cond. Expr.: 100
Sensitivities: 1 Categories: 1024
Allow: 24335 Neverallow: 0
Auditallow: 19 Dontaudit: 1615
Role allow: 5 Role trans: 0
Type_trans: 658 Type_change: 9
Type_member: 0 Range_trans: 15
Constraints: 0 Validatetrans: 0
Fs_use: 13 Genfscon: 56
Portcon: 237 Netifcon: 0
Nodecon: 8 Initial SIDs: 0
Para listar algunas sentencias booleanas:
Debian:# seinfo -b
Conditional Booleans: 108
allow_zebra_write_config
avahi_disable_trans
clamd_disable_trans
entropyd_disable_trans
fcron_crond
ftpd_is_daemon
hald_disable_trans
system_crond_disable_trans
afs_bosserver_disable_trans
allow_ftpd_use_cifs




