Gentoo Logo

Renuncia de responsabilidad: Este documento ya no es válido y carece de soporte.


[ << ] [ < ] [ Inicio ] [ > ] [ >> ]


6. Solucionando problemas con SELinux

Contenido:

6.a. No se puede cargar la directriz de SELinux

Descripción del problema

Si observa que SELinux no está funcionando, puede ejecutar sestatus para ser informado rápidamente si SELinux está habilitado y cargado o no. Si obtiene la siguiente salida, entonces ninguna directriz de SELinux se ha cargado:

Listado de Código 1.1: Salida de sestatus

SELinux status:                disabled

Si éste es el caso, continúe leyendo esta sección para averiguar cómo corregir esta situación.

No hay ninguna directriz instalada

Una raíz potencial de este problema es que no hay ninguna directriz con la que comenzar. Eche un vistazo a /usr/share/selinux/strict o a /usr/share/selinux/targeted (dependiendo de su configuración) y busque un fichero llamado base.pp. Si no existe este fichero, necesitará instalar la directriz base. Esta directriz se ofrece con el paquete sec-policy/selinux-base-policy, pero es mejor leer el capítulo relacionado con la Instalación de Gentoo SELinux / Conversión ya que podría pasar por alto detalles importantes.

La directriz no se ha cargado

Si existe el fichero base.pp en /usr/share/selinux/strict (o en targeted/), eche un vistazo a /etc/selinux/strict/policy. Esta localización también debería contener un módulo de directriz base.pp (cuando se carga una directriz de SELinux, se copia desde la primera localización a la segunda).

Si no existe el fichero base.pp, instale la directriz y cárguela:

Listado de Código 1.2: Instalar la directriz base

~# semodule -n -B

Esto es una operación que se realiza solo en una ocasión. Una vez instalada y cargada, ésta será recargada en cada reinicio.

Init no puede cargar la directriz SELinux

Durante el inicio del sistema, el proceso init es el responsable de cargar e interactuar con la directriz SELinux en memoria. Si init no soporta SELinux, su entorno no dispondrá de soporte para SELinux.

Para verificar si init soporta SELinux, necesitamos comprobar si utiliza el objeto compartido libselinux.so:

Listado de Código 1.3: Comprobar si init soporta SELinux

~# ldd /sbin/init
        linux-vdso.so.1 =>  (0x00006ace30e84000)
        ( Debería ver algo similar a la siguiente línea: )
        libselinux.so.1 => /lib/libselinux.so.1 (0x00006ace30a46000)
        libc.so.6 => /lib/libc.so.6 (0x00006ace306e9000)
        libdl.so.2 => /lib/libdl.so.2 (0x00006ace304e5000)
        /lib64/ld-linux-x86-64.so.2 (0x00006ace30c68000)

Si éste no es el caso, asegúrese de que emerge --info muestra que el ajuste USE selinux está en su sitio y reinstale sys-apps/sysvinit. Si este ajuste no está definido, compruebe su perfil Gentoo y asegúrese de que apunta a un perfil selinux/v2refpolicy/....

El almacén de directices está corrupto

Si aparecen problemas en el inicio del sistema o en operaciones semodule que fallan con problemas en la carga pero no se puede resolver con la solucón de arriba, entonces necesitará reinstalar las directrices una vez eliminado el almacén corrupto.

Listado de Código 1.4: Recuperarse de un almacén corrupto

~# semodule -n -B
libsemanage.semanage_load_module: Error while reading from module file
/etc/selinux/targeted/modules/tmp/base.pp. (No such file or directory)

~# setenforce 0
~# mv /etc/selinux/targeted /etc/selinux/targeted.old
~# FEATURES="-selinux" emerge -1av $(qlist -IC sec-policy)
~# restorecon -R /etc/selinux

Esto desactivará efectivamente el almacén corrupto actual de la directriz de SELinux y utilizará Portage para reinstalar todos los paquetes de directriz que se han instalado en el sistema. Cuando haya terminado, los contextos de fichero de /etc/selinux serán restaurados, después de lo cual podrá continuar.

6.b. No se puede ingresar en el sistema

Descripción del problema

Si no puede ingresar en el sistema en una situación en particular (en remoto, en local, como root, como usuario regular,...) puede que se esté encontrando con algún problema sin mucha importancia. Sin embargo, para resolverlo tendrá que ingresar en el sistema como sysadm_r de un modo u otro.

Si no puede ingresar como un usuario sysadm_r, deshabilite SELinux (arranque con enforcing=0) de este modo no se realiza ningún forzado SELinux. Los cambios que haga en modo permisivo son igual de efectivos que en el modo forzado (enforcing).

Contexto incorrecto

En la mayoría de los casos encontrará que el problema es un contexto de seguridad incorrecto. Ejecute sestatus -v y compare los contextos de proceso o los contextos de fichero que observe con los dados en la siguiente tabla.

