Что такое Keycloak
Keycloak — это open-source решение для управления идентификацией и доступом (IAM) с поддержкой SSO (Single Sign-On), OAuth2, OpenID Connect, SAML 2.0 и других стандартов. Оно часто используется DevOps- и enterprise-средой (де-факто стандарт в крупном энтерпрайзе) для централизованной аутентификации и авторизации пользователей в приложениях.
Если вам понравилась настоящая статья, то можете поддержать автора став спонсором на бусти (ссылка в разделе контакты).
Зачем нужен Keycloak
Keycloak позволяет централизованно управлять аутентификацией пользователей:
- Единый вход (SSO) для всех приложений
- Поддержка внешних провайдеров (Google, GitHub и др.)
- Подключение LDAP и Active Directory
- Удобная админка
- OpenID Connect и OAuth 2.0
Что понадобится
- Docker + Docker Compose
- Обратный прокси (Traefik)
- Домен с настройкой DNS (
auth.example.ru) - SSL-сертификат (через Let’s Encrypt)
Возможности Keycloak
Аутентификация и авторизация
-
Single Sign-On (SSO) — единый вход во все подключенные приложения.
-
Поддержка социальных логинов — Google, Facebook, GitHub и др.
-
Поддержка стандартов — OAuth2, OpenID Connect, SAML 2.0.
-
Поддержка MFA (многофакторная аутентификация) — TOTP (Google Authenticator и аналоги).
Управление пользователями и ролями
-
Создание и управление пользователями, группами и ролями.
-
Делегированное администрирование (разграничение доступа между администраторами).
-
Импорт и экспорт пользователей (LDAP, CSV, REST API).
Интеграция с корпоративной инфраструктурой
-
Интеграция с LDAP / Active Directory.
-
SCIM-подобные возможности через REST API.
-
Поддержка клиента CLI и Admin REST API.
Multi-tenancy и реалмы
-
Поддержка множественных реалмов (изолированных доменов аутентификации).
-
Каждый реалм имеет свои настройки, пользователей, клиентов и политик.
Кастомизация
-
Кастомизация UI экранов входа и регистрации.
-
Расширяемость через Java SPI/плагины.
-
Локализация интерфейса.
Аудит и безопасность
-
Аудит логов входа и действий.
-
Настраиваемые политики паролей.
-
Поддержка ограничений IP, блокировка по IP, brute-force защита.
Docker compose файл, который используется в ролике
1services:2 postgres:3 image: postgres:16-alpine4 container_name: keycloak-db5 restart: always6 expose:7 - 54328 volumes:9 - /home/path/to/keycloak/database:/var/lib/postgresql/data10 environment:11 POSTGRES_DB: ${POSTGRES_DB}12 POSTGRES_USER: ${POSTGRES_USER}13 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}14 healthcheck:15 test:16 [17 "CMD",18 "pg_isready",19 "-q",20 "-d",21 "${POSTGRES_DB}",22 "-U",23 "${POSTGRES_USER}",24 ]25 interval: 10s26 timeout: 5s27 retries: 328 start_period: 60s29 networks:30 - keycloak31
32 keycloak:33 image: quay.io/keycloak/keycloak34 container_name: keycloak35 command: start36 environment:37 KC_HOSTNAME: ${KEYCLOAK_HOSTNAME}38 KC_BOOTSTRAP_ADMIN_USERNAME: ${KC_BOOTSTRAP_ADMIN_USERNAME}39 KC_BOOTSTRAP_ADMIN_PASSWORD: ${KC_BOOTSTRAP_ADMIN_PASSWORD}40 KC_DB: postgres41 KC_DB_URL: jdbc:postgresql://postgres/${POSTGRES_DB}42 KC_DB_USERNAME: ${POSTGRES_USER}43 KC_DB_PASSWORD: ${POSTGRES_PASSWORD}44 KC_PROXY_HEADERS: "xforwarded"45 KC_HTTP_ENABLED: true46 KC_HEALTH_ENABLED: true47 PROXY_ADDRESS_FORWARDING: "true"48 healthcheck:49 test:50 - "CMD-SHELL"51 - |52 exec 3<>/dev/tcp/localhost/9000 &&53 echo -e 'GET /health/ready HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3 &&54 cat <&3 | tee /tmp/healthcheck.log | grep -q '200 OK'55 interval: 10s56 timeout: 5s57 retries: 358 start_period: 90s59 #ports:60 # - 8080:808061 #expose:62 # - 8080 # web ui http63 # - 9000 # health endpoint64 restart: always65 depends_on:66 postgres:67 condition: service_healthy68 networks:69 - keycloak70 - proxy71 labels:72 - "traefik.enable=true"73 - "traefik.http.routers.keycloak.entrypoints=http"74 - "traefik.http.routers.keycloak.rule=Host(`keycloak.domain.ru`)"75 - "traefik.http.middlewares.keycloak-https-redirect.redirectscheme.scheme=https"76 - "traefik.http.routers.keycloak.middlewares=keycloak-https-redirect"77 - "traefik.http.routers.keycloak-secure.entrypoints=https"78 - "traefik.http.routers.keycloak-secure.rule=Host(`keycloak.domain.ru`)"79 - "traefik.http.routers.keycloak-secure.tls=true"80 - "traefik.http.routers.keycloak-secure.service=keycloak"81 - "traefik.http.services.keycloak.loadbalancer.server.port=8080"82 - "traefik.docker.network=proxy"83
84networks:85 keycloak:86 internal: true87 proxy:88 external: trueЗначения в файле переменных
1# define FQDN hostname2KEYCLOAK_HOSTNAME=keycloak.stilicho.ru3
4# define login credentials5KC_BOOTSTRAP_ADMIN_USERNAME=admin6KC_BOOTSTRAP_ADMIN_PASSWORD=password7
8# define database credentials9POSTGRES_DB=keycloak_db10POSTGRES_USER=keycloak_db_user11POSTGRES_PASSWORD=keycloak_db_user_passwordСсылки
Some information may be outdated