Skip to main content

Keycloak

image.png

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

Keycloak

Requisitos

Imagen

Repositorio de Docker Hub: keycloak/keycloak - Docker Image

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 variables2.15-docker_add_stack_web_editor.gif

Fichero de variables

DOMAIN="mi_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

services:
  db-keycloak:
    image: postgres
    container_name: db-keycloak
    restart: unless-stopped
    env_file: stack.env
    volumes:
      - db:/var/lib/postgresql/data
    networks:
      - backend
  
  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
    networks:
      - backend
      - proxy

volumes:
  db:
  html:

networks:
  backend:
  proxy:
    external: true

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

image.png

Para publicar el contenedor detrás de NGINX proxy, como el stack está en la red proxy solo deberás crear un nuevo host

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:

image.png

Traefik + OAuth2 Proxy

image.png

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.tls=true
      - traefik.http.routers.oauth2.tls.certresolver=letsencrypt
      - traefik.http.routers.oauth2.rule=Host(`oauth2.$DOMAIN`)
      - traefik.http.services.oauth2.loadbalancer.server.port=4180
      # Middleware oauth2-proxy como forwardAuth
      - traefik.http.middlewares.oauth2-auth.forwardauth.address=http://oauth2-proxy:4180/oauth2/auth
      - traefik.http.middlewares.oauth2-auth.forwardauth.trustforwardheader=true
      - traefik.http.middlewares.oauth2-auth.forwardauth.authresponseheaders=X-Auth-Request-User,X-Auth-Request-Email
    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”.

image.png

akbimage.png

Cree un secreto de cliente para usar este cliente desde Keycloak. Para ello, haga clic en "Certificados y secretos" y añada "Nuevo secreto de cliente". Asegúrese de copiar y anotar el valor del secreto. Se usará más adelante en la configuración de Keycloak.

image.png

Configurar Keycloak para usar el registro de Azure