Keycloak

Keycloak es una solución de gestión de identidad y acceso (IAM, Identity and Access Management) de código abierto. Proporciona autenticación, autorización y administración de usuarios para aplicaciones modernas, eliminando la necesidad de que cada aplicación implemente su propio sistema de seguridad.
Características principales de Keycloak:
🔑 SSO (Single Sign-On): Un usuario inicia sesión una vez y accede a múltiples aplicaciones sin volver a autenticarse.
🔄 Soporte para OAuth2, OpenID Connect y SAML: Protocolos estándar para autenticación segura.
📛 Autenticación multifactor (MFA): Agrega seguridad adicional con códigos OTP, autenticación biométrica, etc.
🧑💼 Integración con directorios LDAP y Active Directory: Permite conectar usuarios de empresas fácilmente.
📱 Inicio de sesión con redes sociales: Soporte para Google, Facebook, GitHub, etc.
🔀 Federación de identidad: Permite integrar varias fuentes de autenticación.
🔍 Autorización basada en roles (RBAC): Control de acceso detallado según roles y permisos.
🚀 Extensibilidad: Se pueden agregar personalizaciones y flujos de autenticación personalizados.
Casos de uso:
-
Autenticación centralizada para microservicios en Kubernetes.
-
Portal de usuarios con inicio de sesión unificado.
-
Integración con APIs y aplicaciones móviles.
-
Seguridad en entornos empresariales.
Enlaces
Requisitos
- Docker o Podman instalado siguiendo los pasos de instalar
- Portainer configurado siguiendo los pasos de instalar portainer.
- NGINX Proxy manager siguiendo los pasos de instalar NGINX Proxy Manager. (opcional)
- Traefik configurado siguiendo los pasos de instalar Traefik. (opcional)
Imagen
Repositorio de Docker Hub: keycloak/keycloak - Docker Image
Directorio de datos
mkdir -pv $CONTAINERDIR/keycloack/db
Portainer- Nuevo «stack»
Add a new stack – Portainer Documentation
Web editor
En Portainer «Stack» agregamos nuevo usando el editor WEB pegando el contenido del fichero «docker-compose.yml» y el contenido del fichero de variables
Fichero de variables «.env»
DOMAIN=dominio.com
# Postgres enviroment
POSTGRES_DB=keycloak
POSTGRES_USER=keycloak
POSTGRES_PASSWORD=keycloakpass
# Keycloak enviroment
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=admin
KC_DB=postgres
KC_DB_URL=jdbc:postgresql://db-keycloak:5432/keycloak
KC_DB_USERNAME=$POSTGRES_USER
KC_DB_PASSWORD=$POSTGRES_PASSWORD
KC_HOSTNAME=auth.$DOMAIN
KC_PROXY_HEADERS=xforwarded
KC_HTTP_ENABLED=true
# OAuth2 proxy enviroment
OAUTH2_PROXY_PROVIDER=keycloak
OAUTH2_PROXY_CLIENT_ID=oauth2-proxy
OAUTH2_PROXY_CLIENT_SECRET=TU_CLIENT_SECRET
OAUTH2_PROXY_COOKIE_SECRET=$(openssl rand -hex 16)
OAUTH2_PROXY_EMAIL_DOMAINS="*"
OAUTH2_PROXY_REDIRECT_URL=https://auth.$DOMAIN/oauth2/callback
OAUTH2_PROXY_UPSTREAMS=static://202
OAUTH2_PROXY_OIDC_ISSUER_URL=https://auth.$DOMAIN/realms/tu-realm
OAUTH2_PROXY_HTTP_ADDRESS=0.0.0.0:4180
Fichero docker-compose.yml
services:
db-keycloak:
image: postgres
container_name: db-keycloak
restart: unless-stopped
env_file: stack.env
volumes:
- /var/data/keycloak/db:/var/lib/postgresql/data
keycloak:
image: quay.io/keycloak/keycloak:latest
container_name: keycloak
restart: unless-stopped
env_file: stack.env
command: ["start-dev"]
depends_on:
- db-keycloak
ports:
- 8080:8080
En este punto ya puedes ir a http://my.docker.ip.address
Publicando detrás de un proxy
Crear registro DNS
En el proveedor que aloja el servidor DNS público, crear un registro DNS que resuelva la IP pública que llega al Proxy hacia un nombre del estilo "host.domain.com"
NGINX proxy
Para publicar el contenedor detrás de NGINX proxy, deberás añadir al final del fichero "docker-compose.yml" lo siguiente:
networks:
- backend
- proxy
networks:
backend:
proxy:
external: true
Crear un nuevo "proxy host"
Añade un nuevo proxy host con el nombre de dominio creado en el paso anterior redirigido hacia el nombre del contenedor y el puerto que use:

Traefik + OAuth2 Proxy

Para publicar el contenedor detrás del proxy Traefik, deberás añadir al final del fichero "docker-compose.yml" lo siguiente:
networks:
- backend
- traefik_public
labels:
- traefik.enable=true
- traefik.http.routers.keycloack.rule=Host(`auth.$DOMAIN`)
- traefik.http.routers.keycloack.tls=true
- traefik.http.routers.keycloack.tls.certresolver=letsencrypt
- traefik.http.services.keycloack.loadbalancer.server.port=8080
oauth2-proxy:
image: quay.io/oauth2-proxy/oauth2-proxy
container_name: oauth2-proxy
restart: unless-stopped
env_file: stack.env
labels:
- traefik.enable=true
- traefik.http.routers.oauth2.rule=Host(`auth.oauth2.$DOMAIN`)
- traefik.http.services.oauth2.loadbalancer.server.port=4180
networks:
- traefik_public
networks:
backend:
traefik_public:
external: true
Keycloak SSO with Azure AD
Configurar el registro de aplicaciones de Azure.
- Inicie sesión en el portal de Azure y busque “Registros de aplicaciones”.
- Aquí debemos crear un nuevo registro de aplicación para el “Portal de administración de flujo” y hacer clic en “Nuevo registro”.



Configurar Keycloak para usar el registro de Azure
