sábado, 12 de febrero de 2011

Selinux

1.¿QUE ES, QUIEN LO CREO , ETC... ? .......................................3

2.ARCHIVOS DE CONFIGURCIÓN.................................................4

3. ARRANCANDO SELINUX......................................................8

4. PRIMER ARRANQUE.........................................................9

5. OBTENER EL ESTADO DE SELINUX...........................................10

6. SEMANAGE...............................................................11

7. SELINUX-POLICY-MLS.....................................................13

8. Selinux MCS (Multi-category Security)..................................13

9. PRIMER INICIO AGREGANDO PERMISOS.......................................15

10. FUNCIONANDO CON ARCHIVOS...............................................16

11. Selinux Default en Debian 5.0 y Ubuntu ..............................

12. ALGUNAS PREGUNTAS DE INTERES..........................................16







PROLOGO

Este manual lo he creado sobre apuntes, notas, manuales que existen en diferentes paginas web, comentarios,etc.

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.

1.1 Definiendo un Dominio

Un dominio es el atributo “principal” en SELinux. Dominio es la clasificación de un sujeto pero al tipo también se le suele llamar dominio para cada rol y este clasifica a un objeto. Por ejemplo:

Usuario Role Dominio/Tipo

Bob:user_r:corporate_t

En este caso el dominio o tipo es corporate_t.



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.

Lo siguiente a configurar son los diferentes tipos de políticas. Targeted , strict ( típico de distribuciones Debian) o MLS ( típico de distribuciones Ubuntu, Red hat o Fedora).

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.

mls permite asignar etiquetas a los datos como “Alto secreto” y prevenir el acceso a esos datos de procesos o archivos con una clasificación inferior. Esto le veremos en el punto 7.

SETLOCALDEFS=<0|1>

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.

2.3 Etiquetando ficheros en Selinux

Una de las funciones mas importantes de Selinux es crear un contexto de seguridad Selinux a los task, inodos y ficheros del sistema. Selinux les pone una etiqueta que incluye el contexto de seguridad asociado con el atributo de un objeto. Bajo el estándar Selinux, esta etiqueta es un separador de una cadena ASCI compuesta de valores para identificar, roles y tipos.
Las etiquetas con asignadas por el componente kernel llamado servidor de seguridad, usando reglas de la base de datos de políticas de seguridad.
Por ejemplo la etiqueta de /etc/shadow es :

system_u:object_r:shadow_t

Donde system_u y object_r son identidades genéricas y roles usados por shadow_t que es un tipo de fichero, un atributo que determina como puede ser accedido al fichero.
Otro ejemplo, sería re-etiquetando el mismo fichero :

root:staff_r:staff_t

La identidad selinux aquí es root. El tipo de proceso asignado es staff_t. Para un proceso el “tipo atributo” (type attribute) indica como se permite el acceso a un objeto o interactuar con otros procesos. El tipo de atributo de un proceso es , a veces, referido como un dominio.

En un ejemplo practico:

Debian:#id -Z
root:staff_r:staff_t

Debian:#cat /etc/shadow
cat: /etc/shadow: Permission denied


El log Selinux anota lo siguiente:

avc: denied { read } for pid=13653 exe=/bin/cat
name=shadow dev=hda6 ino=1361441 scontext=root:staff_r:staff_t
tcontext=system_u:object_r:shadow_t tclass=file

Al programa cat asignado con el contexto de seguridad root:staff_r:staff_t, se le denegó el permiso de lectura a la etiqueta del fichero system_u:object_r:shadow_t. Selinux no sabe el significado de cat o /etc/shadow . A Selinux solo le preocupa su contexto de seguridad del fichero, tipo de objeto ( en este caso un fichero) y el permiso que está siendo solicitado.

Como no es objeto de este manual complicar las cosas y dado que este tema es muy amplio aquí tenéis el articulo entero de donde lo saqué, en ingles, por si lo queréis leer.( Si he cometido errores de traducción comunicármelo, gracias)

http://www.linuxjournal.com/article/7426


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 política 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á.


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 módulos 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 al final del documento la lista completa en Ingles.
5.Obtener el estado de Selinux

