LDAP
Esta sección describe el mecanismo de autenticación LDAP en Sync-in.
La configuración reside en environment.yaml, consulte la sección LDAP.
Flujo de autenticación
El flujo LDAP es:
- El usuario introduce su identificador (login o correo electrónico) y contraseña.
- Las cuentas de invitado y los ámbitos de aplicación (contraseñas de aplicación) siempre utilizan autenticación local.
- Sync-in prepara el identificador LDAP (UPN o
DOMAIN\userpara AD) e intenta realizar un bind. - Sync-in lee la entrada LDAP autenticada (DN exacto para el bind directo de LDAP genérico, búsqueda en el subárbol para el bind de servicio y AD) y sus atributos obligatorios.
- Si la autenticación es válida, Sync-in sincroniza (o crea) la cuenta local.
- El rol de administrador se puede asignar a través de un grupo LDAP.
- Si LDAP no está disponible, se puede permitir una autenticación local alternativa para los administradores y, opcionalmente, para los usuarios estándar. (consulte el acceso local de emergencia).
Configuración
Ejemplo mínimo:
auth:
provider: ldap
ldap:
servers: ['ldap://localhost:389']
baseDN: 'ou=people,dc=ldap,dc=sync-in,dc=com'
attributes:
login: uid
email: mail
Atributos y normalización
Se requieren los siguientes atributos en la entrada LDAP:
attributes.login: utilizado como identificador local.attributes.email: utilizado para el correo electrónico local.
attributes.storageQuota es opcional y el valor predeterminado es storageQuota. Cuando está presente, se lee como una cuota en bytes y se sincroniza con la cuenta local. Los valores no válidos dejan la cuota local sin cambios. Un valor ausente o un valor de 0 establece almacenamiento ilimitado.
El identificador local se normaliza: si se proporciona como DOMAIN\user, solo user se almacena localmente.
El campo memberOf está normalizado en una lista de valores y CN, lo que permite realizar comprobaciones grupales.
Si options.adminGroup está configurado y memberOf es insuficiente, Sync-in intenta realizar una búsqueda específica de groupOfNames para ese grupo.
Cuenta de servicio
De forma predeterminada, Sync-in intenta un bind directo utilizando las credenciales del usuario.
Se puede configurar una cuenta de servicio para realizar búsquedas LDAP:
auth:
ldap:
serviceBindDN: 'cn=syncin,ou=services,dc=ldap,dc=sync-in,dc=com'
serviceBindPassword: 'LDAPServiceBindPasswordToChange'
Con un bind de servicio:
- Bind inicial con la cuenta de servicio.
- Búsqueda de usuarios en
baseDNcon el filtro de búsqueda específico del directorio (+ elfilterconfigurado). - Nuevo bind con el DN encontrado y la contraseña proporcionada.
Sin un bind de servicio:
- LDAP genérico: Sync-in construye
<attributes.login>=<login>,<baseDN>, escapa el identificador como un RDN LDAP, realiza el bind con ese DN y luego lee esa entrada exacta con alcance base. - Active Directory: Sync-in realiza el bind con el identificador de AD y luego busca la entrada en
baseDN.
Para LDAP genérico, el filter opcional configurado también se aplica a la lectura exacta. Una lectura que se realiza correctamente sin devolver una entrada finaliza la autenticación. Si el directorio rechaza esa lectura con un error de compatibilidad o acceso conocido, Sync-in realiza una búsqueda controlada en el subárbol utilizando solo el attributes.login (+ filter) configurado. La búsqueda debe devolver exactamente un resultado completo y no truncado con un DN, y Sync-in realiza un nuevo bind con ese DN y la contraseña enviada antes de usar sus atributos. Esta ruta de compatibilidad no se ejecuta ante un resultado vacío o un error técnico no relacionado.
Utilice una cuenta de servicio cuando el DN del usuario no se pueda construir con esta fórmula o cuando los usuarios no puedan buscar los atributos o grupos requeridos por Sync-in.
Detalles específicos de Active Directory
Si attributes.login es sAMAccountName o userPrincipalName, Sync-in adapta el identificador:
userPrincipalName: se puede agregar un sufijo medianteupnSuffix(por ejemplo,user@sync-in.com).sAMAccountName: se puede agregar un prefijo mediantenetbiosName(por ejemplo,SYNC_IN\user).
En este modo, el bind del usuario se realiza directamente con el identificador proporcionado (formato UPN o DOMAIN\user).
Los filtros de búsqueda de subárbol se adaptan automáticamente:
- AD:
(sAMAccountName=...) OR (userPrincipalName=...) OR (mail=...) - LDAP genérico con un bind de servicio:
(uid=...) OR (cn=...) OR (mail=...)
La ruta normal de bind directo de LDAP genérico no utiliza este filtro OR: lee el DN autenticado. Su búsqueda de compatibilidad controlada coincide únicamente con el attributes.login configurado y exige un resultado único y no truncado, seguido de un bind correcto con el DN de dicho resultado.
Roles de administrador
Si se establece options.adminGroup, Sync-in comprueba la pertenencia al grupo:
- a través de
memberOfsi está presente, - de lo contrario, mediante una búsqueda
groupOfNames(útil cuandomemberOfno está expuesto).
Si la búsqueda de grupos no es posible con el usuario, utilice una cuenta de servicio.
Si no se configura options.adminGroup, las cuentas de administrador existentes mantienen su rol y no pueden ser degradadas a través de LDAP.
Acceso de emergencia (autenticación local alternativa)
Si LDAP no está disponible (error de conectividad o servicio caído), Sync-in puede permitir la autenticación mediante contraseña local:
- Siempre se permite para las cuentas de administrador como acceso de emergencia, incluso cuando falla la autenticación LDAP.
- Para otros usuarios, se permite solo cuando el error está relacionado con la indisponibilidad de LDAP y
options.enablePasswordAuthFallbackestá habilitado.
Este mecanismo garantiza la continuidad del acceso administrativo cuando el servicio de directorio no está disponible.
Para poder utilizar esta alternativa, se recomienda configurar y mantener disponible una contraseña local de Sync-in para las cuentas de administrador.
Para los usuarios estándar, esta alternativa está deshabilitada de forma predeterminada.
Sincronización de cuentas
Al iniciar sesión correctamente:
- Si el usuario no existe y
autoCreateUserestá habilitado, Sync-in crea una cuenta local. - El identificador local se deriva de
attributes.login. - El correo electrónico se deriva de
attributes.email(obligatorio). - El nombre/apellido se derivan de
givenName+sn, odisplayName, ocn. - Los permisos iniciales provienen de
autoCreatePermissions. - La cuota de almacenamiento se sincroniza desde
attributes.storageQuotacuando la entrada LDAP proporciona un valor válido en bytes. Un valor ausente o un valor de0establece almacenamiento ilimitado.
Disponibilidad y errores
Las credenciales LDAP no válidas rechazan la autenticación.
Los errores de conectividad LDAP se tratan como falta de disponibilidad del servicio y pueden activar la autenticación local alternativa (consulte Acceso de emergencia).
Las cuentas de invitado y los ámbitos de aplicación no utilizan LDAP y siempre se autentican localmente.
Seguridad
Se recomienda encarecidamente utilizar LDAPS (ldaps://) o StartTLS para proteger las credenciales enviadas durante el bind LDAP.