Esta semana desplegando contenedores LXC no privilegiados me encontré con el problema de no poder logarme a través de SSH. En los logs del contenedor aparece el error pam_loginuid(sshd:session): set_loginuid failed
. A continuación el log completo registrado por SystemD:
|
|
La explicación
El módulo pam_loginuid forma parte de PAM (Pluggable Authentication Modules for Linux); y es usado para añadir el atributo uid (user-id) a todos los procesos de la sesión con el objetivo de realizar comprobaciones de permisos (auditorias).
Tradicionalmente UNIX distinguía dos tipos de procesos:
Procesos privilegiados
, aquellos cuyo uid (user id) es 0, es decir, pertenecen a root. Los procesos prvilegiados pueden saltarse todas las comprobaciones de permisos.Procesos no privilegiados
, aquellos cuyo uid es distinto de 0, es decir, no pertenecen a root. Los procesos no pivilegiados deben pasar todas las comprobaciones de permisos de acuerdo a las credenciales (uid, guid y lista de grupos suplementarios) del proceso.
Desde el kernel 2.2 de Linux estos privilegios se dividen en unidades conocidas como capalities (capacidades), las cuales pueden activarse o desactivarse de forma independiente.
Puede obtener más información, así como la lista de capabilities implementadas en la versión del kernel de Linux que esta usando, ejecutando en un terminal man capabilities
.
En este caso la capability que genera el problema es CAP_AUDIT_WRITE (introducida en la versión del kernel de Linux 2.6.11), la cual es responsable de escribir los registros de auditoria del kernel. El problema radica en que un contenedor no privilegiado no puede escribir los registros de auditoria del kenel.
Al mirar la configuración del demonio SSH en /etc/pam.d/sshd
se puede ver la línea session required pam_loginuid.so
, es decir, para iniciar sesión se requiere hacer uso de la capability CAP_AUDIT_WRITE para registrar el uid del usuario.
La solución
Para solucionar este problema solo es necesario comentar el módulo pam_loginuid.so
de /etc/pam.d/sshd
o bien hacer que sea opcional en lugar de obligatorio. Personalmente opto por hacer-lo opcional, con el comando sed
:
|
|
Ejemplo de como quedaría:
|
|