Proceso Contexto Si el contexto no es el adecuado...
Contexto init system_u:system_r:init_t En primer lugar, verifique que el propio init está correctamente etiquetado. Compruebe la salida de la ejecución anterior de la orden sestatus -v para el fichero /sbin/init y asegúrese de que está ajustado a system_u:object_r:init_exec_t. Si este no es el caso, etiquete de nuevo sys-apps/sysvinit usando rlpkg sysvinit. Haga las mismas comprobaciones que se realizan en la sección No se puede cargar la directriz de SELinux . Reinicie su sistema e inténtelo de nuevo.
Contexto agetty system_u:system_r:getty_t Asegúrese de que el binario /sbin/agetty esta etiquetado como system_u:object_r:getty_exec_t. Si no es así, etiquete de nuevo el paquete sys-apps/util-linux usando rlpkg util-linux. A continuación reinicie todos los procesos agetty usando pkill agetty (estos procesos se pondrán en marcha de nuevo automáticamente).
Fichero Contexto Si el contexto no es el adecuado...
/bin/login system_u:object_r:login_exec_t El binario login forma parte de sys-apps/shadow. Ejecute rlpkg shadow para etiquetar de nuevo los ficheros de este paquete y reintente el ingreso en el sistema.
/sbin/unix_chkpwd system_u:object_r:chkpwd_exec_t Este binario es parte del paquete sys-libs/pam y SSH lo utiliza cuando se configura para que use PAM a la hora de realizar la autenticación de usuarios. Etiquete de nuevo el paquete usando rlpkg pam e intente de nuevo el ingreso en el sistema.
/etc/passwd system_u:object_r:etc_t Tanto /etc/passwd como /etc/shadow deben estar etiquetados correctamente, de lo contrario PAM no podrá autenticar a ningún usuario. Etiquete de nuevo los ficheros con restorecon /etc/passwd /etc/shadow e intente de nuevo el ingreso en el sistema.
/etc/shadow system_u:object_r:shadow_t
/bin/bash system_u:object_r:shell_exec_t El intérprete de comandos del usuario (en este caso, bash) se debe etiquetar correctamente de modo que el usuario pueda cambiar al dominio de usuario cuando ingrese en el sistema. Para hacer esto, etiquete de nuevo el paquete app-shells/bash usando rlpkg bash. Entonces puede intentar de nuevo el ingreso en el sistema.

6.c. No se puede hacer emerge de ningún paquete (OSError: [Errno 22] Invalid argument)

Descripción del problema

Cuando se intenta instalar software con Portage, se obtiene un volcado enorme de la pila de python y finalmente el mensaje de error OSError: [Errno 22] Invalid argument:

Listado de Código 3.1: Volcado de la traza de la pila cuando falla portage al instalar software

Traceback (most recent call last):
  File "/usr/bin/emerge", line 43, in <module>
    retval = emerge_main()
  File "/usr/lib64/portage/pym/_emerge/main.py", line 1906, in emerge_main
    myopts, myaction, myfiles, spinner)
  File "/usr/lib64/portage/pym/_emerge/actions.py", line 437, in action_build
    retval = mergetask.merge()
...
  File "/usr/lib64/portage/pym/portage/package/ebuild/doebuild.py", line 104, in _doebuild_spawn
    return spawn(cmd, settings, **kwargs)
  File "/usr/lib64/portage/pym/portage/package/ebuild/doebuild.py", line 1255, in spawn
    return spawn_func(mystring, env=mysettings.environ(), **keywords)
  File "/usr/lib64/portage/pym/portage/_selinux.py", line 105, in wrapper_func
    setexec(con)
  File "/usr/lib64/portage/pym/portage/_selinux.py", line 79, in setexec
    if selinux.setexeccon(ctx) < 0:
OSError: [Errno 22] Invalid argument

Contexto erróneo

El error de arriba se produce cuando se lanza portage (mediante emerge) y no nos encontramos en el contexto sysadm_t. Puede verificar esto con id -Z:

Listado de Código 3.2: Comprobando el contexto actual

~# id -Z
system_u:system_r:local_login_t

Portage fallarán mientras el contexto utilizado no sea sysadm_t. Esto es debido a que Portage quiere cambiar su contexto de ejecución de portage_t a portage_sandbox_t, sin embargo no puede conseguirlo (para empezar, no está en portage_t debido a que el usuario que lanzó Portage no está en sysadm_t).

Por favor, compruebe la sección No se puede ingresar en el sistema de arriba en primer lugar. También, asegúrese de que puede hacer dispatch-conf o etc-update después de instalar SELinux de modo que se actualice /etc/pam.d/system-login con las llamadas correctas a pam_selinux.so.

Forzar la instalacilón

Si necesita forzar a Portage para que continúe a pesar de todo (por ejemplo, se encontraba en medio de una instalación de SELinux por lo que no puede resolver esas cuestiones ahora), ejecute la orden emerge pero con FEATURES="-selinux". Esto deshabilitará efectivamente la integración de SELinux en Portage y permitirá continuar con la instalación del software.

Listado de Código 3.3: Correr emerge sin soporte selinux

~# FEATURES="-selinux" emerge -u world

¡Asegúrese de que etiqueta de nuevo todo el sistema de ficheros después de aplicar este enfoque!. Portage no etiquetará correctamente los ficheros instalados en el sistema si deshabilita el soporte SELinux. Para etiquetar de nuevo todo el sistema de ficheros, utilice rlpkg -a -r.


[ << ] [ < ] [ Inicio ] [ > ] [ >> ]


Imprimir

Ver completo

Página actualizada 10 de abril, 2012

Sumario: Todo lo que haga un humano puede y de hecho, fallará. En este capítulo intentaremos mostrar todos los problemas potenciales con los que se puede encontrar y cómo resolverlos.

Chris PeBenito
Autor

Sven Vermeulen
Autor

Chris Richards
Autor

José María Alonso
Traductor

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.