В современном цифровом мире вопросы аутентификации и авторизации пользователей выходят на первый план. Разработчикам и администраторам систем требуется надёжное, гибкое и безопасное решение для управления идентификацией — без избыточных затрат времени на реализацию «с нуля».
Keycloak — один из наиболее популярных open‑source‑продуктов в этой области. Он предоставляет полнофункциональный сервер идентификации и доступа (Identity and Access Management, IAM), позволяющий:
- настраивать политики безопасности и многое другое.
- управлять пользователями и их ролями;
- реализовывать единый вход (Single Sign‑On);
- интегрировать внешние провайдеры идентификации (соцсети, корпоративные IDP);
Тестовый запуск Keycloak
Страница загрузи по адресу https://www.keycloak.org/downloads.
Keycloak представляет из себя Java-приложение и мы можем его запустить так же как и любое другое Java приложение (например Jira или Jenkins).
Устанавливаем необходимые пакеты (Для запуска требуется Open JDK 21).
# apt-get install openjdk-21-jre
Загружаем и распаковываем.
# cd /tmp/
# wget https://github.com/keycloak/keycloak/releases/download/26.5.3/keycloak-26.5.3.tar.gz
# tar -xvf ./keycloak-26.5.3.tar.gz
# mv ./keycloak-26.5.3 /opt/keycloak
Подготавливаем окружение и запускаем.
# useradd keycloak
# mkdir /home/keycloak
# chown keycloak:keycloak /home/keycloak
# cd /opt/keycloak/
# chown -R keycloak:keycloak /opt/keycloak/
# su keycloak -s /bin/bash
$ bin/kc.sh start-dev
Обратите внимание, что мы запустили keycloack с ключом start-dev, а это запуск в режиме разработки, для того чтобы просто проверить работоспособность.
Сервис запускается на порту 8080 и мы можем сразу подключиться к Web-интерфейсу управления.

Настройка Production Keycloak
Сразу зарегистрируем доменную запись у регистратора.

Получаем сертификат Let’s encrypt.
# certbot certonly --nginx -d kc.interlan.xyz
Конфигурация reverse-proxy типовая.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name www.kc.interlan.xyz kc.interlan.xyz;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name www.kc.interlan.xyz kc.interlan.xyz;
access_log /var/log/nginx/kc.interlan.xyz-access.log;
error_log /var/log/nginx/kc.interlan.xyz-error.log warn;
ssl_certificate /etc/letsencrypt/live/kc.interlan.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/kc.interlan.xyz/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
client_max_body_size 64M;
fastcgi_buffers 64 4K;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
if ($host ~ ^www\.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8080;
}
}
Проверяем, что сервис доступен по доменному имени по протоколу https. Так как сервис запущен в режиме разработки не имеет особого смысла сейчас создавать административного пользователя и прежде всего необходимо настроить работу с базой данных (сейчас используется локальная).
Создаем базу данных и пользователя.
# CREATE USER keycloack_user WITH PASSWORD 'xxxPASSWORDxxx';
# CREATE DATABASE keycloack_db OWNER keycloack_user;
Вносим изменения в файл конфигурации и перезапускаем сервис просто остановив и запустив приложение запущенное в тестовом режиме.
Файл конфигурации /opt/keycloak/conf/keycloak.conf.
db=postgres
db-username=keycloack_user
db-password=xxxPASSWORDxxx
db-url=jdbc:postgresql://127.0.0.1/keycloack_db
База данных проинициализирована после перезапуск Keycloack.

Подключаемся к серверу по ssh с использованием проброса портов для создания административного пользователя.
$ ssh root@185.135.81.157 -L:8080:127.0.0.1:8080
Теперь подключившись на localhost:8080 можем создать административного пользователя.

И сейчас фактически остается настроить SystemD-сервис, перевести Keycloack в Production-режим и устанока Keycloack завершена.
Вносим изменения в конфигурационный файл для работы за реверс-прокси.
http-enabled=true
proxy-trusted-addresses=185.135.81.157,127.0.0.0/8
proxy-headers=xforwarded
hostname=https://kc.interlan.xyz
Файл сервиса /lib/systemd/system/keycloack.service.
[Unit]
Description=Keycloack service
After=syslog.target
[Service]
WorkingDirectory=/opt/keycloak
User=keycloak
ExecStart=/opt/keycloak/bin/kc.sh start
[Install]
WantedBy=multi-user.target
Настраиваем автозапуск и запускаем.
# systemctl daemon-reload
# systemctl enable keycloack.service
# systemctl start keycloack.service



