Что такое 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 файл, который используется в ролике
services: postgres: image: postgres:16-alpine container_name: keycloak-db restart: always expose: - 5432 volumes: - /home/path/to/keycloak/database:/var/lib/postgresql/data environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} healthcheck: test: [ "CMD", "pg_isready", "-q", "-d", "${POSTGRES_DB}", "-U", "${POSTGRES_USER}", ] interval: 10s timeout: 5s retries: 3 start_period: 60s networks: - keycloak
keycloak: image: quay.io/keycloak/keycloak container_name: keycloak command: start environment: KC_HOSTNAME: ${KEYCLOAK_HOSTNAME} KC_BOOTSTRAP_ADMIN_USERNAME: ${KC_BOOTSTRAP_ADMIN_USERNAME} KC_BOOTSTRAP_ADMIN_PASSWORD: ${KC_BOOTSTRAP_ADMIN_PASSWORD} KC_DB: postgres KC_DB_URL: jdbc:postgresql://postgres/${POSTGRES_DB} KC_DB_USERNAME: ${POSTGRES_USER} KC_DB_PASSWORD: ${POSTGRES_PASSWORD} KC_PROXY_HEADERS: "xforwarded" KC_HTTP_ENABLED: true KC_HEALTH_ENABLED: true PROXY_ADDRESS_FORWARDING: "true" healthcheck: test: - "CMD-SHELL" - | exec 3<>/dev/tcp/localhost/9000 && echo -e 'GET /health/ready HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3 && cat <&3 | tee /tmp/healthcheck.log | grep -q '200 OK' interval: 10s timeout: 5s retries: 3 start_period: 90s #ports: # - 8080:8080 #expose: # - 8080 # web ui http # - 9000 # health endpoint restart: always depends_on: postgres: condition: service_healthy networks: - keycloak - proxy labels: - "traefik.enable=true" - "traefik.http.routers.keycloak.entrypoints=http" - "traefik.http.routers.keycloak.rule=Host(`keycloak.domain.ru`)" - "traefik.http.middlewares.keycloak-https-redirect.redirectscheme.scheme=https" - "traefik.http.routers.keycloak.middlewares=keycloak-https-redirect" - "traefik.http.routers.keycloak-secure.entrypoints=https" - "traefik.http.routers.keycloak-secure.rule=Host(`keycloak.domain.ru`)" - "traefik.http.routers.keycloak-secure.tls=true" - "traefik.http.routers.keycloak-secure.service=keycloak" - "traefik.http.services.keycloak.loadbalancer.server.port=8080" - "traefik.docker.network=proxy"
networks: keycloak: internal: true proxy: external: trueЗначения в файле переменных
# define FQDN hostnameKEYCLOAK_HOSTNAME=keycloak.stilicho.ru
# define login credentialsKC_BOOTSTRAP_ADMIN_USERNAME=adminKC_BOOTSTRAP_ADMIN_PASSWORD=password
# define database credentialsPOSTGRES_DB=keycloak_dbPOSTGRES_USER=keycloak_db_userPOSTGRES_PASSWORD=keycloak_db_user_passwordСсылки
Некоторая информация может быть устаревшей



