Product SiteDocumentation Site

4.2. Procesos no Confinados

Los procesos no confinados corren en dominios no confinados, por ejemplo, los programas init (del arranque) corren en el dominio no confinado initrc_t, los procesos no confinados del kernel corren en el dominio kernel_t y los usuarios no confinados deLInux corren en el dominio unconfined_t. Para procesos no confinados, las reglas de la política de SELinux son aplicadas, pero hay reglas de la política que permiten que los procesos se ejecuten en dominios no confinados tengan casi todos los accesos. Los procesos que corren en dominios no confinados terminan usando exclusivamente las reglas DAC. Si un proceso no confinado es comprometido, SELinux no impide que un atacante gane acceso a los recursos del sistema y a los datos, pero, por supuesto, las reglas DAC todavía se usan. SELinux es una mejora de seguridad sobre las reglas DAC - no las reemplaza.
El siguiente ejemplo muestra cómo el Servidor HTTP Apache (httpd) puede acceder datos que se suponen son para ser usados por Samba, cuando se corre no confinado. Nota: en Fedora 11, el proceso httpd corre en el dominio confinado httpd_t por defecto. Este es un ejemplo, y no debe usarse en producción. Se asume que los paquetes httpd, wget, setroubleshoot-server, y audit están instalados, que se usa la política destinada de SELinux y que SELinux corre en modo obligatorio:
  1. Ejecute el comando sestatus para confirmar que SELinux está activado, se ejecuta en modo obligatorio y que la política destinada se está usando:
    $ /usr/sbin/sestatus
    SELinux status:                 enabled
    SELinuxfs mount:                /selinux
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy version:                 23
    Policy from config file:        targeted
    
    SELinux status: enabled is returned when SELinux is enabled. Current mode: enforcing is returned when SELinux is running in enforcing mode. Policy from config file: targeted is returned when the SELinux targeted policy is used.
  2. Como usuario root de Linux, corra el comando touch /var/www/html/prueba2 para crear un archivo.
  3. Ejecute el comando ls -Z /var/www/html/prueba2 para ver el contexto SELinux:
    -rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/prueba2
    
    Por defecto, los usuarios Linux corren no confinados en Fedora 11, razón por la cual el archivo prueba2 está etiquetado con el usuario SELinux unconfined_u. RBAC se usa para procesos, no para archivos. Los roles no tienen un significado para archivos - el rol object_r es el rol genérico que se usa para archivos (en almacenamiento persistente y sistemas de archivos de red). Bajo el directorio /proc/, los archivos relacionados con procesos pueden usar el rol system_r.[7] El tipo httpd_sys_content_t permite al proceso httpd acceder a este archivo.
  4. El comando chcon reetiqueta archivos; sin embargo, tales cambios de etiquetas no sobreviven cuando el sistema se reetiqueta. Para que los cambios sobrevivan un reetiquetado del sistema, use el comando semanage, que se discute más adelante. Como usuario root de Linux, corra el siguiente comando para cambiar el tipo a un tipo usado por Samba:
    chcon -t samba_share_t /var/www/html/prueba2
    Ejecute el comando ls -Z /var/www/html/prueba2 para ver los cambios:
    -rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/prueba2
    
  5. Corra el comando service httpd status para confirmar que el proceso httpd no se está ejecutando:
    $ /sbin/service httpd status
    httpd está detenido
    
    Si la salida difiere, ejecute service httpd stop como usuario root de Linux para detener el proceso httpd:
    # /sbin/service httpd stop
    Deteniendo httpd:                                            [  OK  ]
    
  6. Para hacer que el proceso httpd corra no confinado, ejecute el siguiente comando como usuario root de Linux para cambiar el tipo de /usr/sbin/httpd, a un tipo que no transicione a un dominio confinado:
    chcon -t unconfined_exec_t /usr/sbin/httpd
  7. Ejecute el comando ls -Z /usr/sbin/httpd para confirmar que /usr/sbin/httpd está etiquetado con el tipo unconfined_exec_t:
    -rwxr-xr-x  root root system_u:object_r:unconfined_exec_t /usr/sbin/httpd
    
  8. Como usuario root de Linux, ejecute el comando service httpd start para iniciar el proceso httpd. La salida escomo sigue si httpd inicia con éxito:
    # /sbin/service httpd start
    Iniciando httpd:                                            [  OK  ]
    
  9. Ejecute el comando ps -eZ | grep httpd para ver si httpd está corriendo en el dominio unconfined_t:
    $ ps -eZ | grep httpd
    unconfined_u:system_r:unconfined_t 7721 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7723 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7724 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7725 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7726 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7727 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7728 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7729 ?      00:00:00 httpd
    unconfined_u:system_r:unconfined_t 7730 ?      00:00:00 httpd
    
  10. Cambie al directorio donde su usuario Linux tenga permiso de escritura y ejecute el comando wget http://localhost/prueba2. A menos que hayan cambios en la configuración predeterminada, este comando debería tener éxito:
    --2009-05-07 01:41:10--  http://localhost/prueba2
    Resolving localhost... 127.0.0.1
    Connecting to localhost|127.0.0.1|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 0 [text/plain]
    Saving to: `prueba2.1'
    
    [ <=>                            ]--.-K/s   in 0s      
            
    2009-05-07 01:41:10 (0.00 B/s) - `prueba2.1' saved [0/0]
    
    Aunque el proceso httpd no tiene acceso a archivos etiquetados con el tipo samba_share_t, httpd se ejecuta en el dominio unconfined_t, y termina usando las reglas DAC, como tal, el comando wget tiene éxito. Teniendo a httpd ejecutándose en el dominio httpd_t, el comando wget habría fallado.
  11. El comando restorecon restaura el contexto SELinux predeterminado de los archivos. Como usuario root de Linux, ejecute el comando restorecon -v /usr/sbin/httpd para restaurar el contexto SELinux de /usr/sbin/httpd:
    # /sbin/restorecon -v /usr/sbin/httpd
    restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_notrans_exec_t:s0->system_u:object_r:httpd_exec_t:s0
    
    Ejecute el comando ls -Z /usr/sbin/httpd para confirmar que /usr/sbin/httpd está etiquetado con el tipo httpd_exec_t:
    $ ls -Z /usr/sbin/httpd
    -rwxr-xr-x  root root system_u:object_r:httpd_exec_t   /usr/sbin/httpd
    
  12. Como usuario root de Linux, corra el comando /sbin/service httpd restart para reiniciar httpd. Después de reiniciar, ejecute ps -eZ | grep httpd para confirmar que httpd se está ejecutando en el dominio confinado httpd_t:
    # /sbin/service httpd restart
    Stopping httpd:                                            [  OK  ]
    Starting httpd:                                            [  OK  ]
    # ps -eZ | grep httpd
    unconfined_u:system_r:httpd_t    8880 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8882 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8883 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8884 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8885 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8886 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8887 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8888 ?        00:00:00 httpd
    unconfined_u:system_r:httpd_t    8889 ?        00:00:00 httpd
    
  13. Como usuario root de Linux, corra el comando rm -i /var/www/html/prueba2 para eliminar prueba2.
  14. Si no necesita que corra httpd, como usuario root de Linux corra el comando service httpd stop para detener a httpd:
    # /sbin/service httpd stop
    Deteniendo httpd:                                            [  OK  ]
    
Los ejemplos en estas secciones muestran cómo proteger los datos desde un proceso confinado comprometido (protegido por SELinux), así como cuánto más accesible son los datos para un atacante si el proceso comprometido estaba no confinado (no protegido por SELinux).


[7] Cuando se usan otras políticas, tal como la MLS, se pueden usar también otros roles, por ejemplo el secadm_r.