Diferencia entre revisiones de «Keycloak»

De Wiki Castanedo.es
Ir a la navegación Ir a la búsqueda
Sin resumen de edición
 
(Sin diferencias)

Revisión actual - 22:46 18 abr 2026

Instalación Keycloak en Docker

Instalación de dhi.io/keycloak en Docker. Vamos a usar una imagen "Docker Hardened Image" (imágenes seguras, mínimas y listas para producción).

Requisitos

Para poder realizar esta configuración se necesita:

  • Servidor GNU Linux (ver Securizar Ubuntu Server)
    • Cortafuegos FirewallD (UFW tiene problemas con Docker)
  • Docker Engine (ver Docker Engine)
    • Módulo: Docker Compose (para PRO)
  • MariaDB (ver MariaDB)
  • Nginx (ver LEMP)
  • Cuenta en Docker Hub
    • Necesario para acceder a Docker Hardened Image.

Entorno de DEV

Como entorno de DEV se va a usar Docker Desktop.

Login en catálogo DHI

docker login dhi.io

Descargar imagen

Vamos a usar la imagen que es la latest a día de hoy (26.5.6).

docker pull dhi.io/keycloak:26.5

Certificados SSL

Para poder arrancar la Keycloak hace falta tener certificados SSL/TLS. Nombres:

  • tls.crt: Certificado Fullchain (X.509 PEM)
  • tls.key: Clave RSA (PKCS#8)

Nota: en DEV usaremos auto-firmados y en PRO de Let's Encrypt.

Crear volumen para certificados SSL

  • Crear volumen "keycloak-certs"
docker volume create keycloak-certs
  • Copiar certificados en el "keycloak-cert":
cd /c/Users/guzman/Desktop/temp
docker create --name temp-copia -v keycloak-certs:/data alpine
docker cp entrardev.culturetas.net-fullchain.crt temp-copia:/data/tls.crt
docker cp entrardev.culturetas.net.key temp-copia:/data/tls.key
docker cp culturetas-root-ca.crt temp-copia:/data/ca.crt
docker rm temp-copia

Crear base de datos para MariaDB

Ver MariaDB para montar la BD necesaria.

Ejecutar contenedor en Docker Desktop (DEV)

docker run -d --name keycloak \
 --hostname entrardev.culturetas.net \
 --env KC_BOOTSTRAP_ADMIN_USERNAME=admin \
 --env KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
 --env KC_HTTP_PORT=9080 \
 --env KC_HTTPS_PORT=9443 \
 --env KC_HTTPS_CERTIFICATE_FILE=//etc/x509/https/tls.crt \
 --env KC_HTTPS_CERTIFICATE_KEY_FILE=//etc/x509/https/tls.key \
 --env KC_HOSTNAME=https://localhost:9443/ \
 --env KC_DB=mariadb \
 --env KC_DB_URL=jdbc:mariadb://172.17.0.2:3306/keycloakdb \
 --env KC_DB_USERNAME=keycloak \
 --env KC_DB_PASSWORD=keycloak \
 -p 127.0.0.1:9443:9443 \
 -v keycloak-certs:/etc/x509/https:ro \
 dhi.io/keycloak:26.5 start

Nota: si se desea usar una DB H2 hay que crear un volumen para guardar persistentemente dicha DB. NO RECOMENDADO PARA PRO.

 -v keycloak-data:/opt/keycloak/data/ \

Pruebas

Accedemos con un navegador web https://localhost:9443/.

Keycloak-DEV-Accesos.png

Entorno de PRO

En el entorno de PRO se va a desplegar transformando la configuración de Docker Desktop en fichero YAML de Docker Composer.

Configurar Virtual Host para Keycloak

  • Añadir Virtual Host:
sudo -i
vi /etc/nginx/sites-available/entrar.culturetas.net
###########################
# KEYCLOAK REVERSER PROXY #
###########################
server {
	listen 80;
	listen [::]:80;
	server_name entrar.culturetas.net;
	# Redirect HTTP to HTTPS
	return 301 https://$host$request_uri;
}

server {
	# SSL configuration
	#
	listen 443 ssl http2;
	listen [::]:443 ssl http2;
	ssl_certificate /etc/ssl/certs/selfsigned.crt;
	ssl_certificate_key /etc/ssl/private/selfsigned.key;
	
	# Root directory
	root /var/www/entrar.culturetas.net;

	# Add index.php to the list if you are using PHP
	index index.php index.html index.htm;

	server_name entrar.culturetas.net;

	access_log /var/log/nginx/entrar.culturetas.net-access.log;
	error_log /var/log/nginx/entrar.culturetas.net-error.log;

	# Activate HSTS (HTTP Strict Transport Security)
	# Note: reinclude if in a location a header is set
	include snippets/hsts.conf;

	# Allow favicon.ico, robots.txt, .well-known/
	# Deny *.txt, *.log, .*/*.php, .*, *.json, .lock, *.ht
	#include snippets/allowed.conf;
	#include snippets/denied.conf;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		#try_files $uri $uri/ =404;
		proxy_pass https://127.0.0.1:9443;
	}

	location = /robots.txt {
		allow all;
	}

	location ~* ^/.well-known/ {
		allow all;
	}
}
  • Crear carpeta para VirtualHost:
mkdir /var/www/entrar.culturetas.net
  • Activar Virtual Host:
ln -s /etc/nginx/sites-available/entrar.culturetas.net /etc/nginx/sites-enabled/entrar.culturetas.net
systemctl reload nginx

Generar certificados Let's Encrypt

certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: entrar.culturetas.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Requesting a certificate for entrar.culturetas.net

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/entrar.culturetas.net/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/entrar.culturetas.net/privkey.pem
This certificate expires on 2026-07-17.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for entrar.culturetas.net to /etc/nginx/sites-enabled/entrar.culturetas.net
Congratulations! You have successfully enabled HTTPS on https://entrar.culturetas.net

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Crear BD para keycloak (MariaDB)

Conectar a la base de datos

Conectamos como root:

mariadb

Crear base de datos

En este ejemplo creamos una BD para keycloak:

CREATE DATABASE keycloakdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Crear usuario

En este ejemplo creamos una BD para keycloak:

CREATE USER keycloak IDENTIFIED BY 'keycloak';

Dar permisos a usuario en BD

En este ejemplo creamos una BD para keycloak:

GRANT ALL PRIVILEGES ON keycloakdb.* TO 'keycloak';
FLUSH PRIVILEGES;

Comprobar permisos

SHOW GRANTS FOR 'keycloak';
+---------------------------------------------------------------------------------------------------------+
| Grants for keycloak@%                                                                                   |
+---------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `keycloak`@`%` IDENTIFIED BY PASSWORD '*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' |
| GRANT ALL PRIVILEGES ON `keycloakdb`.* TO `keycloak`@`%`                                                |
+---------------------------------------------------------------------------------------------------------+

Habilitar conexiones remotas

El necesario que la BD tenga configurada conexiones remotas (no sólo desde localhost). Ver documento Configuración MariaDB.

Nota: se recomienda NO exponer la base de datos a Internet. Es decir, sí habilitar las conexiones remotas, pero no abrir el puerto en los firewalls.

Crear carpetas para Keycloak

mkdir -p /opt/keycloak/data

Certificados SSL para el contenedor (auto-firmados)

Vamos a usar los unos certificados SSL auto-firmados para usar dentro del contenedor. Aunque estos sean auto-firmados los finales son los que muestra Nginx (Let's Encrypt).

mkdir -p /opt/keycloak/data/ssl
mv /tmp/entrar.culturetas.net* /opt/keycloak/data/ssl/
chown root:root /opt/keycloak/data/ssl/entrar.culturetas.net*
chmod 644 /opt/keycloak/data/ssl/entrar.culturetas.net*

Nota: aunque la key no se recomienda 644 (sino 600). Keycloak no es capaz de leerlo con otros permisos.

Login en catálogo DHI

  • Generar nuevo token
Culturetas-access-token.png
  • Guardar token en lugar seguro
  • Acceder a Docker
docker login -u <user> dhi.io

Nota: las imágenes Hardened son libres pero bajo registro.

Descargar imagen

Vamos a usar la imagen que es la latest a día de hoy (26.5.6).

docker pull dhi.io/keycloak:26.5

Generar fichero Compose YAML

vi /opt/keycloak/compose.yaml
name: keycloak
services:
    keycloak:
        container_name: keycloak
        hostname: entrar.culturetas.net
        restart: unless-stopped
        environment:
            - KC_BOOTSTRAP_ADMIN_USERNAME=admin
            - KC_BOOTSTRAP_ADMIN_PASSWORD=admin
            - KC_HTTP_PORT=9080
            - KC_HTTPS_PORT=9443
            - KC_HTTPS_CERTIFICATE_FILE=/etc/x509/https/tls.crt
            - KC_HTTPS_CERTIFICATE_KEY_FILE=/etc/x509/https/tls.key
            - KC_HOSTNAME=https://entrar.culturetas.net/
            - KC_DB=mariadb
            - KC_DB_URL=jdbc:mariadb://135.125.179.32:3306/keycloakdb
            - KC_DB_USERNAME=keycloak
            - KC_DB_PASSWORD=keycloak
        ports:
            - 127.0.0.1:9443:9443
        volumes:
            - /opt/keycloak/data/ssl/entrar.culturetas.net-fullchain.crt:/etc/x509/https/tls.crt:ro
            - /opt/keycloak/data/ssl/entrar.culturetas.net.key:/etc/x509/https/tls.key:ro
        image: dhi.io/keycloak:26.5
        command: start
chmod 640 /opt/keycloak/compose.yaml

Arrancar OpenLDAP (manual)

cd /opt/keycloak
docker compose up -d

Parar OpenLDAP (manual)

cd /opt/keycloak
docker compose down

Arrancar OpenLDAP (con SystemD)

  • Crear fichero SystemD
vi /etc/systemd/system/keycloak.service
[Unit]
Description=KeyCloak (Docker Compose)
After=docker.service mariadb.service network-online.target
Requires=docker.service mariadb.service
Wants=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/keycloak
ExecStart=/usr/bin/docker compose up --detach --remove-orphans --quiet-pull
ExecStop=/usr/bin/docker compose down --remove-orphans --volumes --timeout 30
TimeoutStartSec=180
TimeoutStopSec=120
Restart=on-failure
RestartSec=7

[Install]
WantedBy=multi-user.target
  • Arrancar y habilitar
systemctl daemon-reload
systemctl start keycloak
systemctl enable keycloak

Configuración KeyCloak

Editar Realm (master)

  • Acceder a KeyCloak con usuario admin.
  • Pulsar en "Realm settings".
  • Pulsar en "General".
    • Display name: culturetas.net
  • Pulsar en "Email".
    • From: hola@culturetas.net
    • From display name: Hola Cultureta
    • Host: smtp.culturetas.net
    • Port: 587
    • Enable StartTLS: Sí
    • Authentication: Sí
    • Username: hola@culturetas.net
    • Password

Crear usuario

  • Comprobar que estás en el realm "master".
  • Pulsar en "Users" -> "Create new user".
    • Username
    • Email
    • First name
    • Last name
  • Pulser en "Credentials" -> "Set password".
    • Password
    • Password confirmation
    • Temporary: Off

Referencias