Keycloak: SSO и централизованное управление доступом

Проблема: 12 сервисов — 12 логинов

Компания «ТехОперации» — 120 сотрудников, 12 внутренних веб-сервисов: Grafana, GitLab, Nexus, Wiki, ServiceDesk, CRM и др. Каждый сервис — отдельная аутентификация. Проблемы:

  • 120 × 12 = 1440 учётных записей — синхронизация вручную
  • Увольнение сотрудника → забыли отключить в 3 сервисах → доступ остался
  • Пользователи используют одинаковые пароли везде
  • Нет единого аудита: кто куда заходил

Keycloak — open-source Identity and Access Management. Один логин для всех сервисов (SSO), интеграция с Active Directory/LDAP, 2FA, RBAC.

БылоСтало (Keycloak)
12 отдельных логинов1 логин для всех сервисов
Ручная синхронизацияАвтоматическая из AD/LDAP
Нет 2FATOTP, WebAuthn, SMS
Нет аудитаПолный лог всех входов
Увольнение = обход 12 сервисовDisable в Keycloak = блок везде

Установка Keycloak в production

# docker-compose.yml для production
services:
  postgres:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: ${KC_DB_PASSWORD}
    volumes:
      - pgdata:/var/lib/postgresql/data

  keycloak:
    image: quay.io/keycloak/keycloak:25.0
    command: start
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: ${KC_DB_PASSWORD}
      KC_HOSTNAME: auth.techops.ru
      KC_PROXY_HEADERS: xforwarded
      KC_HTTP_ENABLED: "true"
      KC_HEALTH_ENABLED: "true"
      KC_METRICS_ENABLED: "true"
    ports:
      - "8080:8080"
    depends_on:
      - postgres

volumes:
  pgdata:
# Nginx reverse proxy
server {
    listen 443 ssl;
    server_name auth.techops.ru;

    ssl_certificate /etc/ssl/auth.techops.ru.pem;
    ssl_certificate_key /etc/ssl/auth.techops.ru.key;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
    }
}

Интеграция с Active Directory

Keycloak синхронизирует пользователей и группы из AD. При входе пользователь аутентифицируется через AD, Keycloak выдаёт OIDC-токен для приложений.

# Через Admin Console: User Federation → LDAP
# Connection URL: ldap://dc01.techops.local:389
# Bind DN: CN=keycloak-svc,OU=Service Accounts,DC=techops,DC=local
# Bind Credential: ********
# Users DN: OU=Users,DC=techops,DC=local
# User Object Classes: person, organizationalPerson, user
# Username LDAP Attribute: sAMAccountName

# Mapper: группы AD → роли Keycloak
# Type: group-ldap-mapper
# LDAP Groups DN: OU=Groups,DC=techops,DC=local
# Mapped Group Attributes: cn
# LDAP Filter: (objectClass=group)

# Синхронизация каждые 5 минут
# Sync Settings: Full sync period: 3600, Changed users period: 300
Совет: Создайте отдельную сервисную учётную запись для Keycloak в AD с минимальными правами (только чтение OU с пользователями и группами). Никогда не используйте Domain Admin.

Подключение сервисов через OIDC

Пример: подключение Grafana к Keycloak через OpenID Connect.

# 1. В Keycloak: создать Client
# Client ID: grafana
# Client Protocol: openid-connect
# Access Type: confidential
# Valid Redirect URIs: https://grafana.techops.ru/login/generic_oauth
# Web Origins: https://grafana.techops.ru

# 2. В Grafana: grafana.ini
[auth.generic_oauth]
enabled = true
name = TechOps SSO
allow_sign_up = true
client_id = grafana
client_secret = <client-secret-from-keycloak>
scopes = openid profile email
auth_url = https://auth.techops.ru/realms/techops/protocol/openid-connect/auth
token_url = https://auth.techops.ru/realms/techops/protocol/openid-connect/token
api_url = https://auth.techops.ru/realms/techops/protocol/openid-connect/userinfo
role_attribute_path = contains(groups[*], 'admins') && 'Admin' || 'Viewer'

Подключение других сервисов:

СервисМетодСложность
GrafanaGeneric OAuth / OIDCПростая
GitLabOmniAuth OIDCПростая
NexusKeycloak pluginСредняя
Wiki.jsOIDC StrategyПростая
Custom appsOIDC SDK (keycloak-js)Средняя
nginx (legacy apps)oauth2-proxyПростая

2FA и результаты внедрения

Включение обязательной двухфакторной аутентификации:

# В Keycloak Admin Console:
# Authentication → Required Actions → Configure OTP → Default Action: ON
# Или через Policy: Authentication → Flows → browser → OTP Form → Required

# Поддерживаемые методы 2FA:
# - TOTP (Google Authenticator, Authy, Bitwarden)
# - WebAuthn (YubiKey, отпечаток пальца)
# - Recovery codes

Результаты «ТехОперации» за 2 месяца:

МетрикаДо KeycloakПосле Keycloak
Время входа пользователя12 логинов/день1 логин/день
Время отключения уволенного2-3 дня (12 сервисов)30 секунд
Инциденты «забыли отключить»5/мес0
2FA покрытие0%100%
Тикеты «забыл пароль»~30/мес~5/мес (self-service reset)

Часто задаваемые вопросы

Keycloak — самый зрелый, огромное сообщество, интеграция с любым OIDC-сервисом. Authentik — проще в установке, Python-based, хорош для малых команд. Zitadel — cloud-native, Go-based, лучшее API. Для enterprise с AD интеграцией — Keycloak. Для стартапа — Authentik.

Минимум: 2 CPU, 2 GB RAM, PostgreSQL. Для 100-500 пользователей: 4 CPU, 4 GB RAM. Для 5000+: кластер из 2-3 нод с 8 CPU, 8 GB RAM каждая. Keycloak на Java (Quarkus), так что JVM потребляет 512MB-2GB heap.

Существующие сессии продолжат работать — токены валидны до истечения (обычно 5-30 минут). Новые логины будут невозможны до восстановления Keycloak. Рекомендация: кластер из 2-3 нод + PostgreSQL с репликацией.

Да, Keycloak поддерживает self-registration, social login (Google, GitHub, Apple), identity brokering. Отлично подходит для B2C сценариев. Но для миллионов пользователей рассмотрите managed-решения (Auth0, Cognito) — меньше операционных затрат.

Три варианта: 1) User Federation (LDAP/AD) — пользователи остаются в AD, Keycloak читает их на лету. 2) Import через Admin API — для standalone баз пользователей. 3) User Storage SPI — кастомный провайдер для миграции из любого источника.

Нужна помощь с внедрением?

Настроим, оптимизируем и возьмём на поддержку вашу инфраструктуру. 15+ лет опыта, 8 серверов Dell Xeon в дата-центре МТС.

📞 Связаться с нами

Комментарии 0

Оставить комментарий

7 + 3 =