Что такое Keycloak?

Keycloak — это open source решение для управления идентификацией и доступом (Identity and Access Management, IAM), разработанное Red Hat. Keycloak предоставляет современные функции аутентификации и авторизации с поддержкой стандартов OpenID Connect, OAuth 2.0 и SAML 2.0.

Основные возможности Keycloak

  • Single Sign-On (SSO) — единая аутентификация для множества приложений
  • Identity Brokering — интеграция с внешними провайдерами (Google, GitHub, LDAP)
  • User Federation — синхронизация с LDAP и Active Directory
  • Social Login — вход через социальные сети
  • Multi-factor Authentication — двухфакторная аутентификация
  • Fine-grained Authorization — детальное управление правами доступа

Когда использовать Keycloak

Keycloak отлично подходит для:

  • Централизованного управления пользователями в микросервисной архитектуре
  • Реализации SSO для корпоративных приложений
  • Интеграции с существующими LDAP/AD системами
  • Обеспечения безопасности API через OAuth 2.0
  • Создания customer identity платформы

Установка Keycloak

Установка через Docker:

 1# Запуск Keycloak с PostgreSQL
 2docker run -d --name postgres \
 3  -e POSTGRES_DB=keycloak \
 4  -e POSTGRES_USER=keycloak \
 5  -e POSTGRES_PASSWORD=password \
 6  postgres:13
 7
 8docker run -d --name keycloak \
 9  -p 8080:8080 \
10  -e KEYCLOAK_ADMIN=admin \
11  -e KEYCLOAK_ADMIN_PASSWORD=admin \
12  -e KC_DB=postgres \
13  -e KC_DB_URL=jdbc:postgresql://postgres:5432/keycloak \
14  -e KC_DB_USERNAME=keycloak \
15  -e KC_DB_PASSWORD=password \
16  --link postgres:postgres \
17  quay.io/keycloak/keycloak:latest start-dev

Docker Compose конфигурация:

 1version: '3.8'
 2services:
 3  postgres:
 4    image: postgres:13
 5    container_name: keycloak-postgres
 6    environment:
 7      POSTGRES_DB: keycloak
 8      POSTGRES_USER: keycloak
 9      POSTGRES_PASSWORD: password
10    volumes:
11      - postgres_data:/var/lib/postgresql/data
12    restart: unless-stopped
13
14  keycloak:
15    image: quay.io/keycloak/keycloak:latest
16    container_name: keycloak
17    environment:
18      KEYCLOAK_ADMIN: admin
19      KEYCLOAK_ADMIN_PASSWORD: admin
20      KC_DB: postgres
21      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
22      KC_DB_USERNAME: keycloak
23      KC_DB_PASSWORD: password
24      KC_HOSTNAME_STRICT: false
25    ports:
26      - "8080:8080"
27    depends_on:
28      - postgres
29    command: start-dev
30    restart: unless-stopped
31
32volumes:
33  postgres_data:

Создание Realm и настройка

После запуска перейди по адресу http://localhost:8080 и создай новый realm:

1# Создание realm через REST API
2curl -X POST "http://localhost:8080/admin/realms" \
3  -H "Authorization: Bearer $ACCESS_TOKEN" \
4  -H "Content-Type: application/json" \
5  -d '{
6    "realm": "my-app",
7    "enabled": true,
8    "displayName": "My Application"
9  }'

Создание клиента для приложения

 1# Создание OpenID Connect клиента
 2curl -X POST "http://localhost:8080/admin/realms/my-app/clients" \
 3  -H "Authorization: Bearer $ACCESS_TOKEN" \
 4  -H "Content-Type: application/json" \
 5  -d '{
 6    "clientId": "my-web-app",
 7    "enabled": true,
 8    "protocol": "openid-connect",
 9    "publicClient": false,
10    "standardFlowEnabled": true,
11    "directAccessGrantsEnabled": true,
12    "redirectUris": ["http://localhost:3000/*"],
13    "webOrigins": ["http://localhost:3000"]
14  }'

Интеграция с приложением на Python

Установка библиотеки:

1pip install python-keycloak
2poetry add python-keycloak

Пример интеграции:

 1from keycloak import KeycloakOpenID
 2
 3# Настройка клиента
 4keycloak_openid = KeycloakOpenID(
 5    server_url="http://localhost:8080/",
 6    client_id="my-web-app",
 7    realm_name="my-app",
 8    client_secret_key="your-client-secret"
 9)
