Внедрение Keycloak для управления доступами в Java-проекте | Блог Work Solutions
Эффективное управление доступом: делегируем безопасность приложения Keycloak
ГлавнаяБлогРазработчикамЭффективное управление доступом: делегируем безопасность приложения Keycloak
Разработчикам02 мая 2024

Эффективное управление доступом: делегируем безопасность приложения Keycloak

Фотография автора
Павел ГапоненкоBackend-разработчик

Безопасность учетных записей пользователей и управление доступом к ресурсам приложения — важные задачи при разработке ПО. Социальные сети, системы бронирования авиабилетов, корпоративные порталы предоставляют пользователям возможность получать доступ к личной информации через различные способы авторизации. Из-за роста количества цифровых угроз разработчикам нужно проектировать не только эффективные, но и удобные решения. Это нужно для хранения учетных данных и предоставления доступа к системам.

В статье расскажем про собственный сервис авторизации, а также почему это дорого и долго. Расскажем, как сторонний сервис авторизации способен сократить расходы на разработку, обеспечить надежную систему управления доступом. Также поговорим о том, что такое Keycloak и как его использовать. Покажем на реальном примере как использовали Keycloak для работы с учетными записями на Spring Framework. 

Проблема реализации собственных сервисов авторизации

Сколько раз разработчикам компании, которая занимается разработкой программного обеспечения, придется реализовывать функционал авторизации под каждый проект? Один, два или даже десять?

Вместо того, чтобы сфокусироваться на бизнес-логике приложения, постоянно появляется необходимость повторно разрабатывать функционал авторизации и управления доступом под каждую платформу. Это приводит к увеличению затрат на разработку приложений, настройку, обслуживание собственных систем авторизации.

Такие системы не ограничиваются простым хранением учетных данных и Basic-авторизацией (по логину и паролю). В реальных проектах сервису авторизации нужно иметь больше возможностей:

  • предоставлять разные методы аутентификации;
  • поддерживать технологии единого входа (SSO);
  • управлять токенами доступа;
  • иметь верификацию аккаунта;
  • менять пароль через почту;
  • управлять парольными политиками и др.

Во время создания сервиса авторизации под конкретный проект, приходится тратить больше времени на добавление в проект новых сотрудников. Это случается из-за того, что их нужно обучить работать с функционалом авторизации на конкретном проекте. 

Есть, конечно, проекты, для которых не подойдет ни одно «коробочное решение», так как они могут реализовывать свою специфичную логику. Однако, для большинства задач уже давно определены стандарты аутентификации, а также управления доступом.

Внедрение стороннего сервиса авторизации, а также управления доступом в разрабатываемое приложение решат проблему повторного входа в систему. Пример такого сервиса — Keycloak.

Что такое Keycloak

Keycloak — это популярный сервис идентификации, а также управления доступом с открытым исходным кодом. Его Github-репозиторий набрал 19500 звезд. Это гибкое, эффективное решение для создания защищенных информационных систем. 

После его внедрения мы можем делегировать ответственность за хранение пользователей, авторизацию, регистрацию, управление токенами доступа, управление паролями и другие функции сторонней системе. Такое разделение ответственности избавляет от постоянной реализации функционала аутентификации, а также авторизации. Дает возможность сосредоточиться на разработке бизнес-логики приложения и сократить расходы на разработку проекта.

Keycloak предлагает много возможностей, которые могут быть полезны вашему проекту. Цель статьи — знакомство читателя с технологией, а также демонстрация использования сервиса на реальном проекте. Для ознакомления с сервисом предлагаем рассмотреть некоторые из его особенностей.

Хранение данных

Keycloak позволяет указать хранилище, которое будет содержать всю нужную информацию о настройках системы, пользователях, их ролях и др. Иинтегрируется с реляционными базами данных:

  • MySQL
  • PostgreSQL
  • Oracle Database
  • Microsoft SQL Server

Мультитенантность

В Keycloak существует понятие Realm. Это изолированное пространство, в котором хранятся пользователи и клиенты. При использовании таких областей, один экземпляр системы может независимо управлять набором приложений нескольких организаций.

Создать новый Realm просто: в списке выбираем “Create realm”, вводим имя realm-а, затем сохраняем. В платформе управления доступом добавляется новое пространство.

Изображение статьи
Изображение статьи

Управление пользователями

