Keycloak: что это такое и как работает авторизация
Разработка собственной системы аутентификации и авторизации — это сотни человекочасов, потенциальные дыры в безопасности и бесконечное сопровождение кода. Но зачем изобретать велосипед, когда есть Keycloak? Рассказываем, как настроить готовое IAM-решение и забыть о проблемах доступа.

Что такое Keycloak
Keycloak — open-source решение для управления доступом (IAM), изначально созданное Red Hat. Проект развивается как открытое сообщество, а компания Red Hat предлагает коммерческую поддержку через Red Hat build of Keycloak. Он предназначен для управления доступом, обеспечивает безопасную аутентификацию и авторизацию в разных веб-приложениях и сервисах.
Система поддерживает стандарты OAuth 2.0, OpenID Connect и SAML 2.0, работает как отдельный сервер и подходит для программных продуктов с микросервисной архитектурой. Она облегчает задачу разработчикам, снимая с них необходимость самостоятельно реализовывать процессы регистрации пользователей, входа в приложения, хранения паролей и многое другое.
Некоторые возможности Keycloak:
Единый вход (Single Sign-On, SSO) — пользователю достаточно один раз пройти аутентификацию в системе, после чего он получит доступ ко всем подключенным приложениям без повторного ввода пароля.
Социальные логины — возможна авторизация через внешние сервисы и системы, такие, как Google, VK, GitHub и другие.
Централизованное управление пользователями — Keycloak позволяет создавать, удалять и редактировать учетные записи, управлять ролями и правами доступа.
Поддержка RBAC и расширенных сценариев авторизации — система позволяет назначать доступ на основе ролевой модели (RBAC), а также через настраиваемые политики и атрибуты с использованием встроенной Authorization Services (поддержка ABAC).
Интеграция с внешними каталогами — поддержка подключения к LDAP и Active Directory для синхронизации пользователей и работы с корпоративными учетными записями.
Управление политиками безопасности и пользовательскими сессиями — с помощью решения администраторы могут настраивать парольные политики, правила блокировки пользователей, время жизни токенов для аутентификации, правила принудительного выхода из приложения и другие параметры.
Keycloak подходит для облачных инфраструктур, использования в контейнерах и кластерах, включая Kubernetes-среды. Благодаря этому решение становится универсальным для разнообразных проектов — от маленьких до масштабных.
Почему Keycloak важен
Keycloak отвечает за аутентификацию и авторизацию, избавляет разработчиков от необходимости самостоятельно выстраивать систему проверки логинов и паролей для подтверждения личности пользователей. Достаточно подключить одно решение и получить все необходимое.
Keycloak подходит в качестве централизованной системы управления доступом в облачных инфраструктурах, которые сейчас используют многие компании. Решение помогает унифицировать процессы аутентификации, облегчает сопровождение приложений и снижает риски, связанные с ненадежным хранением учетных данных.
Keycloak помогает разделить ответственность. Система занимается проверкой данных пользователей и выдачей токенов, а приложениям остается только «чекнуть» права на основе этих токенов. Такой подход упрощает управление доступом и повышает безопасность.