Para saber el estado de selinux 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. SEMANAGE

Semanage es un potente comando usado para configurar ciertos elementos de la política Selinus sin modificar o recompilar los “policy sources” o fuentes.
Este comando es tremendamente útil si tenemos un servidor y queremos personalizar su uso.

Por ejemplo para ver como están definidos las políticas para los usuarios:

Debian:#semanage user -l

Aquí nos mostrará las políticas para los usuarios, algo como esto.

Debian# semanage user -l
SELinux User Labeling MLS/ MLS/ SELinux Roles
/Prefix MCS Level MCS Range
root user s0 s0-s0:c0.c1023 sysadm_r staff_r
staff_u user s0 s0-s0:c0.c1023 sysadm_r staff_r
system_u user s0 s0-s0:c0.c1023 system_r
user_u user s0 s0-s0:c0.c1023 user_r system_r sysadm_r
Debéis recordar los roles de selinux (ver 2.2.1 de este manual)y fijaros que todos los user_u tienen el rol, mas adelante veremos el porqué.

Del mismo modo si ponemos:

Debian:#semanage port -l (recordar que estamos usando ele de LIST)

Nos mostrará todos los puertos asignados a cada servicio.

6.1 Modificando políticas genéricas de usuarios

Si queremos modificar los permisos genéricos para todos los usuarios, recordemos el ejemplo anterior los user_u tenían el rol de administración, ponemos:

Debian:#semanage user -m -R 'user_r system_r' -p user user_u

De esta forma le estamos quitando el rol de administración a todos los usuarios que viene por defecto.

6.2 Agregando permisos a usuarios

Del mismo modo que en el ejemplo anterior, si queremos agregar un usuario genérico para hacer un determinado numero de tareas, (recordar el punto 2.2 que habla del fichero local.users):

Debian:#semanage user -a -R 'staff_r sysadm_r' -P staff pruebas_u

Estamos agregando pruebas_u para tareas de administración de está forma podemos asociar todos los usuarios que necesitemos a este “grupo”.

Imaginemos que necesitemos “logearnos” con un usuario con derechos de administración, pues:

Debian:#semanage login -a -s staff_u pablito

Ya está el usuario pablito podrá acceder al equipo con el rol staff_u.


6.3 Asignando o modificando el puerto de un determinado servicio.

Para asociar un determinado servicio a un puerto en concreto:

Debian:#semanage port -a -t sshd_port_t -p tcp 22

