· 11 мин чтения

Keycloak SSO для корпоративных сервисов: один логин на всё — от GitLab до 1С

Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. Пришёл в ноябре 2025 к новому клиенту — юрфирма на 45 сотрудников. У каждого сотрудника в голове 8-12 паролей: почта, Bitrix24, GitLab, Nextcloud, Grafana, ONLYOFFICE, корпоративный портал, VPN, мобильный Outlook. Половина паролей совпадает (один и тот же «Maria2020!»), три — записаны на бумажке под клавиатурой, два — выдаёт IT каждое утро. Когда я ставлю им Keycloak — у них остаётся ОДИН пароль на всё. Плюс 2FA. Плюс единая точка отключения при увольнении. Расскажу, как это работает и сколько стоит.

Что такое Single Sign-On на практике

SSO — это когда сотрудник логинится один раз утром в Keycloak, и дальше все внутренние сервисы принимают его через браузерный токен без повторной аутентификации. Зашёл на Nextcloud — сразу внутри. Перешёл на GitLab — уже залогинен. Открыл Grafana — уже.

Технически это SAML 2.0 или OAuth2/OIDC. Keycloak — Identity Provider (IdP), который выдаёт токены. Приложения — Service Providers (SP), которые их принимают.

Преимущества для бизнеса:

Keycloak vs альтернативы

ПродуктСильные стороныДля кого
KeycloakEnterprise, SAML/OIDC, UI, LDAP-sync, 2FA, брокерКомпании 30+ сотрудников
AutheliaЛегковесный, идеально для reverse-proxy1-3 сервиса за nginx/Traefik
Okta / Auth0SaaS, удобно, дорогоСтартапы с деньгами
AD FSИнтеграция с AD, Windows-centricWindows-экосистема, МС-партнёры
FreeIPALinux identity, Kerberos, SUDO-правилаLinux-ориентированная инфра

Для среднего бизнеса с смешанной Windows/Linux инфраструктурой — Keycloak. Он работает как мост: читает пользователей из Windows AD, выдаёт токены для web-сервисов на любой платформе.

Установка Keycloak 25

# docker-compose.yml
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: ${POSTGRES_PASS}
    volumes: ["./pgdata:/var/lib/postgresql/data"]

  keycloak:
    image: quay.io/keycloak/keycloak:25.0
    command: start --optimized
    environment:
      KC_HOSTNAME: sso.example.ru
      KC_HOSTNAME_STRICT: true
      KC_HTTP_ENABLED: true
      KC_PROXY: edge
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: ${POSTGRES_PASS}
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: ${KC_ADMIN_PASS}
    depends_on: [postgres]
    ports: ["8080:8080"]

nginx перед Keycloak для HTTPS через Let's Encrypt:

