Diferencia entre revisiones de «Keycloak»
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)
- Usaremos MariaDB para almacenar los datos. Más información.
- 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/.
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
- Acceso a Docker Hub: https://app.docker.com/accounts/<user>/settings/personal-access-tokens
- Generar nuevo token
- 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
- First name
- Last name
- Pulser en "Credentials" -> "Set password".
- Password
- Password confirmation
- Temporary: Off
Referencias
- https://hub.docker.com/hardened-images/catalog/dhi/keycloak
- https://www.keycloak.org/guides
- https://www.keycloak.org/getting-started/getting-started-docker
- https://www.keycloak.org/server/db
- https://www.keycloak.org/server/configuration-production
- https://www.keycloak.org/server/hostname
- https://www.keycloak.org/server/reverseproxy