Управление настройками приложений OAuth2/OIDC#
Данный раздел описывает порядок управления настройками OAuth2/OIDC-клиентов в установленной системе.
Общая схема настройки#
В терминах OAuth2 и OpenID Connect сервис roox-sso выполняет роль Authorization Server и OpenID Provider. Он использует настройки клиентов, реалмов, scopes и claims при обработке OAuth2/OIDC-запросов.
Основные файлы настройки в установленной системе:
Файл |
Назначение |
|---|---|
|
Настройки OAuth2/OIDC-клиентов |
|
Настройки OpenID Connect, claims и discovery metadata |
|
Настройки реалмов и общие параметры OAuth2/OIDC |
|
Список подключаемых файлов настроек и порядок их применения |
Если один и тот же параметр указан в нескольких подключенных файлах, сервис roox-sso применяет значение из файла с большим приоритетом, согласно /usr/share/tomcat/config.xml. Перед изменением следует проверить, не переопределен ли параметр в другом файле.
После изменения настроек необходимо
Перезапустить сервис командой:
sudo systemctl restart roox-sso
Проверить запуск сервиса по журналу:
/var/log/roox-sso/roox-sso.log
Формат ключей OAuth2/OIDC-клиентов#
Настройки клиента задаются в файле /usr/share/tomcat/clients.properties ключами вида:
com.rooxteam.sso.<realm>.oauth2.sp.<clientId>.<parameter>=<value>
Где:
<realm>— реалм, напримерemployeeилиcustomer;<{clientId>— идентификатор OAuth2/OIDC-клиента;<parameter>— параметр клиента.
Для списковых параметров значения перечисляются через запятую без пробелов:
com.rooxteam.sso.employee.oauth2.sp.my_client.defaultScopes=openid,profile,email
com.rooxteam.sso.employee.oauth2.sp.my_client.redirectionURIs=https://app.example.org/callback,https://app.example.org/alt-callback
Типовые операции администратора#
В этом подразделе приведены действия администратора. Подробные форматы и допустимые значения параметров описаны в подразделе Справочник параметров.
Изменение redirect URI клиента#
Для изменения redirect URI клиента необходимо:
Найти клиента в файле
/usr/share/tomcat/clients.propertiesпоclientId.Изменить параметр
redirectionURIs.Если клиент вызывает endpoints
roox-ssoиз браузера черезfetch/XHRи для этих запросов требуется CORS, проверить такжеagentOrigins.Перезапустить сервис
roox-sso.Проверить авторизацию через клиента.
Пример:
com.rooxteam.sso.employee.oauth2.sp.my_client.redirectionURIs=https://app.example.org/callback,https://app.example.org/alt-callback
com.rooxteam.sso.employee.oauth2.sp.my_client.agentOrigins=https://app.example.org
Изменение client secret#
Для изменения client secret необходимо:
Согласовать новый
client_secretс владельцем клиента.В файле
/usr/share/tomcat/clients.propertiesизменитьuserpasswordу нужногоclientId.Обновить секрет на стороне клиента.
Перезапустить сервис
roox-sso.Проверить авторизацию или получение токена.
Пример:
com.rooxteam.sso.employee.oauth2.sp.my_client.userpassword={argon2}$argon2id$...
Изменение набора scopes и claims для клиента#
Для изменения набора scopes и claims для клиента необходимо:
Найти клиента в файле
/usr/share/tomcat/clients.properties.Изменить список
defaultScopes, если нужно изменить scopes, выдаваемые клиенту без явногоscopeв запросе.Изменить список
scopes, если нужно изменить scopes, которые клиент может запросить явно.Для сервисного клиента добавить или изменить
clientClaims, если нужны фиксированные claims в access token, выдаваемых поclient_credentials, или во внутренних служебных access token.Перезапустить сервис
roox-sso.Проверить состав токена или ответ
userinfo.
Пример:
com.rooxteam.sso.employee.oauth2.sp.my_client.defaultScopes=openid,profile,email
com.rooxteam.sso.employee.oauth2.sp.my_client.scopes=openid,profile,email,roles
com.rooxteam.sso.employee.oauth2.sp.my_client.clientClaims=organization_id=<organization-id>
Изменение маппинга атрибутов профиля UIDM на claims#
Для изменения маппинга атрибутов профиля UIDM на claims необходимо:
Найти claim в файле
/usr/share/tomcat/oidc.properties.Изменить
property, если claim должен брать значение из другого атрибута профиля UIDM.При необходимости изменить
scope, если claim должен выдаваться для другого набора scopes.Перезапустить сервис
roox-sso.Проверить выдачу claim через
id_tokenилиuserinfo.
Пример:
com.rooxteam.sso.claims.email=scope=openid profile email,property=contactEmail,source=identity
Справочник путей к конфигурационным файлам#
Файл настройки на VM |
Назначение |
Ответственный сервис |
Действие после изменения |
|---|---|---|---|
|
Настройки OAuth2/OIDC-клиентов |
|
Перезапуск |
|
Настройки OpenID Connect, claims и discovery metadata |
|
Перезапуск |
|
Настройки реалмов и общие параметры OAuth2/OIDC |
|
Перезапуск |
|
Список подключаемых файлов настроек и порядок их применения |
|
Перезапуск |
Справочник параметров#
В колонке Значение по умолчанию указано значение, которое используется, если параметр не задан в конфигурации. Значение нет означает, что встроенного значения по умолчанию нет.
Параметры OAuth2/OIDC-клиента#
Параметр |
Значение по умолчанию |
Пример |
Описание |
|---|---|---|---|
|
|
|
Включает клиента. Допустимые значения: |
|
|
|
Тип клиента OAuth 2.0. Допустимые значения см. в подразделе Тип клиента |
|
нет |
|
Хранимое значение |
|
нет |
|
Grant types, разрешенные клиенту. Связано с OAuth 2.0 |
|
пустой список |
|
Зарегистрированные |
|
пустой список |
|
Разрешенные origins для CORS-запросов к сервису |
|
пустой список |
|
Scopes, выдаваемые клиенту по умолчанию. Связь со |
|
пустой список |
|
Scopes, которые клиент может запросить явно |
|
пустой список |
|
client_attrebutes в формате |
|
пустой список |
|
Роли клиента. Объединяются с ролями из |
|
пустой список |
|
Фиксированные claims сервисного клиента. Формат см. в подразделе client_claims |
|
пустой список |
|
Значения audience
( |
|
|
|
Требует PKCE для клиента.
Допустимые значения: |
|
|
|
Включает отправку уведомлений о событиях, связанных с клиентом. Подробности см. в подразделе client_event_notifications |
|
|
|
Время жизни access token в секундах. Порядок выбора значения см. в подразделе tokens_TTL |
|
|
|
Время жизни refresh token в секундах |
|
|
|
Время жизни authorization code в секундах |
Тип клиента#
Параметр clientType задает тип клиента в терминах OAuth 2.0 Client Types.
Значение |
Описание |
|---|---|
|
Confidential client: клиент способен сохранять конфиденциальность своих credentials,
например серверное приложение с ограниченным доступом к |
|
Public client: клиент не способен сохранять конфиденциальность credentials, например приложение, выполняющееся на устройстве пользователя или в браузере |
Если значение не задано, используется CONFIDENTIAL. Значение CONFIDENTIAL проверяется без учета регистра. Любое другое значение обрабатывается как PUBLIC, поэтому в настройках необходимо использовать только явные значения CONFIDENTIAL или PUBLIC.
Форматы client secret#
Параметр userpassword хранит секрет OAuth2/OIDC-клиента. Значение может быть задано в формате:
{scheme}<encoded-secret>
Если префикс {scheme} отсутствует, значение обрабатывается как plaintext.
Для проверки client_secret используется механизм проверки секретов системных приложений. В нем поддерживаются следующие схемы:
Схема |
Пример |
Комментарий |
|---|---|---|
|
|
Рекомендуемый вариант для новых секретов. Пример команды см. в приложении Приложение A. Генерация хэша client secret |
|
|
Поддерживаемый хэшированный формат. Пример команды см. в приложении Приложение A. Генерация хэша client secret |
|
|
Поддерживаемый хэшированный формат для системных приложений. Пример команды см. в приложении Приложение A. Генерация хэша client secret |
|
|
Совместимый формат; используется только при необходимости совместимости |
|
|
Legacy-формат; не используется для новых секретов |
|
|
Совместимый обратимый формат; используется только если это принято в конкретной поставке |
|
|
Технически поддерживается, но не рекомендуется, так как хранит секрет в открытом виде |
Схемы, предназначенные для состояний пользовательского пароля, например resetrequired или password_authn_prohibited, не следует использовать для client_secret: клиент не сможет пройти аутентификацию. Если указана неизвестная схема, клиент также не сможет пройти аутентификацию.
Grant types#
Параметр grantTypes задает список grant types, которые разрешены клиенту. В терминах OAuth 2.0 grant type определяет способ получения токена. Как metadata-параметр клиента список grant types описан в RFC 7591, Section 2 <https://www.rfc-editor.org/rfc/rfc7591#section-2>`_.
Если grantTypes не задан, сервис roox-sso не выполняет явную проверку grant type для клиента. Такое поведение сложнее контролировать и диагностировать, поэтому для эксплуатационных конфигураций рекомендуется всегда задавать grantTypes явно.
Реализация сервиса roox-sso поддерживает следующие значения для token endpoint:
Сценарий |
Значение |
Стандарт |
|---|---|---|
Authorization Code |
|
|
Refresh Token |
|
|
Client Credentials |
|
|
Token Exchange |
|
|
M2M (ПУИД) |
|
Расширение ПУИД |
M2M Authorization Code (ПУИД) |
|
Расширение ПУИД |
M2M Flow (ПУИД) |
|
Расширение ПУИД |
M2M grant types — расширение ПУИД. Их используют сценарии, где клиентское приложение реализует собственный UX аутентификации и передает параметры процесса на token endpoint, вместо перенаправления пользователя на authorization endpoint.
Redirect URI#
В redirectionURIs необходимо указать все допустимые callback URI клиента. В терминах OAuth 2.0 это redirection endpoint URI. Сервис roox-sso принимает redirect_uri из OAuth2/OIDC-запроса, если он совпадает с одним из значений списка после нормализации URI.
При проверке:
учитываются путь, query-параметры и нестандартный порт;
фрагмент URI (
#...) запрещен;регистр схемы и имени хоста не учитывается;
стандартные порты
80для HTTP и443для HTTPS нормализуются.
Agent origins#
Параметр agentOrigins используется при CORS-проверках для запросов, которые браузер отправляет напрямую на endpoints сервиса roox-sso с HTTP-заголовком Origin. Это актуально для SPA/PWA и других клиентов, которые вызывают сервис roox-sso из браузера через fetch/XHR.
Для обычного OAuth2/OIDC redirect-сценария, где браузер переходит на authorization endpoint через навигацию страницы, agentOrigins сам по себе не требуется: такой переход не является CORS-запросом.
Сервис roox-sso разрешает CORS-запрос, если Origin совпадает с одним из значений agentOrigins хотя бы у одного OAuth2/OIDC-клиента включенного реалма. При сравнении origin нормализуется: если порт не указан, для HTTP используется 80, для HTTPS — 443; сравнение выполняется без учета регистра.
Пример:
com.rooxteam.sso.employee.oauth2.sp.my_spa_client.agentOrigins=https://app.example.org
Scopes клиента
Параметры defaultScopes и scopes работают совместно. Для OAuth 2.0 параметр scope определен в RFC 6749, Section 3.3, а стандартные OIDC scope values для запроса claims описаны в OpenID Connect Core, Section 5.4.
если запрос не содержит
scope, сервисroox-ssoиспользуетdefaultScopes;если запрос содержит
scope, сервисroox-ssoберет пересечение запрошенных scopes со спискомscopesи дополнительно добавляетdefaultScopes;если
defaultScopesсодержит claim или scope, он будет добавлен в результирующий набор даже при явномscopeв запросе.
Рекомендуется использовать defaultScopes для обязательного набора scopes клиента, а scopes — для набора scopes, которые клиент может запросить дополнительно.
Атрибуты клиента
Параметр sunIdentityServerDeviceKeyValue хранит дополнительные атрибуты клиента в формате key=value.
Типичные атрибуты:
Атрибут |
Назначение |
|---|---|
|
Роль клиента. Роли из |
|
BSS-префикс клиента. Может использоваться серверными интеграциями при проверке Basic Auth и внутренних служебных токенов |
Пример:
com.rooxteam.sso.employee.oauth2.sp.my_client.sunIdentityServerDeviceKeyValue=ROLE=ROLE_PROVISION,bss=bis_
com.rooxteam.sso.employee.oauth2.sp.my_client.roles=ROLE_SYSTEM
Для новых ролей можно использовать отдельный параметр roles, но ROLE=... в sunIdentityServerDeviceKeyValue продолжает учитываться существующими проверками и интеграциями. Поэтому при изменении уже настроенного клиента не следует удалять sunIdentityServerDeviceKeyValue, если неизвестно, какие компоненты используют его атрибуты.
Client claims
Параметр clientClaims добавляет фиксированные claims для сервисного клиента. Он применяется при выпуске access token по client_credentials и при создании внутренних служебных access token через механизм self-authentication ПУИД.
Внутренний служебный токен в этом контексте — это токен, который сервис roox-sso создает для обращения одного серверного компонента продукта к другому от имени настроенного клиента. Это не отдельный OAuth2 grant type и не синоним любого токена, полученного по client_credentials.
Формат элемента:
claim=value
Несколько claims перечисляются через запятую:
com.rooxteam.sso.employee.oauth2.sp.my_client.clientClaims=organization_id=12345,system=true
Если элемент не содержит =, он игнорируется.
Уведомления о событиях клиента
Параметр enableEventNotifications включает отправку пользователю уведомлений о событиях, связанных с данным клиентом, например об успешном входе в приложение.
Если значение false, события с этим clientId не отправляются через механизм уведомлений. Описание механизма уведомлений и его настройка выходят за рамки данного раздела.
TTL токенов
Для authorization_code, access_token и refresh_token поддерживается настройка времени жизни в секундах. Самое точное значение имеет приоритет над более общими значениями.
Порядок выбора:
com.rooxteam.sso.{realm}.oauth2.sp.{clientId}.<token>.ttl
com.rooxteam.sso.{realm}.oauth2.sp.<token>.ttl
com.rooxteam.sso.oauth2.sp.<token>.ttl
com.rooxteam.sso.{realm}.oauth2.idp.<token>.ttl
com.rooxteam.sso.oauth2.idp.<token>.ttl
встроенное значение по умолчанию
Где <token> — authorization_code, access_token или refresh_token.
Встроенные значения по умолчанию:
Token |
Значение |
|---|---|
|
|
|
|
|
|
OIDC-параметры#
Параметр |
Значение по умолчанию |
Пример |
Описание |
|---|---|---|---|
|
|
|
Дополнительные claims, которые нужно включать в |
|
нет |
|
Claims, которые разрешено отдавать через |
|
нет |
|
Маппинг внешнего claim на атрибут профиля UIDM. Стандартные claims описаны в OpenID Connect Core, Section 5.1. Формат см. в разделе Mapping_claims |
|
нет |
|
Список claims, публикуемый в OIDC discovery metadata. См. OpenID Connect Discovery, Section 3 |
|
нет |
|
Список scopes, публикуемый в OIDC discovery metadata. См. OpenID Connect Discovery, Section 3 |
|
нет |
|
Методы аутентификации клиентов, публикуемые для реалма в OIDC discovery metadata. См. OpenID Connect Discovery, Section 3 |
Claims в ID Token
Параметр com.rooxteam.sso.id_token.claims задает имена claims, которые сервис roox-sso должен добавить в id_token сверх обязательного состава ID Token (iss, sub, aud, exp, iat и др.).
Чтобы claim появился в id_token, недостаточно добавить его имя только в com.rooxteam.sso.id_token.claims: этот claim также должен быть сформирован для токена. Для пользовательских claims необходимо проверить маппинг com.rooxteam.sso.claims.{claim} и scopes клиента; для фиксированных claims сервисного клиента — clientClaims.
Маппинг claims
Маппинг claims задается в файле /usr/share/tomcat/oidc.properties параметрами вида:
com.rooxteam.sso.claims.{claim}=scope=<scopes>,property=<uidm-attribute>,source=identity
Формат значения:
Элемент |
Описание |
|---|---|
|
Scopes, при наличии которых claim может быть выдан. Scopes внутри значения разделяются пробелами |
|
Атрибут профиля пользователя UIDM, из которого берется значение claim |
|
Источник значения claim — профиль пользователя |
Проверка после изменения#
Проверка получения токена системным клиентом#
Для проверки получения токена системным клиентом необходимо выполнить команду:
curl -X POST https://<sso-host>/sso/realms/<realm>/as/oauth2/idp/access_token \
-d "grant_type=client_credentials" \
-d "client_id=<clientId>" \
-d "client_secret=<secret>"
Проверка сведений о токене
-------------------------------
Для проверки сведений о токене необходимо выполнить команду:
curl -X POST https://<sso-host>/sso/realms/<realm>/as/oauth2/idp/tokeninfo \
-d "access_token=<access_token>"
Проверка OIDC discovery#
Для проверки OIDC discovery необходимо выполнить команду:
curl https://<sso-host>/sso/realms/<realm>/as/oauth2/idp/.well-known/openid-configuration
Актуальные пути OAuth2/OIDC endpoints:
Endpoint |
Метод |
Путь |
|---|---|---|
Получение токена |
|
|
Авторизация пользователя |
|
|
Отзыв токена |
|
|
Проверка токена |
|
|
Информация о пользователе |
|
|
Публичные ключи |
|
|
Приложение A. Генерация хэша client secret#
Команды ниже выводят готовое значение для параметра userpassword вместе с префиксом схемы. Не следует передавать секрет прямо в аргументах команды: так он может попасть в историю shell или список процессов. Рекомендуется использовать интерактивный ввод или переменные окружения с последующей очисткой.
Примеры используют параметры по умолчанию ПУИД:
Схема |
Параметры по умолчанию |
|---|---|
|
Argon2id, |
|
Cost |
|
|
Если в поставке изменены параметры com.rooxteam.sso.argon2.*, com.rooxteam.sso.bcrypt.strength или com.rooxteam.sso.pbkdf2.*, следует использовать значения конкретной среды.
Argon2#
Требуется CLI-утилита argon2.
read -rsp 'client_secret: ' CLIENT_SECRET; echo
SALT="$(openssl rand -base64 12)"
HASH="$(printf '%s' "$CLIENT_SECRET" | argon2 "$SALT" -id -t 2 -k 19456 -p 1 -l 32 -e)"
printf '{argon2}%s\n' "$HASH"
unset CLIENT_SECRET
Если версия argon2 не поддерживает параметр -k, рекомендуется использовать параметр памяти, доступный в имеющейся версии утилиты. Итоговая строка Argon2 содержит параметры хэширования внутри значения $argon2id$....
bcrypt#
Требуется утилита htpasswd из пакета apache2-utils или httpd-tools.
read -rsp 'client_secret: ' CLIENT_SECRET; echo
HASH="$(printf '%s\n' "$CLIENT_SECRET" | htpasswd -niB -C 10 client | cut -d: -f2)"
printf '{bcrypt}%s\n' "$HASH"
unset CLIENT_SECRET
htpasswd может вывести bcrypt-хэш с префиксом $2y$, $2a$ или $2b$; эти варианты принимаются при проверке секрета.
PBKDF2#
Требуется python3 из стандартной поставки Linux-дистрибутива. Команда формирует формат, который ожидает ПУИД: шестнадцатеричное представление salt || derived_key с префиксом {pbkdf2}.
python3 - <<'PY'
import getpass
import hashlib
import os
secret = getpass.getpass('client_secret: ').encode('utf-8')
salt = os.urandom(16)
derived_key = hashlib.pbkdf2_hmac('sha256', secret, salt, 1, dklen=32)
print('{pbkdf2}' + (salt + derived_key).hex())
PY
Если в среде задан непустой pepper или изменены iterations/ algorithm, необходимо адаптировать команду под значения com.rooxteam.sso.pbkdf2.pepper, com.rooxteam.sso.pbkdf2.iterations и com.rooxteam.sso.pbkdf2.algorithm.
Особенности Платформы Astra Cloud#
Этот подраздел содержит настройки, характерные для Платформы Astra Cloud.
Настроенные клиенты проекта#
Ниже перечислены OAuth2/OIDC-клиенты из файла /usr/share/tomcat/clients.properties для реалма employee.
Client ID |
Тип |
Grant types |
Назначение |
|---|---|---|---|
|
|
не задано явно |
Сервисный клиент provisioning-сценариев |
|
|
|
Клиент административной панели ПУИД |
|
|
|
Backend-клиент административной панели и системных операций |
|
|
|
Сервисный клиент синхронизации |
|
|
|
Сервисный клиент для межсервисной авторизации в реалме |
|
|
|
Клиент личного кабинета самообслуживания сотрудников |
|
|
|
OIDC-интеграция с биллинговым менеджером AIC |
|
|
|
OIDC-интеграция с Astra Monitoring |
|
|
|
OIDC-интеграция с сервисом Brest |
|
|
|
Серверный клиент APOS |
|
|
|
Браузерный клиент APOS |
|
|
|
Сервисный клиент IaaS |
|
|
|
OIDC-интеграция Grafana |
Проектный маппинг claims#
Claim |
Атрибут профиля UIDM |
Scopes |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Проектные OIDC-настройки#
Состав id_token:
com.rooxteam.sso.id_token.claims=preferred_username,roles,sn,givenname,exp,iat,sub,middleName,displayName,email
Whitelist для userinfo:
com.rooxteam.uidm.userinfo.claims_whitelist=address,phone,openid,profile,email,displayName
Для добавления нового клиента в Платформу Astra Cloud необходимо использовать структуру ключей из раздела Формат ключей OAuth2/OIDC-клиентов, задать необходимые grant types, redirect URI, scopes и секрет, затем перезапустить сервис roox-sso.