38 KiB
Tutorial: Autenticación con Keycloak, OpenLDAP y Angular
Este tutorial comprensivo explica cómo configurar un sistema de autenticación completo utilizando Keycloak como proveedor de identidad, OpenLDAP como directorio de usuarios, y cómo integrar este sistema con una aplicación Angular moderna. La guía cubre desde la configuración del entorno básico hasta las técnicas más avanzadas de integración con Angular 19.
NOTA IMPORTANTE: Este tutorial utiliza el dominio "correos.com" únicamente con fines demostrativos y educativos. No representa ninguna organización real ni establece ninguna afiliación oficial. Al implementar este sistema en un entorno de producción, deberás sustituirlo por tu propio dominio.
Índice
- Fundamentos de Autenticación Empresarial
- Preparación del entorno
- Instalación y configuración de OpenLDAP
- Crear estructura LDAP para usuarios y grupos
- Instalación y configuración de Keycloak
- Configuración de Keycloak en la interfaz web
- Integración con Angular: Enfoque básico
- Integración con Angular 19: Enfoque moderno
- Servicios de autenticación avanzados
- Guardias de ruta e interceptores HTTP
- Componentes de UI para login/logout
- Arquitectura del sistema
- Consideraciones de seguridad y buenas prácticas
- Resolución de problemas comunes
- Verificación y prueba del sistema
- Recursos adicionales
- Resumen
Fundamentos de Autenticación Empresarial: LDAP, Keycloak y Angular
Antes de comenzar con los pasos de implementación, es importante entender los conceptos fundamentales detrás de esta arquitectura de autenticación y los problemas que resuelve.
¿Qué es LDAP?
LDAP (Lightweight Directory Access Protocol) es un protocolo estándar diseñado para acceder y mantener servicios de información de directorio distribuidos. Esencialmente, es una base de datos especializada optimizada para operaciones de lectura, búsqueda y autenticación, pero no para transacciones complejas como las bases de datos relacionales.
Características principales de LDAP:
- Estructura jerárquica: Organiza la información en forma de árbol (similar a un sistema de archivos)
- Optimizado para lectura: Proporciona acceso rápido a datos que cambian con poca frecuencia
- Centralización de la información: Almacena datos de usuarios, grupos, permisos y recursos en un solo lugar
- Estandarizado: Compatible con múltiples plataformas y aplicaciones
¿Por qué usar LDAP?
- Gestión centralizada de identidades: Permite mantener toda la información de usuarios en un solo lugar
- Reducción de complejidad administrativa: Evita tener que gestionar usuarios en múltiples sistemas
- Autenticación unificada: Los usuarios pueden acceder a múltiples servicios con las mismas credenciales
- Escalabilidad: Puede manejar desde pequeñas organizaciones hasta grandes empresas con millones de usuarios
En el contexto empresarial, LDAP se utiliza principalmente como directorio centralizado de usuarios, lo que facilita la gestión de identidades y permisos a nivel organizacional.
¿Qué es Keycloak?
Keycloak es una solución de código abierto para gestión de identidad y acceso (IAM) desarrollada por Red Hat. Actúa como un servidor de autenticación y autorización para aplicaciones y servicios.
Características principales de Keycloak:
- SSO (Single Sign-On): Permite a los usuarios autenticarse una vez y acceder a múltiples aplicaciones
- Federación de identidades: Puede integrar múltiples fuentes de usuarios (como LDAP, Active Directory, bases de datos)
- Autenticación multifactor: Soporta verificación en dos pasos y otros métodos de autenticación avanzados
- Protocolos estándar: Implementa OAuth 2.0, OpenID Connect, SAML 2.0
- Administración centralizada: Interfaz web para gestionar usuarios, roles, permisos y aplicaciones
- Personalizable: Temas, flujos de autenticación y políticas adaptables
¿Por qué usar Keycloak?
- Implementación rápida de seguridad: Proporciona funcionalidades robustas sin necesidad de desarrollarlas
- Experiencia de usuario mejorada: Los usuarios solo necesitan recordar una contraseña
- Cumplimiento normativo: Ayuda a implementar políticas de seguridad requeridas por regulaciones
- Flexibilidad: Puede funcionar como intermediario entre aplicaciones modernas y sistemas de identidad heredados
Objetivo de la integración LDAP + Keycloak + Angular
El objetivo principal de esta arquitectura es implementar un sistema de autenticación empresarial completo y seguro que:
- Centralice la gestión de usuarios en un directorio LDAP
- Modernice el acceso mediante Keycloak, que actúa como proveedor de identidad (IdP)
- Integre aplicaciones modernas (Angular) con esta infraestructura de autenticación
Esta combinación crea una solución robusta donde LDAP almacena los datos de usuarios, Keycloak gestiona la autenticación/autorización y la aplicación Angular consume estos servicios de forma segura.
Problemas que soluciona esta arquitectura
1. Fragmentación de identidades
Problema: En organizaciones grandes, es común tener usuarios duplicados en diferentes sistemas. Solución: LDAP centraliza la información de usuarios, mientras Keycloak expone estos datos a aplicaciones modernas.
2. Experiencia de usuario deficiente
Problema: Obligar a los usuarios a iniciar sesión en cada aplicación por separado. Solución: Single Sign-On a través de Keycloak permite autenticarse una sola vez para acceder a múltiples aplicaciones.
3. Seguridad inconsistente
Problema: Cada aplicación implementa su propia seguridad, con diferentes estándares y posibles vulnerabilidades. Solución: Keycloak implementa prácticas de seguridad modernas de forma centralizada.
4. Dificultad para implementar autenticación robusta
Problema: Implementar OAuth2, OpenID Connect o SAML desde cero es complejo y propenso a errores. Solución: Keycloak proporciona estas implementaciones listas para usar.
5. Gestión compleja de accesos
Problema: Administrar quién puede acceder a qué recursos en múltiples aplicaciones. Solución: Roles y grupos centralizados que se aplican consistentemente en todas las aplicaciones.
Arquitectura general de la solución
+-------------------+ +-------------------+ +-------------------+
| | | | | |
| OpenLDAP |<---->| Keycloak |<---->| Angular App |
| (Directorio) | | (IdP) | | (Cliente) |
| | | | | |
+-------------------+ +-------------------+ +-------------------+
^
|
v
+-------------------+
| |
| APIs/Backends |
| (Recursos) |
| |
+-------------------+
- OpenLDAP actúa como almacén principal de usuarios y grupos
- Keycloak se conecta a LDAP y expone sus datos a través de protocolos modernos
- Angular se comunica con Keycloak para autenticación y obtención de tokens
- Los backends/APIs verifican los tokens emitidos por Keycloak
A continuación, veremos paso a paso cómo implementar esta arquitectura.
1. Preparación del entorno
Requisitos del sistema
Para seguir este tutorial, necesitarás:
- Un sistema Ubuntu Server o una distribución similar de Linux
- Acceso de root o privilegios sudo
- Node.js (versión 18.x o superior)
- Angular CLI (versión 19.x o compatible)
- Java JDK (OpenJDK 17 o superior)
Actualización del sistema e instalación de Java
Primero, actualiza el sistema e instala Java:
sudo apt update
sudo apt upgrade -y
sudo apt install openjdk-17-jdk -y
Verifica la instalación de Java:
java -version
Instalación de Node.js y Angular CLI
Para el desarrollo de aplicaciones Angular, instala Node.js y Angular CLI:
# Instalar Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Verificar la instalación
node -v
npm -v
# Instalar Angular CLI
npm install -g @angular/cli
# Verificar la instalación
ng version
2. Instalación y configuración de OpenLDAP
Instalar OpenLDAP y utilidades
sudo apt install slapd ldap-utils -y
Durante la instalación, se te pedirá configurar una contraseña de administrador para LDAP.
Reconfigurar LDAP con el dominio correcto
sudo dpkg-reconfigure slapd
En la configuración:
- "¿Omitir configuración del servidor LDAP?" → No
- "Nombre de dominio DNS:" → correos.com
- "Nombre de la organización:" → Correos Org
- "Contraseña de administrador:" → [tu contraseña segura]
- "Confirmar contraseña:" → [repetir la contraseña]
- "Motor de base de datos:" → MDB
- "¿Quiere que se elimine la base de datos cuando se purgue slapd?" → No
- "¿Mover la base de datos antigua?" → Sí
Verificar que LDAP se esté ejecutando correctamente
sudo systemctl status slapd
Comprobar la conexión LDAP básica
ldapsearch -x -H ldap://localhost -b dc=correos,dc=com -D "cn=admin,dc=correos,dc=com" -W
Instalar phpLDAPadmin para la gestión gráfica (opcional)
sudo apt install phpldapadmin -y
Configurar phpLDAPadmin
Edita el archivo de configuración:
sudo nano /etc/phpldapadmin/config.php
Busca y modifica las siguientes líneas:
$servers->setValue('server','base',array('dc=correos,dc=com'));
$servers->setValue('login','bind_id','cn=admin,dc=correos,dc=com');
Y cambia descomenta y cambia esta línea:
$servers->setValue('login','anon_bind',true);
por:
$servers->setValue('login','anon_bind',false);
sudo systemctl restart apache2
3. Crear estructura LDAP para usuarios y grupos
Crear unidades organizativas
Crea un archivo para las unidades organizativas:
nano ~/ou.ldif
Con el siguiente contenido:
dn: ou=grupos,dc=correos,dc=com
objectClass: organizationalUnit
ou: grupos
dn: ou=usuarios,dc=correos,dc=com
objectClass: organizationalUnit
ou: usuarios
Aplica los cambios:
ldapadd -x -D cn=admin,dc=correos,dc=com -W -f ~/ou.ldif
Crear grupos LDAP
Crea un archivo para los grupos:
nano ~/grupos.ldif
Con el siguiente contenido:
dn: cn=administradores,ou=grupos,dc=correos,dc=com
objectClass: posixGroup
cn: administradores
gidNumber: 1000
dn: cn=desarrolladores,ou=grupos,dc=correos,dc=com
objectClass: posixGroup
cn: desarrolladores
gidNumber: 1001
dn: cn=usuarios,ou=grupos,dc=correos,dc=com
objectClass: posixGroup
cn: usuarios
gidNumber: 1002
Aplica los cambios:
ldapadd -x -D cn=admin,dc=correos,dc=com -W -f ~/grupos.ldif
Crear usuarios LDAP
Primero, genera contraseñas encriptadas para los usuarios:
Aquí usaremos la misma contraseña para todos los usuarios para temas prácticos
slappasswd -s "password123"
Anota el hash resultante para usarlo en el siguiente archivo.
Crea un archivo para los usuarios:
nano ~/usuarios.ldif
dn: uid=admin,ou=usuarios,dc=correos,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: admin
sn: Admin
givenName: Admin
cn: Admin User
displayName: Admin User
uidNumber: 1000
gidNumber: 1000
userPassword: {SSHA}b69lOkbaZgYsKpfvpBkJbq4rGINF4PwB
loginShell: /bin/bash
homeDirectory: /home/admin
mail: admin@correos.com
dn: uid=developer,ou=usuarios,dc=correos,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: developer
sn: Developer
givenName: Dev
cn: Dev User
displayName: Developer User
uidNumber: 1001
gidNumber: 1001
userPassword: {SSHA}b69lOkbaZgYsKpfvpBkJbq4rGINF4PwB
loginShell: /bin/bash
homeDirectory: /home/developer
mail: developer@correos.com
dn: uid=user,ou=usuarios,dc=correos,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: user
sn: User
givenName: Normal
cn: Normal User
displayName: Normal User
uidNumber: 1002
gidNumber: 1002
userPassword: {SSHA}b69lOkbaZgYsKpfvpBkJbq4rGINF4PwB
loginShell: /bin/bash
homeDirectory: /home/user
mail: user@correos.com
Aplica los cambios:
ldapadd -x -D cn=admin,dc=correos,dc=com -W -f ~/usuarios.ldif
Asociar usuarios a grupos
Crea un archivo para las membresías:
nano ~/miembros.ldif
Con el siguiente contenido:
dn: cn=administradores,ou=grupos,dc=correos,dc=com
changetype: modify
add: memberUid
memberUid: admin
dn: cn=desarrolladores,ou=grupos,dc=correos,dc=com
changetype: modify
add: memberUid
memberUid: developer
dn: cn=usuarios,ou=grupos,dc=correos,dc=com
changetype: modify
add: memberUid
memberUid: user
Aplica los cambios:
ldapmodify -x -D cn=admin,dc=correos,dc=com -W -f ~/miembros.ldif
Verificar la estructura LDAP
ldapsearch -x -H ldap://localhost -b dc=correos,dc=com -D "cn=admin,dc=correos,dc=com" -W
4. Instalación y configuración de Keycloak
Descargar e instalar Keycloak
# Crear directorio para Keycloak
mkdir -p ~/keycloak
cd ~/keycloak
# Descargar la última versión de Keycloak
wget https://github.com/keycloak/keycloak/releases/download/26.2.4/keycloak-26.2.4.tar.gz
# Extraer el archivo
tar -xvzf keycloak-26.2.4.tar.gz
# Mover a una ubicación más adecuada
sudo mv keycloak-26.2.4 /opt/keycloak
# Crear un usuario para Keycloak
sudo useradd -r -s /sbin/nologin keycloak
# Asignar permisos
sudo chown -R keycloak:keycloak /opt/keycloak
Configurar usuario administrador inicial para Keycloak
Crea un archivo de propiedades:
sudo nano /opt/keycloak/conf/keycloak.conf
Agrega estas líneas:
En mi caso esta máquina tiene la IP
192.168.1.27, ajustar según sea necesario en una red real para la administración remota.
# Configuración básica
hostname=192.168.1.27
http-port=8080
http-enabled=true
# Configuración de administrador inicial
http-enabled=true
Crear un usuario administrador
cd /opt/keycloak
sudo -u keycloak /opt/keycloak/bin/kc.sh bootstrap-admin user --username admin
En este comando preguntará para crear la contraseña del usuario "admin" que usaremos como administrador.
Iniciar Keycloak en modo desarrollo
Sin hacer cd, corremos el siguiente comando:
sudo -u keycloak bin/kc.sh start-dev
Iniciar Keycloak en modo productivo
Similar al anterior, sin embargo se le quita la flag -dev únicamente:
sudo -u keycloak bin/kc.sh start
Configurar Keycloak como servicio productivo
En otra terminal, crea un archivo de servicio systemd:
sudo nano /etc/systemd/system/keycloak.service
Con el siguiente contenido:
[Unit]
Description=Keycloak Application Server
After=network.target
[Service]
Type=idle
User=keycloak
Group=keycloak
ExecStart=/opt/keycloak/bin/kc.sh start
TimeoutStartSec=600
TimeoutStopSec=600
[Install]
WantedBy=multi-user.target
Habilita e inicia el servicio:
sudo systemctl daemon-reload
sudo systemctl enable keycloak
sudo systemctl start keycloak
Para ver el estado del servicio únicamente corre el comando:
sudo systemctl status keycloak
Nota: si quieres ver el log del servicio usa el comando
sudo journalctl -u keycloak -f
5. Configuración de Keycloak en la interfaz web
Ahora puedes acceder a la consola de administración de Keycloak en http://192.168.1.27:8080/admin/ e iniciar sesión con:
- Usuario:
admin - Contraseña: la que configuraste anteriormente
No necesariamente es ese login siempre, todo depende de qué usuario crearon anteriormente y su contraseña además de la IP del servidor.
Crear un nuevo Reino (Realm)
- Haz clic en el menú desplegable superior izquierdo que dice "Manage realm"
- Selecciona "Create Realm"
- Ingresa el nombre:
angular-app - Haz clic en "Create"
Configurar la Federación de Usuarios LDAP
-
En el menú lateral izquierdo, selecciona "User Federation"
-
Haz clic en "Add Ldap provider"
-
Completa los siguientes campos:
- Console Display Name:
LDAP - Vendor:
Other - Connection URL:
ldap://localhost:389 - Enable StartTLS:
OFF - Bind Type:
simple - Bind DN:
cn=admin,dc=correos,dc=com - Bind Credential: (la contraseña de admin LDAP)
- Edit Mode:
WRITABLE - Users DN:
ou=usuarios,dc=correos,dc=com - Username LDAP attribute:
uid - RDN LDAP attribute:
uid - UUID LDAP attribute:
entryUUID - User Object Classes:
inetOrgPerson, posixAccount - Custom User LDAP Filter: (dejar en blanco)
- Search Scope:
One Level
- Console Display Name:
-
Haz clic en "Test connection" y "Test authentication" para verificar
-
Guarda la configuración
Más abajo hay más configuraciones pero se quedan con su valor por defecto. Después de guardar regresará a la pestaña anterior donde tendremos que presionar en la configuración recién creada.
Configurar el Mapeo de Grupos LDAP
Configuración del Mapeo de Grupos LDAP en Keycloak
-
Completa los siguientes campos exactamente en este orden:
- Name:
group-mapper - Mapper type:
group-ldap-mapper - LDAP Groups DN:
ou=grupos,dc=correos,dc=com - Relative creation DN: (dejar en blanco)
- Group Name LDAP Attribute:
cn - Group Object Classes:
posixGroup - Preserve Group Inheritance:
Off(¡IMPORTANTE! Debe estar desactivado para funcionar con Membership Attribute Type: UID) - Ignore Missing Groups:
Off - Membership LDAP Attribute:
memberUid - Membership Attribute Type:
UID(¡IMPORTANTE! Debe ser UID, no DN) - Membership User LDAP Attribute:
uid - LDAP Filter: (dejar en blanco)
- Mode:
LDAP_ONLY - User Roles Retrieve Strategy:
LOAD_GROUPS_BY_MEMBER_ATTRIBUTE - Member-Of LDAP Attribute:
memberOf - Mapped Group Attributes: (dejar en blanco)
- Drop non-existing groups during sync:
ON - Groups Path:
/
- Name:
-
Haz clic en "Save"
Nota importante: Esta configuración está optimizada para tu estructura LDAP donde se utiliza
posixGroupcon atributosmemberUidsimples (no DNs). El punto crítico para evitar errores es asegurarte de que "Preserve Group Inheritance" esté desactivado (Off) cuando usas el tipo de membresía UID.
Al igual que con el proveedor LDAP, al guardar se regresará a la pantalla anterior, donde tendremos que hacer clic nuevamente en el mapper.
- En la pantalla del mapper, haz clic en "Sync LDAP Groups to Keycloak"
Crear un Cliente para Angular
-
En el menú lateral izquierdo, selecciona "Clients"
-
Haz clic en "Create client"
-
Completa:
- Client type:
OpenID Connect - Client ID:
angular-app - Name:
Angular Application - Haz clic en "Next"
- Client type:
-
En la siguiente pantalla (para aplicaciones SPA modernas):
- Client authentication:
OFF(para aplicaciones SPA) - Authorization:
OFF - Marca la casilla "Direct access grants"
- Haz clic en "Next"
- Client authentication:
Importante: La opción "Direct access grants" es esencial ya que permite realizar la autenticación directamente desde el cliente Angular mediante peticiones POST (enviando usuario y contraseña), sin necesidad de redirigir al usuario a través de la interfaz de inicio de sesión de Keycloak.
- En la siguiente pantalla:
- Root URL:
http://localhost:4200 - Home URL:
/ - Valid redirect URIs:
http://localhost:4200/* - Web origins:
http://localhost:4200(o usar+para permitir todos los orígenes durante desarrollo) - Haz clic en "Save"
Nota: Para aplicaciones que no son SPA, puedes habilitar "Client authentication" y obtener un client secret que deberás usar en la configuración. Nota: Puedes descargar un ejemplo de una máquina virtual de VirtualBox en el siguiente enlace con todo ya configurado, solo importar y usar.
Configurar cliente para incluir grupos
Añadir un Protocol Mapper en el cliente de Keycloak: a. Inicia sesión en la consola de administración de Keycloak b. Navega a "Clients" > selecciona tu cliente "angular-app" c. Ve a la pestaña "Client Scopes" > Selecciona el scope por defecto (normalmente es el nombre del cliente) d. Ve a la pestaña "Mappers" e. Haz clic en "Create" o "Add Mapper" y selecciona "Group Membership" f. Configura el mapper con los siguientes valores:
- Name: groups
- Token Claim Name: groups
- Add to ID token: ON
- Add to access token: ON
- Add to userinfo: ON
- Full group path: OFF (a menos que necesites la ruta completa) g. Guarda la configuración
Alternativamente, puedes crear un mapper de tipo "User Attribute" si prefieres almacenar los grupos como atributos de usuario.
¿Qué logramos con esto? Fácil: que en el access token aparezcan los grupos a los que pertenece el usuario, tal cual los configuramos en LDAP. Esto puede ayudar para crear políticas de acceso a páginas o rutas protegidas para algún grupo en específico más adelante.
11. Arquitectura del sistema
La arquitectura del sistema está compuesta por los siguientes componentes:
- OpenLDAP: Directorio de usuarios y grupos (puerto 389)
- phpLDAPadmin: Interfaz gráfica para administrar LDAP (puerto 80)
- Keycloak: Servidor de autenticación y autorización (puerto 8080)
- Aplicación Angular: Cliente que utiliza el SSO de Keycloak (puerto 4200)
La estructura del directorio LDAP para correos.com es:
- dc=correos,dc=com (raíz del directorio)
- ou=usuarios (unidad organizativa para usuarios)
- uid=admin (usuario administrador)
- uid=developer (usuario desarrollador)
- uid=user (usuario normal)
- ou=grupos (unidad organizativa para grupos)
- cn=administradores (grupo de administradores)
- cn=desarrolladores (grupo de desarrolladores)
- cn=usuarios (grupo de usuarios)
- ou=usuarios (unidad organizativa para usuarios)
Flujo de autenticación
El flujo de autenticación funciona de la siguiente manera:
- El usuario accede a la aplicación Angular
- Si el usuario no ha iniciado sesión, es redirigido a Keycloak
- Keycloak autentica al usuario contra LDAP
- Si la autenticación es exitosa, Keycloak redirige al usuario de vuelta a la aplicación con un token JWT
- La aplicación Angular verifica el token y permite el acceso
- Los interceptores HTTP añaden automáticamente el token a las peticiones API
- Las rutas protegidas verifican los roles del usuario antes de permitir el acceso
12. Consideraciones de seguridad
Al implementar este sistema de autenticación en un entorno de producción, es crucial tener en cuenta diversas consideraciones de seguridad:
TLS/HTTPS
- Comunicaciones cifradas: Todas las comunicaciones entre componentes deben estar protegidas con TLS/HTTPS
- Certificados válidos: Utiliza certificados de confianza, evitando certificados autofirmados en producción
- Configuración de cipher suites: Configura solo cipher suites seguros y actualizados
# Ejemplo: Configurar HTTPS en Keycloak
sudo nano /opt/keycloak/conf/keycloak.conf
# Añadir estas líneas:
https-port=8443
https-certificate-file=/path/to/certificate.pem
https-certificate-key-file=/path/to/key.pem
http-enabled=false
Endurecimiento de LDAP
- Acceso restringido: Limita el acceso al servidor LDAP solo a Keycloak y servicios de administración
- Contraseñas robustas: Implementa políticas de contraseñas fuertes para las cuentas administrativas
- Auditoría: Habilita el registro de eventos para todas las operaciones críticas
# Configurar políticas de contraseñas en OpenLDAP
nano ~/password-policy.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcPasswordPolicy
olcPasswordPolicy: 2
ldapadd -Y EXTERNAL -H ldapi:/// -f ~/password-policy.ldif
Seguridad de Keycloak
- Actualizaciones regulares: Mantén Keycloak actualizado con las últimas versiones de seguridad
- Límites de sesión: Configura tiempos de expiración adecuados para tokens y sesiones
- Autenticación de dos factores: Habilita MFA para cuentas privilegiadas
- Alertas de seguridad: Configura notificaciones para eventos de seguridad importantes
Para configurar MFA en Keycloak:
- Ve a Authentication > Flows
- Duplica el flujo de browser
- Añade un requerimiento de autenticación OTP
- Configura este flujo como el predeterminado para autenticación de navegador
Seguridad en aplicaciones Angular
- HttpOnly cookies: Para almacenamiento seguro de tokens de sesión
- CSP (Content Security Policy): Implementa políticas restrictivas para prevenir XSS
- CSRF protection: Implementa protección contra falsificación de solicitudes entre sitios
- Sanitización de entrada: Valida y limpia todas las entradas de usuario
// Ejemplo: Configurar interceptor HTTP para tokens en Angular
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private keycloak: KeycloakService) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// Añadir token a todas las peticiones
if (this.keycloak.isLoggedIn()) {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${this.keycloak.getToken()}`
}
});
}
return next.handle(request);
}
}
Auditoría y monitoreo
- Centralización de logs: Implementa un sistema centralizado de gestión de logs
- Alertas de seguridad: Configura alertas para patrones de autenticación sospechosos
- Monitoreo de disponibilidad: Implementa health checks para todos los componentes
- Revisiones periódicas: Establece un calendario de revisiones de seguridad
Backups y recuperación
- Backup regular de LDAP: Programa backups completos del directorio LDAP
- Backup de configuración: Mantén respaldos de la configuración de Keycloak
- Pruebas de recuperación: Verifica regularmente que los backups son utilizables
- Documentación: Mantén documentación actualizada de los procedimientos de recuperación
# Ejemplo: Backup de OpenLDAP
slapcat -b "dc=correos,dc=com" -l backup.ldif
# Ejemplo: Backup de Keycloak
/opt/keycloak/bin/kc.sh export --dir /path/to/backup --users realm_file
La implementación adecuada de estas medidas de seguridad es tan importante como la configuración técnica del sistema de autenticación. En entornos de producción, estos aspectos deben planificarse desde el inicio del proyecto.
13. Resolución de problemas comunes
Problema: "ldap_bind: Invalid credentials (49)"
Este error ocurre cuando intentas conectarte a LDAP con credenciales incorrectas. Para resolverlo:
- Verifica que estás usando el dominio correcto:
dc=correos,dc=com - Asegúrate de usar el DN correcto:
cn=admin,dc=correos,dc=com - Comprueba que la contraseña de administrador es correcta
Si olvidaste la contraseña, puedes restablecerla:
sudo dpkg-reconfigure slapd
O también:
sudo slappasswd
# Copia el hash generado
sudo nano /etc/ldap/slapd.d/cn=config/olcDatabase={1}mdb.ldif
# Busca olcRootPW y reemplaza el valor con el nuevo hash
sudo systemctl restart slapd
Problema: No puedes conectarte a LDAP en absoluto
# Verifica que el servicio esté ejecutándose
sudo systemctl status slapd
# Reinicia el servicio si es necesario
sudo systemctl restart slapd
# Verifica que el puerto esté abierto
sudo netstat -tulpn | grep 389
Problema: Keycloak no se inicia
# Verifica los logs
sudo journalctl -u keycloak
# Asegúrate de que Java esté instalado correctamente
java -version
# Verifica los permisos
sudo ls -la /opt/keycloak
Problema: Error 401 Unauthorized al autenticar con Keycloak
Este error suele ocurrir cuando hay problemas con la configuración del cliente en Keycloak:
- Verifica que el realm y el clientId sean correctos en la configuración de Angular
- Asegúrate de que el cliente en Keycloak tenga la configuración correcta:
- Web Origins: debe incluir
http://localhost:4200o+para desarrollo - Valid redirect URIs: debe incluir
http://localhost:4200/* - Client authentication debe estar OFF para aplicaciones SPA
- Access Type debe ser "public"
- Web Origins: debe incluir
Problema: Redireccionamiento circular
Si ves redirecciones constantes entre tu aplicación y Keycloak:
- Verifica la lógica en el componente app.component.ts y login.component.ts
- Asegúrate de que no haya múltiples redirecciones activándose a la vez
- Usa el parámetro
replaceUrl: trueen las navegaciones para evitar acumular entradas en el historial - Maneja correctamente las rutas especiales como '/' redirigiendo a una ruta válida como '/inicio'
Problema: "Can't resolve 'keycloak-angular'"
Si encuentras este error al compilar:
-
Asegúrate de haber instalado correctamente las dependencias:
npm install keycloak-angular keycloak-js -
Verifica que las versiones sean compatibles con tu versión de Angular
-
Limpia la caché de npm y reinstala:
npm cache clean --forcerm -rf node_modulesnpm install
Problema: El token no se adjunta a las peticiones HTTP
- Verifica que estés utilizando el interceptor correcto
- Asegúrate de que las condiciones de URL para el token sean correctas
- Revisa si estás usando
provideHttpClientconwithInterceptors([includeBearerTokenInterceptor]) - Comprueba los patrones en
createInterceptorConditionpara asegurarte de que coincidan con tus URLs
Problema: No puedes ver los miembros de un grupo en Keycloak
Este error ocurre cuando hay una configuración incorrecta en el mapeo de grupos LDAP:
- Causa principal: El tipo de atributo de membresía (Membership Attribute Type) está configurado como
DNcuando debería serUID. - Solución: En User Federation → LDAP → group-mapper → Edit, cambia "Membership Attribute Type" de
DNaUID. - Explicación: En la estructura LDAP creada, los valores de
memberUidcontienen sólo el uid simple (admin, developer, user) y no el DN completo. - Después de hacer el cambio, vuelve a ejecutar "Sync LDAP Groups to Keycloak".
14. Verificación y prueba del sistema
Verificar que Keycloak esté sincronizando correctamente con LDAP
- Inicia sesión en la consola de administración de Keycloak (http://localhost:8080/admin/)
- Navega a "Users" en el reino "angular-app"
- Deberías ver los usuarios de LDAP: admin, developer y user
- Navega a "Groups" y verifica que los grupos de LDAP estén presentes
- Haz clic en cada grupo y verifica que los miembros aparezcan correctamente
- Si no aparecen, revisa la sección "Resolución de problemas" sobre el tipo de atributo de membresía
Probar la aplicación Angular
- Asegúrate de que Keycloak esté ejecutándose
- Inicia la aplicación Angular con
ng serve - Navega a http://localhost:4200
- Haz clic en "Iniciar Sesión"
- Deberías ser redirigido a la pantalla de inicio de sesión de Keycloak
- Inicia sesión con uno de los usuarios LDAP:
- Usuario: admin, Contraseña: password123
- Usuario: developer, Contraseña: password123
- Usuario: user, Contraseña: password123
- Después de iniciar sesión, serás redirigido de vuelta a la aplicación
- La aplicación mostrará tu perfil y roles
15. Recursos adicionales
- Documentación oficial de Keycloak
- Documentación oficial de OpenLDAP
- Documentación oficial de keycloak-angular
- Guía de migración para Keycloak-Angular v19
- Ejemplos de implementación en GitHub
16. Resumen
En este tutorial comprensivo, hemos explorado la implementación de un sistema de autenticación empresarial completo basado en OpenLDAP, Keycloak y Angular. Esta arquitectura resuelve problemas fundamentales de seguridad y gestión de identidades en entornos empresariales modernos.
Beneficios principales de esta implementación:
-
Centralización de usuarios: A través de OpenLDAP, toda la información de usuarios se mantiene en un único lugar, facilitando la administración y evitando duplicidades.
-
Seguridad robusta: Keycloak proporciona implementaciones probadas de protocolos de seguridad modernos, reduciendo la superficie de ataque y centralizando políticas de seguridad.
-
Experiencia de usuario mejorada: Single Sign-On permite a los usuarios acceder a múltiples aplicaciones con una sola autenticación, reduciendo fricción y mejorando la productividad.
-
Modularidad y escalabilidad: La arquitectura permite añadir nuevas aplicaciones o servicios sin modificar la infraestructura de autenticación central.
-
Flexibilidad: La capacidad de federación de identidades de Keycloak facilita la integración con sistemas existentes y la migración gradual.
Aplicaciones prácticas:
Esta arquitectura es particularmente valiosa en:
- Grandes organizaciones con múltiples aplicaciones y departamentos
- Entornos regulados donde la trazabilidad y control de acceso son críticos
- Transformaciones digitales donde coexisten aplicaciones heredadas y modernas
- Empresas en crecimiento que necesitan una solución de autenticación que escale
Próximos pasos recomendados:
Después de implementar esta solución básica, considera:
- Implementar autenticación multifactor para usuarios privilegiados
- Configurar alta disponibilidad para Keycloak y LDAP
- Integrar análisis de comportamiento de usuario para detección de anomalías
- Automatizar procesos de aprovisionamiento con flujos de trabajo personalizados
- Implementar monitoreo y alertas de seguridad para detectar intentos de intrusión
El ecosistema moderno de autenticación está en constante evolución, pero esta implementación proporciona una base sólida sobre la cual construir soluciones de seguridad adaptadas a las necesidades específicas de cada organización.
Con la configuración y conocimientos adquiridos en este tutorial, estarás bien posicionado para implementar y mantener un sistema de autenticación empresarial robusto, seguro y centrado en el usuario.
Nota final: Recuerda que la seguridad es un proceso continuo, no un estado. Mantén todos los componentes actualizados y revisa regularmente las configuraciones y políticas de seguridad para adaptarte a nuevas amenazas y requisitos.






























