SSH: set_loginuid failed

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@CT001 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2016-12-27 16:58:01 UTC; 3min 39s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 2084 ExecStart=/usr/sbin/sshd $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 2085 (sshd)
CGroup: /system.slice/sshd.service
└─2085 /usr/sbin/sshd
Dec 27 16:58:01 CT001 systemd[1]: Starting OpenSSH server daemon...
Dec 27 16:58:01 CT001 systemd[1]: PID file /var/run/sshd.pid not readable (yet?) after start.
Dec 27 16:58:01 CT001 sshd[2085]: Server listening on 0.0.0.0 port 22.
Dec 27 16:58:01 CT001 sshd[2085]: Server listening on :: port 22.
Dec 27 16:58:01 CT001 systemd[1]: Started OpenSSH server daemon.
Dec 27 16:58:10 CT001 sshd[2087]: Accepted password for root from 192.168.1.172 port 55492 ssh2
Dec 27 16:58:10 CT001 sshd[2087]: pam_loginuid(sshd:session): set_loginuid failed

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:

  1. Procesos privilegiados, aquellos cuyo uid (user id) es 0, es decir, pertenecen a root. Los procesos prvilegiados pueden saltarse todas las comprobaciones de permisos.
  2. 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:

1
sed -i '/pam_loginuid.so/s/required/optional/g' /etc/pam.d/sshd

Ejemplo de como quedaría:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@CT001 ~]# cat /etc/pam.d/sshd
#%PAM-1.0
auth required pam_sepermit.so
auth substack password-auth
auth include postlogin
# Used with polkit to reauthorize users in remote sessions
-auth optional pam_reauthorize.so prepare
account required pam_nologin.so
account include password-auth
password include password-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session optional pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open env_params
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include password-auth
session include postlogin
# Used with polkit to reauthorize users in remote sessions

Entradas de interés

Contenidos
  1. 1. La explicación
  2. 2. La solución