Как работает Keycloak
Keycloak — самостоятельный сервис с собственной панелью управления, REST API, интеграциями и клиентами для распространенных фреймворков и языков программирования. Для понимания принципов работы представьте систему как единый пропускной пункт перед несколькими объектами, которыми выступают разные приложения. На этом пункте пользователь проходит проверку личности, после чего получает цифровой пропуск — токен. Приложения доверяют этому токену и предоставляет на его основе доступ с учетом назначенных пользователю прав.
В Keycloak есть единицы изоляции — реалмы, внутри которых хранятся пользователи, роли и настройки доступа для каждого клиента. Именно благодаря реалмам можно использовать одно решение для нескольких проектов. Объекты из одной единицы изоляции не пересекаются с объектами из другой, то есть пользователи, роли и настройки для каждого сервиса и приложения будут разными.
Архитектура KeycloakЧтобы было понятнее, кто такие пользователи, роли и клиенты, подробнее опишем каждую сущность:
Пользователи — учетные записи сервисов или людей. Когда происходит попытка входа в приложение под этими учетками, Keycloak сверяет указанные данные с сохраненными и при совпадении предоставляет токен доступа.
Роли — сущности, описывающие права доступа. Фактически это правила, которые определяет, что те или иные пользователи могут делать в системе. Они бывают realm-уровня и client-уровня. В первом случае роли действуют внутри конкретного реалма. Роли client-уровня относятся к определенному подключенному приложению. У одного пользователя может быть одна или несколько ролей. При авторизации проверяется их наличие в токене.
Клиенты — сервисы и приложения, которые делегируют Keycloak задачи по распознаванию пользователей, их ролей и прав доступа. Примеры клиентов: backend-сервисы, мобильные и веб-приложения. Все эти объекты регистрируются в реалмах и получают уникальные идентификаторы. Когда пользователь попытается войти, клиент перенаправит его на сервер Keycloak. После успешной проверки приложение примет токен пользователя и позволит совершать действия в соответствии с правами доступа.
В зависимости от типа клиента пользователи получают несколько видов токенов. Access token нужен для единоразового доступа к защищенным ресурсам, API или сервисам. Refresh token позволяет без повторного ввода учетных данных получить новый Access token, когда у предыдущего закончится срок действия. ID token содержит данные о личности пользователя и используется для подтверждения факта аутентификации.
Возможности Keycloak
Мы уже рассказывали об основных возможностях решения. Остановимся на двух самых востребованных.
SSO (единый вход)
SSO — механизм единого входа, когда пользователь проходит аутентификацию в одной системе и после этого может без ввода логина и пароля получить доступ к подключенным сервисам. В Keycloak он реализован на уровне реалма. Если пользователь успешно проходит аутентификацию в одном клиенте, сервер запускает сессию, которая хранится на стороне системы аутентификации. Когда пользователь открывает другой сервис, зарегистрированный в том же реалме, Keycloak проверяет наличие активной сессии. Если она есть, доступ будет предоставлен без повторного ввода пароля, поскольку пользователь уже считается аутентифицированным. При выходе из системы Keycloak помогает закрыть сессию сразу во всех подключенных приложениях.
SSO упрощает доступ к внутренним сервисам в корпоративной среде, улучшает пользовательский опыт, облегчает поддержку архитектуры с несколькими сервисами. Кроме того, такой подход снижает риски безопасности, связанные с собственными системами входа в каждом приложении.
Интеграция с разными протоколами
Keycloak поддерживает различные протоколы авторизации и аутентификации: OAuth 2.0, OpenID Connect, SAML 2.0, а также интеграцию с корпоративными каталогами через LDAP. Это стандарт для интеграции с большинством систем и сервисов. Например, OAuth 2.0 позволяет Keycloak выдавать Access token для входа в подключенные приложения. Также благодаря протоколу сервисы могут получать ограниченный доступ к пользовательским ресурсам, например, контактам или фотографиям.
OpenID Connect расширяет возможности OAuth 2.0 и добавляет слой аутентификации. Благодаря ему можно получать ID token с информацией о личности пользователя.
Поддержка протоколов позволяет интегрировать Keycloak с веб-приложениями, мобильными клиентами, одностраничными приложениями и бэкенд-сервисами. Эта возможность делает систему аутентификации незаменимой для классических и облачных корпоративных инфраструктур, микросервисных сред.
Установка и базовая настройка Keycloak
Keycloak можно запустить разными способами: через Docker-контейнер, из архива, в Kubernetes или в составе контейнерной платформы. Рассмотрим наиболее распространенные сценарии.
Проще всего запустить решение через Docker. Это делается с помощью официального образа quay.io/keycloak/keycloak. В процессе разработки применяется команда start-dev, в продакшн-окружениях — start. Минимальный запуск в разработке выглядит так:
После запуска административная консоль решения доступна по адресу http://localhost:8080. Входить нужно под учетной записью, которая указана в переменных окружения.
В продакшн окружении нужно подключить СУБД, создать базу данных и пользователя, запустить Keycloak в режиме start. Пример с использованием PostgreSQL:
Можно запустить решение из архива, который скачивается с официального сайта Keycloak. В Linux или macOS для запуска после распаковки применяется команда:
В Windows:
Для production-запуска start-dev заменяется на start.
Перед запуском в конфигурации нужно задать сетевые настройки и параметры базы данных. Это можно сделать через файл conf/keycloak.conf. Пример содержимого для PostgreSQL:
Первоначальная настройка системы
После установки и запуска Keycloak нужно создать реалм, зарегистрировать клиентов, добавить пользователей и настроить роли. Настройки можно выполнить через административную консоль или с помощью утилиты kcadm.sh.
Начинайте с создания реалма, который будет в пределах одного логического пространства изолировать клиентов, пользователей и их роли. Для администрирования сервера обычно используется реалм master, для систем — «рядовые» реалмы. Чтобы создать их через веб-интерфейс решения, выберите пункт Create Realm, укажите имя и примените изменения.
Реалм masterЧерез kcadm.sh реалм создается примерно так:
Затем нужно зарегистрировать клиента — сервис или приложение. В настройках Keycloak укажите идентификатор Client ID, тип протокола, redirect URI при необходимости.
Регистрация клиента через утилиту будет выглядеть подобным образом:
Настройка клиентовДля публичных клиентов используется параметр publicClient=true, для серверных приложений — client secret.
Затем следует задать роли реалма и роли клиентов. В первом случае алгоритм выглядит так:
Роль клиента создается так:
Затем следует добавить пользователей, которые будут храниться внутри реалма, иметь собственные учетные данные, атрибуты и роли. Как создать пользователя через kcadm.sh:
Пароль устанавливается так:
Затем пользователю назначается роль:
Настройка ролейИнтеграция в приложение
Перед интеграцией в административной консоли нужно создать клиента, с которым будет интегрироваться Keycloak. Что нужно указать:
Client ID — уникальный идентификатор приложения;
Client type — public или confidential (публичный или конфиденциальный клиент);
Redirect URI — адреса, на которые сервер может возвращать пользователя после входа.
Web origins — допустимые источники для CORS, если клиентом выступает браузерное приложение.
Для интеграции можно использовать библиотеки для конкретных приложений и официальные адаптеры. Для Java-приложений поддерживаются Spring Security и Jakarta EE. Для JavaScript можно использовать библиотеку keycloak.js.
Базовый сценарий для веб-приложения при интеграции с Keycloak будет таким:
Пользователь открывает защищенную страницу, приложение перенаправляет его на endpoint авторизации Keycloak.
Пользователь проходит аутентификацию, после чего Keycloak возвращает его Redirect URI с параметром code.
Приложение отправляет полученный код на token endpoint и получает Access token и ID token, проверяет их и создает собственную сессию. Проверка токена может выполняться с помощью публичного ключа реалма или через endpoint
Если интеграция выполняется в SPA или фронтенд-приложение, нужно настроить public-клиент. В таком случае client secret не применяется.
Инсталляции для продакшен
Подход к развертыванию Keycloak в продуктивной среде отличается от запуска в режиме разработки. В первую очередь нужно сделать акцент на безопасность. Проверенные практики:
Предусмотрите отдельную базу данных, поскольку встроенная dev-база не подходит для реальных нагрузок. Например, можно использовать облачное решение Evolution Managed PostgreSQL от Cloud.ru.
Используйте HTTPS и прокси, чтобы сервер был доступен только по защищенному протоколу. Следите за корректными настройками параметров, чтобы исключить ошибки редиректа и подмену адресов.
Отключите dev-режим и выполняйте запуск командой start, чтобы не было упрощения конфигурации.
Настройте парольные политики — назначьте требования к сложности, длине и срокам ротации паролей.
Ограничьте доступ к административной консоли и master-реалму для повседневной работы. Используйте для рутинных задач роли с минимально достаточными полномочиями.
Регулярно создавайте бэкапы БД и экспорт конфигурации реалмов, чтобы в случае сбоев и ошибок восстановить критически важные данные и настройки.
Предусмотрите интеграцию с системами мониторинга и сборов логов. Это позволит отслеживать ошибки аутентификации, попытки подбора паролей и проблемы с производительностью.
В продуктивной среде компрометация Keycloak означает компрометацию всей системы аутентификации. Рассматривайте решение как критичный компонент безопасности с высокими требованиями к обновлениям, изоляции проектов и контролю доступа.
Заключение
Keycloak позволяет построить централизованную систему аутентификации и авторизации для сервисов и приложений любого уровня сложности. Решение избавляет разработчиков от необходимости создавать собственные механизмы доступа в аккаунты, хранения учетных данных и управления ролями. Благодаря поддержке разных протоколов и единого входа SSO Keycloak легко интегрируется в микросервисные и облачные архитектуры. Главное — обеспечьте корректные настройки решения в продакшн-среде, чтобы соблюсти баланс удобства и безопасности.

