Descripción de Keycloak
Keycloak es una solución de gestión de identidades y accesos de código abierto que te permite añadir autenticación a tus aplicaciones y proteger servicios con un esfuerzo mínimo, sin necesidad de administrar el almacenamiento o la autenticación de usuarios de manera directa.
Originalmente desarrollado como un proyecto de la comunidad WildFly bajo Red Hat, Keycloak fue donado a la CNCF en abril de 2023, uniéndose como un proyecto en fase de incubación. Admite protocolos como OpenID Connect, OAuth 2.0 y SAML, y ofrece características como federación de usuarios, autenticación sólida, gestión de usuarios y autorización detallada.
A continuación, se muestra una lista de las principales características de Keycloak:
- Single Sign-On (SSO): Centraliza la autenticación para que los usuarios inicien sesión una sola vez y obtengan acceso a múltiples aplicaciones.
- Federación de usuarios: Se integra con repositorios de identidades externos (LDAP, Active Directory, etc.) para gestionar y autenticar a los usuarios desde una sola plataforma.
- Autenticación sólida: Implementa autenticación multifactor (MFA) con soporte para diversos factores (por ejemplo, contraseñas de un solo uso, WebAuthn).
- Autorización detallada: Define y hace cumplir políticas específicas para usuarios, roles y recursos dentro de tus aplicaciones.
- Control de acceso basado en roles (RBAC): Asigna permisos detallados a roles, simplificando la gestión de grandes cantidades de usuarios.
- Inicio de sesión social: Permite a los usuarios iniciar sesión a través de plataformas sociales (por ejemplo, Google, GitHub, Facebook) sin requerir una integración por separado.
- Servicios de token integrados: Genera y gestiona automáticamente tokens de acceso, identidad y renovación, alineados con los estándares de seguridad modernos.
Con estas capacidades, Keycloak elimina la carga de gestionar credenciales de usuario y flujos de seguridad, liberándote para centrarte en crear y escalar tus aplicaciones.
Usando Keycloak para nuestra arquitectura

A la hora de proteger el acceso tanto a la interfaz web como a las API de nuestros distintos componentes (Grafana, Grafana MIMIR, Grafana LOKI), Keycloak actua como el punto central de autenticación dentro de la arquitectura.
A grandes rasgos, su implementación sigue el siguiente flujo:
- Interceptación de peticiones en NGINX Proxy Manager
- Todas las solicitudes que llegan desde el navegador del usuario (o desde otros sistemas) pasan primero por NGINX Proxy Manager.
- En caso de que sea necesario autenticar la petición, NGINX redirige a Keycloak para que el usuario inicie sesión.
- Esto permite no tener que configurar la autenticación en cada una de las aplicaciones; dejándolas sin control de acceso internamente y exponiéndose de forma protegida externamente.
- Autenticación en Keycloak
- Keycloak valida las credenciales de los usuarios.
- Una vez autenticado con éxito, Keycloak emite tokens que prueban la identidad del usuario, manejando aspectos como su expiración y renovación.
- Estos tokens permiten que el usuario no tenga que iniciar sesión repetidamente en cada servicio.
- Provisión de tokens y retorno al proxy
- El usuario regresa al flujo de NGINX, esta vez con los tokens de acceso que Keycloak le ha proporcionado.
- NGINX revisa la validez de los tokens antes de redirigir a los servicios internos, como Grafana o sus componentes asociados (Grafana MIMIR, Grafana LOKI, etc.).
- Control de acceso a servicios
- Es tarea de cada aplicación revisar la información contenida en los tokens para determinar el nivel de acceso del usuario.
- Por ejemplo, Grafana puede mapear los roles definidos en Keycloak a roles específicos dentro de su plataforma (admin, editor, viewer, etc.).
- De este modo, las credenciales y los permisos de un usuario se gestionan de forma centralizada en Keycloak, simplificando la administración.
- Integración con componentes de observabilidad (MIMIR y LOKI)
- Single Sign-On (SSO): Gracias a SSO, el usuario solo inicia sesión una vez para acceder a todos los servicios de observabilidad.
- Gestión de usuarios y roles desde un único punto: facilita añadir nuevos usuarios, gestionar contraseñas y asignar permisos de forma escalable.
- Seguridad reforzada: Keycloak provee MFA (autenticación multifactor) y soporta protocolos como OpenID Connect y OAuth 2.0, que permiten un mayor nivel de protección.
- Auditoría y trazabilidad de accesos: se puede consultar en Keycloak quién inició sesión y cuándo, así como qué recursos se han utilizado.
En resumen, Keycloak añade una capa de seguridad sólida, simplifica la administración de usuarios y roles e integra de manera transparente los distintos componentes de observabilidad (Grafana, MIMIR y LOKI). Esta centralización de las autenticaciones y autorizaciones permite, además, futuras expansiones, por ejemplo, añadiendo otras aplicaciones que también necesiten un sistema común de gestión de identidades.
Stack de docker
Para ejecutar Keycloak usaremos el siguiente stack con los comandos típicos:
docker compose up. compose.yamlname: iam_i40sys
x-logging:
&default-logging
driver: "json-file"
options:
max-size: "10m"
max-file: "1"
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
restart: unless-stopped
# ports:
# - "8443:8443"
volumes:
- "./certs/:/etc/x509/https"
environment:
KEYCLOAK_ADMIN: ${KEYCLOAK_USER}
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_PASSWORD}
KC_HOSTNAME: ${KEYCLOAK_URL}
KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
KC_DB: postgres
KC_DB_USERNAME: ${POSTGRES_USER}
KC_DB_PASSWORD: ${POSTGRES_PASSWORD}
KC_HTTPS_CERTIFICATE_FILE: /etc/x509/https/iam.i40sys.com.crt
KC_HTTPS_CERTIFICATE_KEY_FILE: /etc/x509/https/iam.i40sys.com.key
#KC_LOG_LEVEL: ALL
depends_on:
- postgres
command:
- start
- --verbose
- --log-level=INFO
networks:
keycloak:
proxy:
logging: *default-logging
postgres:
image: postgres:latest
restart: unless-stopped
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_PORT: 5432
volumes:
- ./data:/var/lib/postgresql/data
networks:
keycloak:
logging: *default-logging
networks:
keycloak:
proxy:
name: services
external: true
.envKEYCLOAK_USER=admin
KEYCLOAK_PASSWORD=aldmin123
KEYCLOAK_URL=iam.i40sys.com
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgrespassword