Оглавление
- Введение и дисклеймер
- Обзор Keycloak
- Подготовка окружения
- Установка и запуск (Docker)
- Админ-панель Keycloak: Базовые сущности
- Механизмы аутентификации
- Теория протоколов: OAuth 2.0 и OpenID Connect
- Гранты (Grant Types)
- Практика: Интеграция со Spring Boot
- Практика: Identity Brokering (GitHub и Auth0)
- Межсервисное взаимодействие (M2M)
- Заключение
Введение и дисклеймер
Цель — дать базовое понимание Keycloak, концепций безопасности и продемонстрировать практическую работу с инструментом.
Обзор Keycloak
Что такое Keycloak?
Keycloak — это Open Source продукт (сообщество JBoss, под управлением Red Hat) для реализации Single Sign-On (SSO) с возможностью управления доступом.
- Используется как upstream-проект для Red Hat SSO.
- Позволяет минимизировать написание кода для аутентификации и авторизации.
- Выступает центральным компонентом безопасности в инфраструктуре компании (интегрирует внешних провайдеров, LDAP, внутренние приложения).
Основные возможности
- SSO / Single Sign-Out для браузерных приложений.
- Поддержка протоколов: OpenID Connect, OAuth 2.0, OAuth 1.0, SAML.
- Identity Brokering: вход через внешние соцсети (Google, Facebook, GitHub).
- User Federation: синхронизация с LDAP и Active Directory.
- Kerberos Bridge: автоматическая аутентификация в доменных сетях.
- Админская консоль и REST API для управления.
Подготовка окружения
Необходимое ПО
- Docker и Git (обязательный минимум).
- JDK 24 и Gradle 8.14+ (рекомендуется для повторения практических шагов).
- Система сборки: Gradle (версия 8.14 необходима для поддержки Java 24).
Структура проекта (Gradle)
build.gradle: описание плагинов (Java) и зависимостей (JUnit, Spring Boot).gradle.properties: хранение версий инструментов.settings.gradle: описание модулей (EventApp, NotificationApp).
Установка и запуск (Docker)
Конфигурация Docker Compose
Keycloak требует базу данных. В примере используется PostgreSQL 15.
Параметры PostgreSQL:
- Название БД:
keyclock - Пользователь/Пароль:
keyclock/keyclock - Внешний порт:
5433(внутренний5432).
Параметры Keycloak (образ версии 26.2):
- Внешний порт:
9090(внутренний8080). - Переменные окружения: связь с БД, учетные данные админа (
admin/admin). - Сеть:
KeyClock-Netдля связи контейнеров.
Режимы запуска: Dev vs Production
Keycloak запускается командой start-dev (режим разработки) или start-pro.
| Функция | Dev Mode (start-dev) |
Production Mode (start-pro) |
|---|---|---|
| HTTPS | Не обязателен (HTTP разрешен) | Обязателен (требует TLS/SSL) |
| Сертификаты | Проверка отключена | Строгая проверка |
| Логи | Подробные (включая Stack Trace) | Ограниченные |
| Пароли | Слабые политики (admin/admin) | Строгие политики |
| База данных | Допускает встроенную H2 | Только внешняя (PostgreSQL и др.) |
База данных (PostgreSQL)
Keycloak использует библиотеку Liquibase для управления миграциями. При первом запуске в схеме public создается 88 таблиц.
- Таблица
Realm: хранит информацию об областях доступа. - Системные таблицы:
databasechangelog(история миграций).
Админ-панель Keycloak: Базовые сущности
Realms (Реалмы)
Realm — это изолированная область управления пользователями, ролями и клиентами.
- Пользователи одного реалма не могут войти в другой.
- Master Realm: Главный административный реалм. Только из него можно создавать другие реалмы и глобальных админов.
Clients (Клиенты)
Clients — приложения или сервисы, которые запрашивают аутентификацию. Стандартные клиенты Keycloak:
account: личный кабинет пользователя.admin-cli: для работы через консоль или API.broker: для федерации идентичности.security-admin-console: сама админ-панель.
Client Scopes (Области доступа)
Механизм, определяющий, какие данные попадут в токен.
- Default: scope включается всегда.
- Optional: включается только при явном запросе клиента.
Примеры стандартных scopes:
profile: имя, фамилия, дата рождения.email: адрес почты и статус подтверждения.roles: список ролей пользователя.offline_access: позволяет выдавать refresh-токены для длительных сессий.
Roles (Роли)
- Realm Roles: глобальные роли для всего реалма.
- Client Roles: роли внутри конкретного приложения.
- Composite Roles: роли-контейнеры, объединяющие в себе несколько других ролей (например,
manage-usersвключает в себяread,edit,delete).
Users (Пользователи)
Вкладка управления учетными данными. Позволяет:
- Задавать пароли (постоянные или временные).
- Настраивать Required Actions (например, “Update Password” при первом входе).
- Привязывать роли и группы.
Механизмы аутентификации
Authentication Flows
Потоки (шаги), через которые проходит пользователь:
- Browser Flow: для входа через браузер (логин, 2FA, капча).
- Direct Grant Flow: для входа по логину/паролю через REST (например, мобильные приложения).
- Registration Flow: процесс регистрации новых пользователей.
Identity Brokering (Социальные логины)
Позволяет использовать внешние IDP (Google, GitHub, Auth0) для входа в ваше приложение. Keycloak выступает посредником: получает данные от внешней системы и создает/связывает пользователя локально.
User Federation (LDAP, Kerberos)
Интеграция с существующими корпоративными хранилищами.
- LDAP/Active Directory: Keycloak читает пользователей из внешней базы.
- Kerberos: обеспечивает беспарольный вход (SSO) в доменных сетях Windows через билеты (KDC).
Теория протоколов: OAuth 2.0 и OpenID Connect
OAuth 1.0 vs 2.0
- OAuth 1.0: Сложный, требовал криптографической подписи каждого запроса.
- OAuth 2.0: Упрощенный, опирается на безопасность транспортного уровня (HTTPS). Цель — дать приложению доступ к ресурсам без передачи пароля.
OpenID Connect (OIDC)
Надстройка над OAuth 2.0. OAuth отвечает за авторизацию (права), OIDC добавляет аутентификацию (кто этот пользователь).
- Добавляет ID Token (формат JWT).
Типы токенов: Access, Refresh, ID
- Access Token: Короткоживущий токен для доступа к API.
- Refresh Token: Долгоживущий токен для получения нового Access токена без повторного ввода пароля.
- ID Token: Содержит информацию о профиле (имя, почту).
Виды Access токенов: Opaque vs JWT
- Opaque (Oauth 2.0): “Непрозрачная” строка. Ресурсный сервер должен каждый раз обращаться к Keycloak (Introspection), чтобы проверить его.
- JWT (JSON Web Token): Самодостаточный токен. Содержит заголовок, полезную нагрузку (payload) и подпись. Сервер может проверить его локально с помощью публичного ключа Keycloak.
Гранты (Grant Types)
Authorization Code Flow
Самый безопасный флоу для веб-приложений с Backend-ом.
- Приложение редиректит пользователя на Keycloak.
- Keycloak возвращает Code (код авторизации).
- Backend обменивает Code на токены, используя Client Secret.
PKCE (Proof Key for Code Exchange)
Модификация Authorization Code для мобильных и SPA-приложений, которые не могут безопасно хранить Client Secret.
- Использует динамически генерируемые
Code VerifierиCode Challenge.
Client Credentials (M2M)
Взаимодействие “машина-машина” (один сервис идет в другой). Пользователь в этой схеме отсутствует. Аутентификация происходит по Client ID и Client Secret.
Device Code Flow
Для устройств без клавиатуры (Smart TV). Пользователь вводит короткий код на другом устройстве (телефоне/ПК).
Refresh Token Flow
Обмен Refresh токена на новый Access токен.
Устаревшие гранты (Implicit, Password)
- Implicit Flow: Токен передавался сразу в URL (небезопасно).
- Resource Owner Password Credentials: Приложение напрямую запрашивает логин/пароль (крайне не рекомендуется).
Практика: Интеграция со Spring Boot
Настройка SecurityConfig
В Spring Security 6+ конфигурация реализуется через SecurityFilterChain.
- Actuator Endpoints: часто делаются открытыми (
permitAll()) или защищаются ролью ADMIN. - Business Endpoints: требуют аутентификации (
authenticated()).
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/**").permitAll()
.requestMatchers("/api/v1/events/**").authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
return http.build();
}
Маппинг ролей из JWT
По умолчанию Spring не видит роли Keycloak. Нужно создать конвертер, который достает роли из поля roles (или realm_access) в JWT и добавляет к ним префикс ROLE_.
Практика: Identity Brokering (GitHub и Auth0)
Интеграция с GitHub
- Регистрация OAuth App в настройках GitHub Developer Settings.
- Настройка
Homepage URLиAuthorization callback URL(берется из Keycloak). - Копирование
Client IDиClient Secretв Keycloak Identity Provider.
Интеграция с Auth0
- Создание приложения в панели Auth0.
- Использование Discovery Endpoint в Keycloak для автоматической подгрузки URL (авторизация, токены, ключи).
Использование мапперов ролей
Чтобы пользователи из GitHub/Auth0 могли пользоваться вашим приложением, им нужно автоматически назначать роли.
- Используется Hardcoded Role Mapper: при входе через конкретного провайдера пользователю принудительно выдается роль (например,
event_app_user).
Межсервисное взаимодействие (M2M)
Сценарий: EventApp вызывает NotificationApp.
NotificationAppзащищен и требует рольinternal_access.EventAppдолжен получить технический токен в Keycloak (грантClient Credentials).- В Keycloak для клиента
event_appвключается опция Service Accounts Roles. - Клиенту
event_appназначается рольinternal_accessот клиентаnotification_app.
Заключение
Keycloak — это мощный инструмент, который:
- Решает вопросы безопасности “из коробки”.
- Легко интегрируется с современными фреймворками (Spring Boot).
- Позволяет гибко управлять доступом как для людей, так и для сервисов.