lunes, 3 de febrero de 2014

Entendiendo SELinux (Parte I)

Como vimos en un post anterior, SELinux es una implementación de seguridad realizada por el Departamento de Defensa de los EEUU al Kernel GNU/Linux. Reflexionábamos un poco de lo importante que es saber manejarlo y sobre todo mantenerlo habilitado para proteger nuestro sistema de atacantes externos e internos.

Lo prometido es deuda y aquí, en esta primera parte, veremos los conceptos básicos del funcionamiento de SELinux en nuestro sistema operativo.

Entendiendo cómo funciona
Al finalizar una instalación tradicional de un sistema Red Hat o derivado (CentOS, Fedora, etc.) podemos confirmar que SELinux se encuentra activo.
[root@localhost ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 24
Policy from config file:        targeted
Además instalaremos el paquete setroubleshoot-server y sus dependencias, el cual tiene las herramientas de depuración y resolución de problemas para SELinux.
[root@localhost ~]# yum install -y setroubleshoot-server
Usuarios de SELinux
Para ver una lista de los usuarios de SELinux y los roles asignados, lo haremos con el comando semanage el cual es parte del paquete setroubleshoot-server:
[root@localhost ~]# semanage user -l

                Labeling   MLS/       MLS/                         
SELinux User    Prefix     MCS Level  MCS Range                      SELinux Roles

git_shell_u     user       s0         s0                             git_shell_r
guest_u         user       s0         s0                             guest_r
root            user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
staff_u         user       s0         s0-s0:c0.c1023                 staff_r sysadm_r system_r unconfined_r
sysadm_u        user       s0         s0-s0:c0.c1023                 sysadm_r
system_u        user       s0         s0-s0:c0.c1023                 system_r unconfined_r
unconfined_u    user       s0         s0-s0:c0.c1023                 system_r unconfined_r
user_u          user       s0         s0                             user_r
xguest_u        user       s0         s0                             xguest_r
Contexto de seguridad
Un contexto de seguridad en SELinux para un fichero o proceso está compuesto por cuatro atributos: SELinux User, Role, Type/Domain y Category/Level.

Para ver el contexto de un fichero podemos hacer uso del comando ls -Z.
[root@localhost ~]# ls -Z anaconda-ks.cfg
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
Como podemos observar, hay información que sin la opción -Z no podemos ver:
  • system_u: Es el SELinux User
  • object_r: Es el Role
  • admin_home_t: Es el Type/Domain
  • s0: Es el Category/Level
En el caso de los procesos lo haremos con el comando ps auxZ.
[root@localhost ~]# ps auxZ | grep postfix
system_u:system_r:postfix_master_t:s0 root 984  0.0  0.6  81272  3408 ?        Ss   23:18   0:00 /usr/libexec/postfix/master
system_u:system_r:postfix_pickup_t:s0 postfix 990 0.0  0.6 81352 3360 ?        S    23:18   0:00 pickup -l -t fifo -u
system_u:system_r:postfix_qmgr_t:s0 postfix 991 0.0  0.6  81420  3408 ?        S    23:18   0:00 qmgr -l -t fifo -u
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 1172 0.0  0.1 103244 852 pts/0 S+ 23:23   0:00 grep postfix
Con el comando anterior estamos visualizando el contexto del proceso postfix, un Mail Transfer Agent (MTA). Al igual que con el comando ls, con la opción Z hay datos que no visualizamos sin ella.
  • system_u: Es el SELinux user
  • system_r: Es el Role
  • postfix_master_t: Es el Type/Domain
  • s0: Es el Category/Level

En la segunda parte de esta serie veremos algunos detalles del filesystem /selinux y el fichero de configuración /etc/selinux/config

1 comentario: