Что такое 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# Создание 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
Установка библиотеки:
Пример интеграции:
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
Настройка в 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):
Мониторинг и метрики
Keycloak предоставляет метрики через Micrometer:
Настройка в 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.