10
11# Получение токена по логину/паролю
12token = keycloak_openid.token(username="user", password="password")
13access_token = token['access_token']
14
15# Получение информации о пользователе
16userinfo = keycloak_openid.userinfo(access_token)
17print(f"Пользователь: {userinfo['preferred_username']}")
18
19# Проверка токена
20token_info = keycloak_openid.introspect(access_token)
21if token_info['active']:
22    print("Токен активен")
23
24# Обновление токена
25new_token = keycloak_openid.refresh_token(token['refresh_token'])
26
27# Выход
28keycloak_openid.logout(token['refresh_token'])

Интеграция с Django

1pip install django-keycloak-auth
2poetry add django-keycloak-auth

Настройка в settings.py:

 1# settings.py
 2INSTALLED_APPS = [
 3    # ...
 4    'keycloak_auth',
 5]
 6
 7AUTHENTICATION_BACKENDS = [
 8    'keycloak_auth.backends.KeycloakAuthenticationBackend',
 9    'django.contrib.auth.backends.ModelBackend',
10]
11
12KEYCLOAK_CONFIG = {
13    'KEYCLOAK_SERVER_URL': 'http://localhost:8080/',
14    'KEYCLOAK_REALM': 'my-app',
15    'KEYCLOAK_CLIENT_ID': 'django-client',
16    'KEYCLOAK_CLIENT_SECRET': 'your-client-secret',
17}

Настройка LDAP интеграции

Keycloak может интегрироваться с существующими LDAP серверами:

 1# Создание LDAP федерации через API
 2curl -X POST "http://localhost:8080/admin/realms/my-app/components" \
 3  -H "Authorization: Bearer $ACCESS_TOKEN" \
 4  -H "Content-Type: application/json" \
 5  -d '{
 6    "name": "ldap-provider",
 7    "providerId": "ldap",
 8    "providerType": "org.keycloak.storage.UserStorageProvider",
 9    "config": {
10      "connectionUrl": ["ldap://ldap.company.com:389"],
11      "usersDn": ["ou=Users,dc=company,dc=com"],
12      "bindDn": ["cn=admin,dc=company,dc=com"],
13      "bindCredential": ["admin-password"]
14    }
15  }'

Настройка социальных провайдеров

Добавление Google OAuth:

 1# Создание Google identity provider
 2curl -X POST "http://localhost:8080/admin/realms/my-app/identity-provider/instances" \
 3  -H "Authorization: Bearer $ACCESS_TOKEN" \
 4  -H "Content-Type: application/json" \
 5  -d '{
 6    "alias": "google",
 7    "providerId": "google",
 8    "enabled": true,
 9    "config": {
10      "clientId": "your-google-client-id",
11      "clientSecret": "your-google-client-secret"
12    }
13  }'

Настройка двухфакторной аутентификации

Включение OTP (One-Time Password):

1# Настройка OTP policy
2curl -X PUT "http://localhost:8080/admin/realms/my-app/authentication/required-actions/CONFIGURE_TOTP" \
3  -H "Authorization: Bearer $ACCESS_TOKEN" \
4  -H "Content-Type: application/json" \
5  -d '{
6    "enabled": true,
7    "defaultAction": true
8  }'

Мониторинг и метрики

Keycloak предоставляет метрики через Micrometer:

1# Включение метрик
2KC_METRICS_ENABLED=true
3KC_HEALTH_ENABLED=true
4
5# Доступ к метрикам
6curl http://localhost:8080/metrics
7curl http://localhost:8080/health

Настройка в Kubernetes

Пример Helm values для production:

 1# values.yaml для Keycloak Helm chart
 2postgresql:
 3  enabled: true
 4  auth:
 5    database: keycloak
 6    username: keycloak
 7    password: keycloak-password
 8
 9auth:
10  adminUser: admin
11  adminPassword: admin-password
12
13service:
14  type: ClusterIP
15
16ingress:
17  enabled: true
18  hostname: keycloak.example.com
19  tls: true
20
21resources:
22  requests:
23    memory: 512Mi
24    cpu: 500m
25  limits:
26    memory: 1Gi
27    cpu: 1000m

Best Practices

  • Используй отдельные realms для разных приложений или окружений
  • Настраивай правильные redirect URIs для безопасности
  • Включай логирование и мониторинг для аудита
  • Используй короткие сроки жизни токенов с refresh tokens
  • Регулярно обновляй Keycloak до последних версий

FAQ

Подходит ли Keycloak для продакшена?

Да, Keycloak широко используется в production средах и поддерживается Red Hat. Многие крупные компании используют Keycloak для управления миллионами пользователей.

Какие требования к инфраструктуре?

Минимальные требования: 2 ГБ RAM, 1 CPU core, внешняя база данных. Для production рекомендуется кластерная конфигурация с load balancer.

Можно ли мигрировать с других IAM систем?

Да, Keycloak поддерживает импорт пользователей и может интегрироваться с существующими системами через LDAP, SAML или custom SPI.