En este ejemplo estamos asignando el puerto 22 al servicio SSH. La opción -t sirve para especificar el tipo de objeto selinux, la opción -a sirve para agregar.(Para ver mas opciones ver el man de semanage.

6.4 Modificar la localización por defecto de algunos servicios

Muchos administradores personalizan sus servidores apache o ssh de forma que cambian los ficheros o directorios de sitio.
Si tenemos que cambiar la ubicación de un determinado servicio lo podemos hacer de la siguiente manera:

Debian:#semanage fcontext -a -t httpd_sys_content_t "/var/web(/.*)?"

Con esto le estamos diciendo que el directorio para poder utilizar el servidor es /var/web.
El tipo de contexto lo definen los módulos que tenemos cargados, por tanto si queremos asignar un puerto a squid no vale con poner squid_t , antes tenemos que cargar el modulo o sino lo tenemos crearlo y después cargarlo. Para crearlos tenéis programas que lo hacen como SLIDE, hay varios.

7.SELINUX-POLICY-MLS

Un importante aumento en la seguridad es la seguridad multi-nivel (MLS) integrado en RHEL5.Este modelo permite a RHEL5 obtener certificaciones EAL4+LSLPP, las cuales significan que RHEL5 está ahora considerado como un S.O. Permitido y pueden ser vendidas a instituciones y gobiernos que necesitan de la mas estricta política de seguridad. MLS permite asignar etiquetas a los datos como “Alto secreto” y prevenir el acceso a esos datos de procesos o archivos con una clasificación inferior.
Un nivel es un atributo de MLS. La primera parte del nivel, s0-s0, es la sensibilidad. Actualmente, s0-s0 es un rango MLS donde el nivel mas bajo, en este caso, tiene sensibilidad s0 y el mas alto s0 sin categorías.
7.1 Activación del servicio.

Para activar este servicio solo hay que modificar el fichero /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=mls

Como vimos en el punto 2.1
8. Selinux MCS (Multi-category Security)

Una de las carateristicas de Selinux, tanto en modo enforcement como en modo strict es MCS o Seguridad Multi-Categoría. Básicamente se trata de proteger los datos confidenciales de forma que unos datos secretos no sean expuestos.
Pero MCS no fue creado para prevenir al sistema de crackers sino como un extra para proteger datos confidenciales de filtros o búsquedas accidentales o deliberadas.


Un fichero tiene el MLS y MCS ( categoría )s0:c0.c10, el s0 no es ninguna categoría. La parte que importa es c0.c10 que significa que tiene todas las categorías desde la c0 hasta la c10 ( ambas inclusive), dependiendo de la distribución y la versión Selinux hay mas o menos categorías ( fedora 6 tiene 1024 categorías, creo).




Un proceso debe tener la etiqueta MLS s0-s0:c0.c100. El cual significa que el nivel mas bajo de la etiqueta o rango es s0 ( sin categoría) y el nivel mas alto es s0:c0.c100.
Básicamente es como una biblioteca donde en vez de tener los libros clasificados en A , B están clasificados como A1 , B1 , C1 , A11, etc.
Todas las categorías deben ser nombradas, al igual que los usuarios deben tener definido en que categorías pueden acceder.

8.1 Configurando categorías , setrans.conf

En el fichero setrans.conf están definidos las categorías del sistema.

# s0:c0=CompanyConfidential
# s0:c1=PatientRecord
# s0:c2=Unclassified
# s0:c3=TopSecret
# s0:c1,c3=CompanyConfidentialRedHat
s0=
s0-s0:c0=ProjectoA
s0-s0:c0.c1023=SystemLow-SystemHigh
s0:c0.c1023=SystemHigh

8.2 Rango MCS o categorías en usuarios de un sistema

Recordando el punto 6 vemos que todos los usuarios pueden acceder a todas las categorías desde la s0 hasta la mas alta (s0-s0:c0.c1023).

Debian# semanage user -l
SELinux User Labeling MLS/ MLS/ SELinux Roles
/Prefix MCS Level MCS Range
root user s0 s0-s0:c0.c1023 sysadm_r staff_r
staff_u user s0 s0-s0:c0.c1023 sysadm_r staff_r
system_u user s0 s0-s0:c0.c1023 system_r
user_u user s0 s0-s0:c0.c1023 user_r system_r sysadm_r

Si queremos que un usuario regular solo acceda los ficheros etiquetados con una etiqueta baja, ( esto lo veremos mas adelante):
user_u user s0 s0-s0:c0 user_r

8.3 Asignando categorías a usuarios genéricos o identidades

Antes de nada, tenemos que asignar un nivel de sensibilidad a los usuarios. Hay que tener en cuenta que el nivel mas bajo de sensibilidad determinará el nivel de sensibilidad a la hora de crear ficheros o directorios. Es decir si tenemos como nivel mas bajo s0:c1, todos los ficheros tendrán ese nivel de sensibilidad. Y el nivel mas alto determinará hasta donde podemos acceder. Es decir si tenemos s0:c20 podremos acceder a ficheros desde s0:c1 hasta s0:c20.

Por ejemplo, vamos utilizar semanage para agregar la identidad Selinux “cobros” con un nivel bajo s0:c1 ( el cual significa que todos los ficheros que el usuario cree tendrán como categoría c1 por defecto)y un sistema alto de SystemHigh ( recordemos s0:c0.c1023=SystemHigh).

Debian:#semanage user -a -P user -R user_r -L s0:c1 -r s0:c1-SystemHigh cobros

Bien, después de este comando podemos ver el usuario :

Debian# semanage user -l
SELinux User Labeling MLS/ MLS/ SELinux Roles
/Prefix MCS Level MCS Range
cobros user s0:c1 s0:c1-SystemHigh user_r
root user s0 s0-s0:c0.c1023 sysadm_r staff_r
staff_u user s0 s0-s0:c0.c1023 sysadm_r staff_r
system_u user s0 s0-s0:c0.c1023 system_r
user_u user s0 s0-s0:c0.c1023 user_r system_r sysadm_r

Tras esto debemos crearle una entrada “login” para asignarle una cuenta unix a la identidad , en este caso “cobros”. La configuración login también permite especificar el rango MCS, porque tu podrías tener muchas cuentas unix con la misma identidad Selinux los cuales tendrían diferentes rangos asignados a los mismos cuando se logaran al sistema.
Aquí vemos el siguiente ejemplo, la opción -s especifica la identidad selinux y la opción -r indica el rango.

Debian:#semanage login -a -s cobros -r s0:c1-SystemHigh cobros

El rango MCS en login no puede ser superior ni inferior al rango MCS del usuario. Para que todos estos cambios tengan efecto hay que reiniciar.

8.4 Ejemplos prácticos

Si necesitamos que todo usuario del sistema tenga la categoría s0:c0 ( la mas baja, recordar que la categoría no es jerárquica, es decir le ponemos lo que nos da la gana), tendríamos que :

Debian:#semanage user -m -r s0-s0:c0 user_u

Bueno ya estaría hecho, ahora para comprobar si lo ha cambiado bien,
Debian:#semanage user -l

y deberia aparecer :

user_u user s0 s0-s0:c0 user_r

Bien, ahora podríamos crear un fichero llamado Cuentas.txt y queremos sea TopSecret, para los usuarios propietarios del fichero ( Recordemos que TopSecret=s0:c3, pero si queremos):

Debian:#chcon -u user_u -l s0:c3 prueba.txt (En este caso el propietario es user_u)

Bien, si después de esto intentamos abrir o ver su contenido siendo el propietario del archivo nos debería indicar acceso denegado. Solo el usuario que tenga el mismo contexto podrá acceder a el.

Ahora, queremos que Juan sea el único que pueda leer el fichero.

Debian:#chcat -l +s0:c3 juan



8.5 Runcon

Se utiliza runcon para “correr” comandos en un contexto especifico de seguridad.


8.6 Genhomedircon

Este comando genera un archivo de configuración de la entrada del contexto Selinux para los directorios de los usuarios home.






9. PRIMER ARRANQUE , 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.


11.Selinux Default en Debian 5.0 y Ubuntu

Las nuevas distribuciones Linux han eliminado las políticas targeted y stric ( para mas información aquí). En su lugar han creado la política Default.

Dicha política viene a ser lo mismo. Me explico:

Si editáis el fichero /etc/selinux/default/seusers veréis lo siguiente:

system_u:system_u:s0-s0:c0.c1023
root:sysadm_u:s0-s0:c0.c1023
user_u:unconfined:s0

Entonces si lo dejamos como está, la política será la misma que targeted. Pero si cambiamos la siguiente linea:

user_u:unconfined:s0 por user_u:user_u:s0

Confinamos todos los usuarios del sistema y por tanto aplicamos la política strict.



Ubuntu sigue sin dar soporte a selinux por lo que si intentamos instalamos Selinux desde apt encontraremos que el kernel no soporta Selinux. No he encontrado aun como solventar este problema.



12.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 → reetiquetar desde

ioctl → control de entrada y salida

recv_msg → recibir mensaje

getopt → obtener opciones de comandos

setopt → establecer opciones de comando

setfscreate → establece el marco utilizado para la creación de un nuevo sistema de archivos objeto. Se puede pasar a setfscreatecon para restablecer la política de comportamiento por defecto.

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.





¿Como deshabilito selinux para APACHE?

Como hemos visto antes tenemos que activar el booleano correspondiente al demonio httpd, pero antes busca que lo tienes con :

Debian:#getsebool -a | grep httpd

Si te sale algo como esto

httpd_disable_trans → off

es que está desactivado. Con este otro comando lo activamos y así desactivamos la protección selinux sobre el demonio httpd. ( muy peligroso pero cada uno..):

Debian:#setsebool -P httpd_disable_trans=1

No hay comentarios:

Publicar un comentario