server {
    listen 443 ssl http2;
    server_name sso.example.ru;
    ssl_certificate /etc/letsencrypt/live/sso.example.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sso.example.ru/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

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

Создаём realm corp, в нём настраиваем LDAP-provider:

Admin Console → realm corp → User federation → Add provider → ldap

Connection URL:        ldaps://dc01.corp.example.ru:636
Enable StartTLS:       yes
Use Truststore SPI:    Always
Bind DN:               CN=Keycloak Service,OU=Services,DC=corp,DC=example,DC=ru
Bind Credential:       [secure password]
Users DN:              OU=Users,DC=corp,DC=example,DC=ru
Username LDAP attr:    sAMAccountName
UUID LDAP attribute:   objectGUID
Sync period:           900 (seconds)
Full sync period:      -1 (once per day)

После этого Keycloak видит всех пользователей из AD. Маппинг групп — отдельно:

User federation → ldap → Mappers → Create group-ldap-mapper

LDAP Groups DN:        OU=Groups,DC=corp,DC=example,DC=ru
Group Object Classes:  group
Mode:                  READ_ONLY
User Groups Retrieve Strategy: LOAD_GROUPS_BY_MEMBER_ATTRIBUTE

Группы AD становятся группами Keycloak. Можно потом раздавать доступ в приложениях по группам: corp-it → admin в GitLab, corp-hr → viewer в Grafana.

Подключение приложений

В Keycloak создаём Client (приложение) для каждого сервиса.

GitLab через SAML

Keycloak: Clients → Create →
  Client ID: https://gitlab.example.ru
  Protocol: saml
  Valid redirect URI: https://gitlab.example.ru/users/auth/saml/callback
  Assertion Consumer URL: https://gitlab.example.ru/users/auth/saml/callback

# В gitlab.rb:
gitlab_rails['omniauth_providers'] = [{
  name: 'saml',
  args: {
    assertion_consumer_service_url: 'https://gitlab.example.ru/users/auth/saml/callback',
    idp_cert_fingerprint: '52:E8:85:3B:...',
    idp_sso_target_url: 'https://sso.example.ru/realms/corp/protocol/saml',
    issuer: 'https://gitlab.example.ru',
    name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
  }
}]

Nextcloud через OIDC

# Установить app user_oidc
# Config:
  Identifier:      corp
  Discovery:       https://sso.example.ru/realms/corp/.well-known/openid-configuration
  Client ID:       nextcloud
  Client secret:   (из Keycloak)
  Scope:           openid email profile
  Attribute for user ID: sub

Grafana через OAuth2

# /etc/grafana/grafana.ini
[auth.generic_oauth]
enabled = true
name = Keycloak
client_id = grafana
client_secret = [...]
auth_url = https://sso.example.ru/realms/corp/protocol/openid-connect/auth
token_url = https://sso.example.ru/realms/corp/protocol/openid-connect/token
api_url = https://sso.example.ru/realms/corp/protocol/openid-connect/userinfo
scopes = openid email profile
role_attribute_path = contains(groups[*], 'corp-it') && 'Admin' || 'Viewer'

2FA/MFA

Включаем в realm:

Authentication → Required Actions → Configure OTP (enabled)
Authentication → Flows → Browser → Add OTP Form

После этого при первом логине Keycloak предложит пользователю настроить TOTP через Google Authenticator / Authy. Для админов дополнительно включаем WebAuthn (YubiKey):

Authentication → Flows → Browser → Add WebAuthn Passwordless

Кейс: SSO для проектного института

В феврале 2026 клиент — проектный институт, 64 сотрудника, инфраструктура: GitLab, Nextcloud, ONLYOFFICE, Grafana, Zabbix, Rocket.Chat, Proxmox, корпоративный портал на Wiki.js, amoCRM. Каждый сервис — свой логин. Текучка кадров — 2-3 человека в месяц, админ тратил 40 минут в неделю на onboarding/offboarding.

Что сделали за 9 рабочих дней:

  1. VPS 4 vCPU / 8 ГБ / 50 ГБ в Selectel, Keycloak 25 через docker-compose, Let's Encrypt SSL.
  2. LDAP-sync с Windows AD (64 пользователя + 12 групп), period=15 минут.
  3. Подключили 9 сервисов через SAML/OIDC. По 40-90 минут на каждый.
  4. Настроили маппинг ролей: группа corp-it → admin в Grafana/GitLab/Proxmox; corp-design → full в Nextcloud и ONLYOFFICE; остальные — viewer.
  5. Включили обязательное TOTP для всех + YubiKey для IT-команды.
  6. Настроили backup Keycloak: pg_dump PostgreSQL + export realm каждые 6 часов на MinIO S3.
  7. Двухчасовое обучение сотрудников: как настроить Google Authenticator, что делать если потерял телефон.

Результат: onboarding нового сотрудника — 3 минуты (раньше 40). Offboarding — 30 секунд (раньше 10-15 минут). Жалоб на забытые пароли — стало в 8-10 раз меньше. Стоимость проекта — 148 тыс руб. Окупилось на экономии админского времени за 4 месяца.

Бэкапы и восстановление

Развернём Keycloak SSO для вашей компании — от 130 000 руб.

Я лично проектирую и разворачиваю единую точку аутентификации Keycloak для бизнеса 30-100 сотрудников в Москве и области. Интеграция с Active Directory, подключение всех внутренних сервисов (GitLab, Nextcloud, Grafana, Proxmox, ONLYOFFICE и т.д.), включение 2FA, обучение сотрудников. Типовой проект — 1.5-3 недели. Первичный аудит стека и план внедрения — бесплатно.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — Keycloak SSO

Зачем Keycloak, если уже есть AD с LDAP?
LDAP умеет только аутентифицировать по паролю. Keycloak — это IdP: выдаёт SAML/OAuth2/OIDC-токены для web-приложений, управляет сессиями, делает SSO (login once, access everywhere), поддерживает 2FA/MFA, социальные логины. Для 5+ внутренних web-сервисов Keycloak экономит часы админа на управление паролями.
Keycloak или Authelia?
Keycloak — enterprise-класс, полный SAML/OIDC/OAuth2, UI для администрирования, LDAP-синхронизация, developer-friendly. Authelia — легковеснее, проще, но узко сфокусирован на reverse-proxy auth (Traefik, nginx). Для 5+ web-сервисов с ролевой моделью — Keycloak. Для простой 2FA перед nginx — Authelia.
Какие приложения поддерживают Keycloak?
Из коробки через SAML или OIDC: GitLab, Nextcloud, ONLYOFFICE, Grafana, Jenkins, AWX/Ansible Tower, Rocket.Chat, Mattermost, Zabbix, Kibana, Proxmox (через OIDC), любой web-сервис с SAML-плагином. Через адаптеры: 1С (с нашими доработками), FreeIPA, AD.
Нужна ли 2FA обязательно?
Для административных учёток — да, всегда. Для обычных — зависит от чувствительности данных. В юрфирмах, медклиниках, финтехе — обязательно. Keycloak поддерживает TOTP (Google Authenticator), WebAuthn (YubiKey), SMS, email-код. Для корпоратива рекомендую TOTP для всех + YubiKey для админов.
Сколько стоит внедрение SSO под ключ?
Для офиса 30-80 сотрудников и 5-10 внутренних сервисов: VPS 4 vCPU / 8 ГБ RAM — 4-6 тыс руб/мес, работа по установке Keycloak + LDAP-синк с AD + подключение всех сервисов + 2FA + обучение — от 130 тыс руб разово. Включает настройку ролей, групп, резервное копирование и восстановление.