Configuración y primeros pasos con selinux ( Actualizado 10/2008)
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 política 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.
3.3 Otras configuraciones
El archivo local.users (recordar que estoy hablando de selinux en DEBIAN), situado en /etc/selinux/refpolicy-strict/users ( este caso porque voy a cargar selinux en modo estricto) o en /etc/selinux/refpolicy-targeted/users, es usado para confinar los usuarios que utilizan el sistema.
# sample for administrative user
user jorge roles { staff_r sysadm_r };
# sample for regular user
user javier roles { user_r };
En este ejemplo al usuario jorge lo hemos definido como usuario con ciertos derechos de administración (staff_r) y administrador. En cambio al usuario javier como usuario normal. De esta forma confinamos a todos los usuarios del sistema.
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
o en 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
4.3 Booleanos, explicación.
Aquí voy a poner los booleanos y para que sirven. Es posible que no estén todos.
allow_daemons_use_tty - Este booleano permite que todos los demonios interaccionen con el terminal.
allow_execmem - Permite a ejecutables no confinados mapear una región de memoria con permisos de ejecución y escritura. Este booleano es peligroso activarlo.
allow_cvs_read_shadow - En modo Off, SELinux previene acerca de la intención de la aplicación CVS de leer el archivo shadow de claves.
allow_execstack - Como su nombre indica, este error se plantea si un programa intenta crear su stack con un ejecutable de llamada mprotect. Esto nunca debería ser necesario. La pila de memoria no es ejecutable en la mayoría de sistemas operativos en estos días y esto no cambiará. Los stack ejecutables de memoria es uno de los mayores problemas de seguridad.
allow_execheap - La especificación POSIX no lo permite, pero la aplicación de Linux mprotect permite cambiar la protección de acceso a la memoria heap. Hacer esto es realmente una mala idea.
allow_execmod - Permite cargar librerias dinamicas desde un sistema deslocalizado.
allow_ftpd_anon_write -Permite a los servidores ftp subir archivos.
allow_ftpd_use_cifs -Permite a los servidores ftp usar cifs.(Usados por los servicios de trasnferencia de ficheros).
allow_ftpd_use_nfs -Permite a los servidores ftp usar nfs.
allow_gpg_execstack -(Memory Protection)Permite a GPG ejecutar stacks.
allow_gssd_read_tmp -Permite a gssd leer en el directorio temp.
allow_httpd_anon_write -Permite al demonio httpd escribir ficheros y directorios etiquetados public_content_rw_t .
allow_httpd_mod_auth_pam -Permite a apache usar mod_auth_pam.
allow_java_execstack - Permite a java ejecutar stack.
allow_kerberos -Permite a todos los demonios usar kerberos.
allow_mplayer_execstack -Permite a mplayer ejecutar stack.
allow_nfsd_anon_write -Permite a los servidores nfs modificar los ficheros públicos usados por los servicios de transferencia de ficheros.
Como la lista es muy larga, adjunto abajo la lista completa en Ingles.
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
6. AGREGANDO PERMISOS
Cuando reiniciamos el pc por primera vez veremos “bloqueos” de selinux tales como este :
Jul 3 16:06:16 localhost kernel: audit(1215093976.609:42): avc: denied { read write } for pid=2627 comm="syslogd" name="xconsole" dev=tmpfs ino=7864 scontext=system_u:system_r:syslogd_t:s0
tcontext=system_u:object_r:device_t:s0
tclass=fifo_file
Que dice esto:
AVC ( Cache del vector de acceso) Cuando una aplicación intenta acceder a un objeto , tal como un archivo, el servidor de políticas verifica un cache del vector de acceso donde se registran los permisos de objeto y del sujeto.
Scontext (source security context)
Tcontext (target security context)
Tclass (target security class)
Este ejemplo muestra que el demonio syslogd_t esta siendo denegado su acceso de lectura y escritura con el objeto device_t.
Llegados a este punto vamos a usar el comando audit2allow.
Antes de nada debemos ver que alarmas vemos en log (en mi caso messages) y cuales queremos dar permisos. Es una buena idea meter dichas alarmas en otro log para trabajar con una alarma y dar permisos uno a uno. Me explico , en messages aparecen muchísimas alarmas AVC denied y no quiero dar permisos a todos los demonios, ejecutables que están siendo bloqueados por lo que copio la alarma en otro fichero.
Ahora ejecutamos lo siguientes:
audit2allow -M syslogd_t -l -i /var/log/messages
El nombre syslogd_t ( por ejemplo: audit2allow -M porno -l -i /var/log/messages) es un nombre que se lo he puesto yo para poder identificar el proceso pero podéis ponerle el que queráis.
Una vez ejecutado nos va a mostrar lo siguiente:
Debian:/etc/selinux/refpolicy-targeted/policy/te# audit2allow -M syslogd_t -l -i /var/log/messages
Generando archivo de obediencia de tipo: syslogd_t.te
Compilando�pol�tica
checkmodule -M -m -o syslogd_t.mod syslogd_t.te
semodule_package -o syslogd_t.pp -m syslogd_t.mod
******************** IMPORTANTE **********************
Para cargar esta nuevo paquete de políticas en el kernel,
debe ejecutar.
Semodule -i syslogd_t.pp
y tras este comando nos crea varios archivos ,syslogd_t.te, syslogd_t.pp, syslogd_t.mod.
Si editamos syslogd_t.te veremos algo como esto, este archivo contiene las reglas de ejecucion en el dominio de selinux según nuestro log messages.
module local 1.0;
require {
class fifo_file { read write };
type device_t;
type syslogd_t;
role system_r;
};
allow syslogd_t device_t:fifo_file { read write };
Y tras esto solo tenemos que cargas el modulo para que nos permita la ejecución , en este caso de syslogd_t en device_t de clase fifo_file.
Semodule -i syslogd_t.pp.
Tras esto comprobamos:
Debian:/etc/selinux/refpolicy-targeted/policy/te# semodule -l | grep syslog
syslogd_t 1.0
aquí está cargado. Tras esto no deberíamos tener problemas con syslogd_t.
6.1 Cambiando el puerto a cualquier servicio
Semanage es usado para configurar ciertos elementos de la política Selinus sin modificar o recompilar los “policy sources”.
¿Como puedo permitir que un servicio utilice cualquier puerto?
Regularmente Selinux solo permite que determinadas aplicaciones utilicen solo aquellos puertos para los cuales han sido configurados por defecto.
Por ejemplo , el servicio SSH escucha 22 si queremos que escuche por el 1010 debemos desplegar un conjunto de reglas confinadas en el dominio de Selinux con el nombre sshd_port. Para cambiar el puerto debemos ejecutar:
semanage port -a -t sshd_port -p tcp 1010
7. FUNCIONANDO CON ARCHIVOS
Si queremos
Algunas preguntas de interés.
¿Como puedo cambiar entre modo enforcement y modo permissive sin tener que reiniciar?
Si quieres cambiar entre el modo enforcement al modo permissive o al revés sin que tengas que reiniciar ni reconfigurar,puedes ejecutar el comando setenforce.
Debian:# setenforce
usage: setenforce [ Enforcing | Permissive | 1 | 0 ]
Como puedes ver si pones setenforce 1 lo cambias a enforcing y si pones setenforce 0 (cero) lo cambias a permissive.
¿Que significa setattr o getattr y otras advertencias en los logs ?
Setattr → set attributes ( establecer los atributos )
Getattr → get attributes ( obtener atributos )
relabelfrom → retiquetar desde
unlink →
ioctl → control de entrada y salida
recv_msg → recibir mensaje
getopt → obtener opciones de comandos
setopt → establecer opciones de comando
setfscreate →
Me sale un mensaje de error como este libsepol.module_package_read_offsets: module package header truncated , ¿que hago ?
wholesale:/etc/selinux# semodule -l
libsepol.module_package_read_offsets: module package header truncated
libsepol.module_package_read_offsets: wrong magic number for module package: expected 4185718671, got 4185718669
libsepol.module_package_read_offsets: wrong magic number for module package: expected 4185718671, got 1969516397
libsepol.module_package_read_offsets: wrong magic number for module package: expected 4185718671, got 543651137
apm 1.3.0
ata_id 1.0
cdrecord 1.1.0
dbus 1.3.0
dmidecode 1.1.0
Este error se ha producido por cargar módulos y guardarlos en un directorio que no debías como es
/etc/selinux/refpolicy-strict/modules/active/modules# este directorio es un directorio privado que solo libsemanage debería poder utilizar. Semodule copia todo de modules/active a modules/tmp para operar en el y cuando este lee un fichero como toto.mod este falla porque este es un modulo “policy” y no un paquete “policy”. Los paquetes policy son los .pp.