Система обеспечивает единое хранение пользователей. Для этого предлагает удобный интерфейс взаимодействия с данными, а также гибкую систему атрибутов, которая позволяет добавлять разные поля для профиля, если набора стандартных полей недостаточно.

Изображение статьи
Пример страницы со списком пользователей
Изображение статьи
Пример страницы с информацией о пользователе

Поле Middle Name не входит в стандартный набор полей пользователя. Его добавили с помощью настроек в админ-панели.

Поддержка технологии единого входа (SSO)

Keycloak дает полноценную поддержку технологии  единого входа (Single Sign-On), обеспечивает безопасный, удобный способ входа пользователей в систему. С помощью SSO пользователи могут войти в систему один раз и автоматически получить доступ ко всем приложениям, интегрированным с сервисом, без повторной аутентификации.

Для организации SSO необходимо добавить все приложения в качестве клиентов. Сделать это можно в разделе управления клиентами – Clients.

Изображение статьи
Пример страницы управления клиентами

Для корректной работы SSO каждое приложение должно реализовывать аутентификацию в системе, используя поддерживаемый протокол, например, OIDC.

Парольные политики

Сервис авторизации Keycloak дает доступ к гибкой настройке парольных политик, чтобы обезопасить учетные записи.

Парольные политики — это ряд настроек. Позволяют определить требования к паролям для конкретного приложения. Сюда входят: 

  • минимальная длина пароля;
  • цифры;
  • буквы нижнего регистра;
  • буквы верхнего регистра;
  • время жизни пароля;
  • история паролей и другие.
Изображение статьи
Пример настройки парольных политик

Настройка сессий и токенов доступа

В любой системе авторизации есть работа с сессиями и токенами пользователей. Keycloak предлагает гибкую настройку разных параметров токенов, а также сессий:

  • время жизни Access-токена;
  • время жизни Refresh-токена;
  • максимальное количество повторений использования Refresh-токена;
  • время бездействия сессии;
  • максимальное время жизни сессии и другие параметры.

Администратор может настраивать данные параметры без необходимости менять исходный код приложения, что повышает гибкость настройки, разделяет зоны ответственности в проекте.

Изображение статьи
 Пример управления сессиями
Изображение статьи
Пример управления токенами

Keycloak предлагает также другие удобные настройки, которые делают его сильным, гибким инструментом для организации работы аутентификации и авторизации в приложениях.

Все, что мы рассказали ранее в этой статье — только теория для знакомства с продуктом. Но каким был опыт личного пользования Keycloak для работы с учетными записями пользователей?

Keycloak в разработке проекта на Java (Spring Framework)

Единая система управления доступом (ЕСУД) нужна для управления аккаунтами сотрудников, а также их правами доступа в разных информационных системах компании клиента.

Управлять аккаунтами сотрудников и их правами можно через функционал создания/блокировки/разблокировки аккаунта, выдачи/лишения прав доступа в рамках этих аккаунтов, сброса пароля.

У системы управления доступом тоже есть свои сотрудники, аккаунты которых нужно централизовано хранить, а также управлять ими. Учетные записи пользователей ЕСУД называются локальными. Для хранения, а также работы с локальными учетными записями клиент выбрал Keycloak. Это удобный, надежный способ управления пользователями и их доступом в системе. 

Задачи, о которых расскажем, связаны с организацией управления аккаунтами внутри самой системы. Не затрагивают напрямую бизнес-логику самого проекта.

Абстрактная схема проекта:

  Изображение статьи

В примере нас интересует приложение ЕСУД и работа с его аккаунтами.

Для работы над проектом сформировали команду из пяти backend-разработчиков. На проекте нужно было за ограниченный срок сделать функционал и выполнить поставленные задачи. Поэтому команде пришлось быстро разрабатывать функционал, и при этом держать планку его качества.

Архитектура проекта: как организовать SSO

Система состоит из микросервисов, число которых увеличивалось уже в ходе разработки. Поэтому стоял вопрос о том, чтобы реализовать технологию единого входа (Single Sign-On) для корректного сообщения между сервисами.

Решили использовать Keycloak для SSO. Плюсы от привлечения внешней платформы авторизации и правда заметны. Нужно было только зарегистрировать сервисы в качестве клиентов, затем настроить интеграцию в Spring Security конфигурации каждого приложения. Такой подход значительно сокращает время на разработку, дает возможность не отвлекаться от разработки важных бизнес-функций проекта.

Пример настроек приложения для интеграции с сервисом авторизации:

Изображение статьи

Проблема управления пользователями и настройками доступа

Keycloak предлагает удобный интерфейс для управления сервисом авторизации. Хотя на проекте использовалась относительно старая версия 7.0.0, сервис предоставлял достаточный функционал для управления клиентами, пользователями, токенами доступа, парольной политикой и др.

Проблема была в том, что администраторам ЕСУД для работы с аккаунтами и настройками доступа требовалось работать в админ-панели платформы авторизации напрямую. Но администраторам не нужен был доступ ко всем функциям системы. Им нужно совершать действия только над учетными записями. Например, создавать или блокировать, управлять некоторыми настройками токенов и парольными политиками.

Доступ к управлению клиентами, настройкам почтового сервера, темами для пользователей и другим функциям нужно было ограничить. В рамках разработки еще требовалось сделать инструменты по сбору событий пользователя: аутентификация, сброс пароля. События также должны отправляться во внешние системы.

Теперь решим задачи.

Ограничение управления настройками Keycloak

Для работы с локальными пользователями разработан сервис Identity Provider для взаимодействия с Keycloak через Java API. 

Сервис является посредником между основным приложением и Keycloak. Это дает возможность предоставить приложению те функции для работы с сервисом авторизации, которые описаны в требованиях.

Схема внедрения Identity Provider:

Изображение статьи

Взаимодействие с системой управления учетными записями реализуется с использованием библиотеки Keycloak Admin Client для языка Java. Библиотека есть также для других языков разработки, например, Python, Node.js или Ruby.

В ходе разработки Identity Provider включил в себя следующие функции управления учетными записями (УЗ):

  • создание УЗ;
  • блокировка УЗ;
  • разблокировка УЗ;
  • отправка email при разработке УЗ для установки нового пароля;
  • сброс пароля через email;
  • получение списка учетных записей.

Администратору также требовалось управлять набором настроек токенов и сессий, а также устанавливать парольные политики для учетных записей. 

Для этого с помощью Java API реализовали функции управления временем жизни токенов и сессий. Настроили параметры парольных политик: длину символов в пароле, число хранимых паролей, использование цифр, специальных символов или букв в пароле.

Теперь администратор работает с настройками, выполняет действия над аккаунтами, которые ему предоставляет приложение Identity Provider. Больше не нужно редактировать данные напрямую в системе авторизации.

Расширения для обработки событий Keycloak

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

Для того, чтобы сделать слушателей нужно реализовать интерфейсы специальной Java-библиотеки:

  • EventListenerProviderFactory
  • EventListenerProvider

Для сбора событий сделали специального слушателя, который собирал нужную информацию о пользователе и далее передавал в брокер очередей. 

Пример реализации слушателя событий:

Изображение статьи

Чтобы загрузить расширение, программу необходимо было упаковать в jar-архив, загрузить в директорию на сервер, где расположена система авторизации. Затем в админпанели в разделе Events нужно выбрать добавленное расширение.   

Так мы добавили функционал по сбору событий при помощи небольшого расширения.

Результат

С помощью внедрения внешнего сервиса авторизации на проекте была организована технология единого доступа (Single Sign-On) без нужды реализовывать собственный функционал авторизации. Это позволило управлять учетными записями системы в едином месте, а доступ получать во все микросервисы приложения.

Сервис помогал гибко настраивать время жизни сессий и токенов пользователей, работать с email-шаблонами для отправки писем подтверждения email или сброса пароля, управлять парольными политиками.

С предоставленным Java API удалось реализовать сервис взаимодействия с настройками Keycloak и пользователями для предоставления нужного функционала администраторам системы. Также получилось сделать специальные обработчики событий для расширения функций для решения задач клиента.

Заключение

Keycloak помог делегировать функционал, отвечающий за аутентификацию, авторизацию и работу с пользователями внешней системе. Это сократило время на разработку проекта. Не тратили ресурсы на внедрение логики аутентификации. Разработчики смогли сосредоточиться на бизнес-логике приложения и получили готовую систему авторизации с настройками и управляемым интерфейсом.

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

188
42

Другие статьи

Ко всем статьям
Фоновое изображение: четверть круга закрыват часть круга

Интересные статьи и кейсы
от Work Solutions

Нажимая кнопку «Подписаться», я даю согласие на обработку персональных данных

Спасибо за подписку!

Фоновое изображение: верхний полукруг