Gestión Centralizada de Usuarios con SSSD
SSSD (System Security Services Daemon) permite autenticar usuarios de Linux contra directorios centralizados como LDAP o Active Directory, con caché local para operación sin conexión. Es la solución estándar en entornos empresariales para unir servidores Linux a dominios corporativos con soporte completo para PAM, NSS, Kerberos y reglas sudo. Esta guía cubre la instalación de SSSD, integración con LDAP y Active Directory, y configuración de control de acceso.
Requisitos Previos
- Ubuntu 22.04/Debian 12 o CentOS 9/Rocky Linux 9
- Acceso a un servidor LDAP o dominio Active Directory
- Resolución DNS funcionando correctamente hacia el directorio
- Permisos de root en el servidor Linux
- Para Active Directory: cuenta de servicio con permisos de lectura
Instalación de SSSD
# Ubuntu/Debian
apt-get update
apt-get install -y sssd sssd-tools sssd-ldap sssd-ad \
libpam-sss libnss-sss adcli realmd packagekit
# CentOS/Rocky Linux
dnf install -y sssd sssd-tools sssd-ldap sssd-ad \
adcli realmd oddjob oddjob-mkhomedir
# Verificar la versión instalada
sssd --version
Integración con LDAP
Crea el archivo de configuración principal de SSSD:
# Crear configuración para LDAP genérico
cat > /etc/sssd/sssd.conf << 'EOF'
[sssd]
services = nss, pam, sudo
config_file_version = 2
domains = ejemplo.com
[domain/ejemplo.com]
# Tipo de proveedor de identidad
id_provider = ldap
auth_provider = ldap
sudo_provider = ldap
# Configuración del servidor LDAP
ldap_uri = ldaps://ldap.ejemplo.com:636
ldap_search_base = dc=ejemplo,dc=com
# Cuenta de servicio para búsquedas (bind DN)
ldap_default_bind_dn = cn=sssd-reader,ou=service-accounts,dc=ejemplo,dc=com
ldap_default_authtok_type = password
ldap_default_authtok = password_de_cuenta_servicio
# Seguridad TLS
ldap_id_use_start_tls = false
ldap_tls_cacert = /etc/ssl/certs/ca-certificados.pem
ldap_tls_reqcert = demand
# Mapeo de atributos LDAP a campos de usuario
ldap_user_search_base = ou=users,dc=ejemplo,dc=com
ldap_user_object_class = posixAccount
ldap_user_name = uid
ldap_user_uid_number = uidNumber
ldap_user_gid_number = gidNumber
ldap_user_home_directory = homeDirectory
ldap_user_shell = loginShell
# Mapeo de grupos
ldap_group_search_base = ou=groups,dc=ejemplo,dc=com
ldap_group_object_class = posixGroup
ldap_group_name = cn
# Opciones de rendimiento y caché
ldap_enumeration_refresh_timeout = 300
entry_cache_timeout = 1800
cache_credentials = true
# Creación automática del directorio home
override_homedir = /home/%u
default_shell = /bin/bash
EOF
# Establecer permisos correctos (obligatorio para SSSD)
chmod 600 /etc/sssd/sssd.conf
chown root:root /etc/sssd/sssd.conf
Integración con Active Directory
La forma más sencilla de unir un servidor Linux a un dominio AD es usando realmd:
# Verificar que el dominio AD es accesible
realm discover AD.EMPRESA.COM
# Unir el equipo al dominio (requiere cuenta con permisos de unión)
realm join --user=Administrador AD.EMPRESA.COM
# Verificar que la unión fue exitosa
realm list
# Confirmar que podemos obtener información de un usuario AD
id [email protected]
Si prefieres configuración manual en /etc/sssd/sssd.conf:
cat > /etc/sssd/sssd.conf << 'EOF'
[sssd]
services = nss, pam, sudo
config_file_version = 2
domains = AD.EMPRESA.COM
[domain/AD.EMPRESA.COM]
id_provider = ad
auth_provider = ad
access_provider = ad
# Nombre del dominio AD
ad_domain = AD.EMPRESA.COM
# Nombre del equipo (debe coincidir con el registrado en AD)
ad_hostname = servidor01.AD.EMPRESA.COM
# Usar el FQDN completo o solo el nombre corto para login
use_fully_qualified_names = false
fallback_homedir = /home/%u
default_shell = /bin/bash
# Opciones de rendimiento
cache_credentials = true
krb5_store_password_if_offline = true
# Limitar acceso a grupos específicos de AD (opcional)
# access_provider = simple
# simple_allow_groups = [email protected], [email protected]
EOF
chmod 600 /etc/sssd/sssd.conf
Configuración de PAM y NSS
Configura PAM para usar SSSD como fuente de autenticación:
# Ubuntu/Debian: usar pam-auth-update para configuración automática
pam-auth-update --enable sssd
pam-auth-update --enable mkhomedir
# CentOS/Rocky: authselect configura PAM y NSS automáticamente
authselect select sssd with-mkhomedir --force
# Verificar que NSS está configurado correctamente
grep "^passwd\|^group\|^shadow" /etc/nsswitch.conf
# Debe mostrar: passwd: files sss
# group: files sss
# shadow: files sss
Habilita la creación automática de directorios home al primer login:
# Ubuntu/Debian
echo "session required pam_mkhomedir.so skel=/etc/skel umask=0077" \
>> /etc/pam.d/common-session
# CentOS/Rocky (si no se usó authselect)
echo "session optional pam_oddjob_mkhomedir.so" >> /etc/pam.d/system-auth
systemctl enable --now oddjobd
Inicia y habilita SSSD:
systemctl enable --now sssd
# Verificar que el servicio está activo
systemctl status sssd
# Probar resolución de usuarios LDAP/AD
getent passwd nombre_usuario
getent group nombre_grupo
Caché Offline y Control de Acceso
SSSD almacena credenciales en caché para permitir login cuando el directorio no está disponible:
# Configurar tiempo de caché en sssd.conf (dentro del bloque [domain/...])
# entry_cache_timeout = 1800 # 30 minutos para entradas de usuario/grupo
# cache_credentials = true # Almacenar credenciales para acceso offline
# offline_credentials_expiration = 3 # Días que las credenciales offline son válidas
# Ver el contenido de la caché de SSSD
sss_cache -E # Invalidar toda la caché (fuerza refresco)
sss_cache -u nombre_usuario # Invalidar caché de un usuario específico
sss_cache -g nombre_grupo # Invalidar caché de un grupo específico
# Limpiar completamente la base de datos de caché
systemctl stop sssd
rm -f /var/lib/sss/db/*.ldb
systemctl start sssd
Restricción de acceso por grupos:
# En sssd.conf, añadir dentro del bloque [domain/...]
# access_provider = simple
# simple_allow_groups = admins-linux, devops-team
# simple_deny_groups = blocked-users
# O usar access_provider = ldap con filtros LDAP
# access_provider = ldap
# ldap_access_filter = (memberOf=cn=linux-users,ou=groups,dc=ejemplo,dc=com)
Reglas Sudo Centralizadas
SSSD puede obtener las reglas sudo desde LDAP:
# Verificar que el proveedor sudo está configurado en sssd.conf
# sudo_provider = ldap
# ldap_sudo_search_base = ou=sudoers,dc=ejemplo,dc=com
# Crear entrada LDAP para regla sudo (ejemplo en LDIF)
cat > /tmp/sudo-rule.ldif << 'EOF'
dn: cn=admins-sudo,ou=sudoers,dc=ejemplo,dc=com
objectClass: sudoRole
cn: admins-sudo
sudoUser: %admins-linux
sudoHost: ALL
sudoCommand: ALL
sudoOption: !authenticate
EOF
# Importar la regla sudo en LDAP
ldapadd -x -D "cn=admin,dc=ejemplo,dc=com" -W -f /tmp/sudo-rule.ldif
# Verificar que SSSD ve las reglas sudo
sudo -l -U nombre_usuario
# Refrescar caché de reglas sudo
sss_cache -G
Solución de Problemas
# Aumentar nivel de debug en sssd.conf para diagnóstico
# Añadir dentro del bloque [domain/...]:
# debug_level = 7
# Ver logs de SSSD (uno por dominio/servicio)
tail -f /var/log/sssd/sssd_ejemplo.com.log
tail -f /var/log/sssd/sssd_nss.log
tail -f /var/log/sssd/sssd_pam.log
# Verificar conectividad con el servidor LDAP
ldapsearch -x -H ldaps://ldap.ejemplo.com:636 \
-D "cn=sssd-reader,ou=service-accounts,dc=ejemplo,dc=com" \
-W -b "dc=ejemplo,dc=com" "(uid=nombre_usuario)"
# Comprobar el estado de los proveedores
sssctl domain-status ejemplo.com
# Ver info de un usuario a través de SSSD
sssctl user-show nombre_usuario
# Forzar actualización de un usuario específico
sssctl user-checks nombre_usuario
# Comprobar el estado de Kerberos (para AD)
klist -k /etc/krb5.keytab
kinit -k servidor01\[email protected]
Problemas comunes:
- "No such user": Verifica que
nsswitch.confincluyesssen la líneapasswd - Login rechazado offline: Comprueba que
cache_credentials = trueestá configurado - Timeout al resolver usuarios: Aumenta
ldap_network_timeouten la configuración
Conclusión
SSSD es la solución más completa para integrar servidores Linux en entornos de directorio corporativo, ofreciendo autenticación robusta contra LDAP y Active Directory con resiliencia ante fallos de conectividad gracias a su sistema de caché. La combinación de PAM, NSS y soporte sudo centralizado permite una gestión de identidades consistente en toda la infraestructura Linux sin depender de scripts o soluciones ad-hoc.


