Problema
En entornos mixtos Windows + Linux, los administradores suelen querer que los usuarios accedan a servidores Ubuntu usando sus credenciales de Active Directory (AD) y, además, que la autenticación requiera un factor adicional. La combinación típica es:
- LDAP + Kerberos para validar el usuario contra AD.
- Google Authenticator (TOTP) como segundo factor.
El síntoma más frecuente es que el ticket Kerberos se obtiene, pero los comandos id, getent passwd o sudo siguen fallando. Los logs de SSSD muestran “offline” o errores de TLS, mientras que la conectividad de red y el DNS funcionan. El problema suele radicar en la configuración de SSSD, en la cadena de certificados o en la integración de PAM con el módulo de Google Authenticator.
Causa
1. Configuración incompleta de SSSD
- ldap_id_mapping desactivado o mal definido impide que SSSD traduzca los SID de AD a UID/GID.
- krb5_realm o realms incorrectos hacen que el ticket se obtenga pero no se valide contra el KDC.
- ldap_tls_reqcert en
demandsin que el certificado de la CA interna esté importado genera “offline”.
2. Certificado de la CA no confiado por el cliente
Incluso si el certificado está en /etc/ssl/certs, OpenLDAP lo ignora si la ruta no está incluida en ldap.conf o si el archivo está en formato PEM incompleto.
3. Orden de los módulos PAM
El módulo pam_google_authenticator.so debe ejecutarse después de la autenticación basada en Kerberos, pero antes de la autorización. Un orden invertido hace que el segundo factor nunca se solicite o que la sesión sea rechazada antes de validar el ticket.
4. Falta de mapeo de grupos de AD a sudoers
Sin una regla que convierta los grupos de AD a sudo en el archivo /etc/sudoers.d/sssd, los usuarios autenticados no pueden escalar privilegios, lo que se interpreta como “login no funciona”.
Solución
Paso 1 – Preparar la CA y los paquetes
apt-get update
apt-get install -y sssd libpam-google-authenticator libnss-sss libpam-sss
cp /path/to/internal-ca.pem /usr/local/share/ca-certificates/internal-ca.crt
update-ca-certificates
Asegúrate de que el archivo PEM contenga la cadena completa (root + intermediate).
Paso 2 – Configurar /etc/sssd/sssd.conf
[sssd]
domains = AD
config_file_version = 2
services = nss, pam
[domain/AD]
id_provider = ad
auth_provider = ad
chpass_provider = ad
access_provider = ad
# LDAP/TLS
ldap_id_mapping = true
ldap_schema = rfc2307bis
ldap_user_search_base = OU=Users,DC=example,DC=com
ldap_group_search_base = OU=Groups,DC=example,DC=com
ldap_tls_cacertdir = /etc/ssl/certs
ldap_tls_reqcert = demand
# Kerberos
krb5_realm = EXAMPLE.COM
krb5_server = ad.example.com
krb5_kpasswd = ad.example.com
cache_credentials = true
enumerate = false
- ldap_id_mapping = true permite que SSSD genere UID/GID a partir del SID.
- enumerate = false evita consultas costosas que suelen saturar el controlador AD.
- Reinicia y habilita el servicio:
systemctl restart sssd
systemctl enable sssd
Paso 3 – Integrar Google Authenticator en PAM
Edita /etc/pam.d/sshd y coloca el módulo en la posición correcta:
#%PAM-1.0
auth required pam_sepermit.so
auth sufficient pam_ldap.so use_first_pass
auth required pam_google_authenticator.so nullok
auth required pam_unix.so try_first_pass
account required pam_nologin.so
account sufficient pam_ldap.so
account required pam_unix.so
password sufficient pam_ldap.so
session required pam_limits.so
session required pam_unix.so
nullokpermite que usuarios sin TOTP aún puedan iniciar sesión (útil para pruebas). En producción, elimínalo.- Cada usuario debe ejecutar
google-authenticatoruna vez para crear~/.google_authenticator.
Paso 4 – Mapear grupos AD a sudo
Crea /etc/sudoers.d/sssd:
%domain\\admins ALL=(ALL) ALL
%domain\\linux-admins ALL=(ALL) NOPASSWD: ALL
Reemplaza domain por el nombre NetBIOS del dominio. Con sss como backend, SSSD expone los grupos de AD como domain\group.
Paso 5 – Ajustar SSHD
En /etc/ssh/sshd_config habilita PAM y GSSAPI:
UsePAM yes
GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
Reinicia SSH:
systemctl restart sshd
Cuándo aplicar esta solución
- Síntomas: Kerberos ticket se obtiene, pero
idysudodevuelven “no such user” o “permission denied”. Los logs de SSSD indican “offline” o “TLS verification failed”. - Entorno: Ubuntu Server (cualquier versión LTS) que necesita autenticación centralizada contra AD y MFA basada en TOTP.
- No aplica: Cuando se usa LDAP simple sin Kerberos, o cuando la política de MFA está gestionada por Azure AD/Entra ID con flujo web. En esos casos, la integración con SSSD no es necesaria.
Código
# Instalar paquetes
apt-get install -y sssd libpam-google-authenticator libnss-sss libpam-sss
# Copiar CA y actualizar trust store
cp /path/to/internal-ca.pem /usr/local/share/ca-certificates/internal-ca.crt
update-ca-certificates
# Configurar sssd.conf (ejemplo completo)
cat > /etc/sssd/sssd.conf <<'EOF'
[sssd]
domains = AD
config_file_version = 2
services = nss, pam
[domain/AD]
id_provider = ad
auth_provider = ad
chpass_provider = ad
access_provider = ad
ldap_id_mapping = true
ldap_schema = rfc2307bis
ldap_user_search_base = OU=Users,DC=example,DC=com
ldap_group_search_base = OU=Groups,DC=example,DC=com
ldap_tls_cacertdir = /etc/ssl/certs
ldap_tls_reqcert = demand
krb5_realm = EXAMPLE.COM
krb5_server = ad.example.com
krb5_kpasswd = ad.example.com
cache_credentials = true
enumerate = false
EOF
chmod 600 /etc/sssd/sssd.conf
systemctl restart sssd
systemctl enable sssd
# PAM para sshd
sed -i '/@include common-auth/a auth required pam_google_authenticator.so nullok' /etc/pam.d/sshd
# Sudoers para grupos AD
cat > /etc/sudoers.d/sssd <<'EOF'
%EXAMPLE\\admins ALL=(ALL) ALL
%EXAMPLE\\linux-admins ALL=(ALL) NOPASSWD: ALL
EOF
chmod 440 /etc/sudoers.d/sssd
# SSHD ajustes
sed -i 's/^#\?UsePAM .*/UsePAM yes/' /etc/ssh/sshd_config
sed -i 's/^#\?GSSAPIAuthentication .*/GSSAPIAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd
Verificación
-
Ticket Kerberos
kinit [email protected] klistEl ticket debe mostrarse sin errores.
-
Resolución de usuarios
getent passwd usuario id usuarioLa salida debe incluir UID/GID generados por SSSD.
-
SSH con MFA
ssh usuario@ubuntu-hostDespués de la contraseña (Kerberos), se pedirá el código TOTP. Ingresar el código generado por
google-authenticator. -
Sudo
sudo -l -U usuarioDebe listar los comandos permitidos según los grupos AD.
-
Logs
Revisar/var/log/sssd/sssd_AD.logy/var/log/auth.logpara confirmar que no aparecen errores de TLS o de PAM.
Notas adicionales
- Rotación de certificados: cuando la CA interna renueve su certificado, vuelve a copiarlo y ejecuta
update-ca-certificates; no es necesario reiniciar SSSD, pero unsystemctl reload sssdayuda. - Bloqueo de usuarios: SSSD respeta la política de bloqueo de AD. Si un usuario está deshabilitado,
sshfallará antes de llegar a Google Authenticator. - Modo “nullok”: útil para migraciones graduales. En producción, quítalo para forzar MFA a todos los usuarios.
- Depuración: aumenta la verbosidad de SSSD con
debug_level = 9en[sssd]y revisajournalctl -u sssd. - Escalabilidad: desactivar
enumeratereduce la carga en el controlador AD y evita que SSSD haga listados completos de usuarios y grupos en cada inicio.
Con estos pasos, los servidores Ubuntu pueden confiar en AD para la primera capa de autenticación y en Google Authenticator para el factor adicional, manteniendo una experiencia de login coherente y segura en entornos híbridos.