Создание ролевой модели
Начинать разработку ролевой модели в формате компонента «Авторизация Platform V IAM» следует с общего проектирования ролевой модели прикладного сервиса. Проектирование включает:
- исследование предметной области;
- анализ функций потенциальных пользователей;
- сбор требований сотрудников информационной безопасности;
- изучение особенностей аутентификации и авторизации Платформы, протоколов OIDC, OAuth 2.0.
В результате проектирования определяются:
- подходы, применяемые в прикладном приложении для разграничения доступа: RBAC, ABAC, их комбинация и т.д.;
- роли и группы пользователей: например, на основе должностей или набора функций;
- необходимость подключения внешнего поставщика учетных данных.
При разработке информационной системы, обрабатывающей внешние HTTP-запросы и, например, реализующей паттерн API Gateway Offloading, нужно определить, какие методы контроллеров будут:
- требовать только аутентификации (не рекомендуется);
- требовать определенного уровня авторизации (привилегии);
- не требовать аутентификации (публичный открытый API).
Каждый непубличный метод должен запрашивать у пользователя наличие определенной атомарной привилегии (минимальной единицы ролевой модели). На одну привилегию может ссылаться несколько методов. Также допустимо, чтобы один метод требовал наличие одной (ИЛИ)- или нескольких (И)-привилегий. Необходимо соблюдать баланс количества привилегий.
При использовании ЕСИА нужно зарегистрировать сервис в Минкомсвязи РФ, получить сертификаты безопасности и мнемонику (уникальный идентификатор сервиса в ЕСИА). Подробнее с процедурой регистрации организации в ЕСИА и получения сертификатов и мнемоники можно ознакомиться в документах:
- Регламент информационного взаимодействия Участников с Оператором ЕСИА и Оператором эксплуатации инфраструктуры электронного правительства;
- Руководство пользователя технологического портала ЕСИА.
Нужно определить, будут ли для задач авторизации ИП/ЮЛ использоваться группы ЕСИА и их типы: непубличный, публичный. Группы ЕСИА есть в токене: напрямую транслируются в роли IAM Keycloak. Наличие групп и их типов требует дополнительного обращения в Минкомсвязи РФ.
Ролевая модель компонента «Авторизация Platform V IAM» состоит из трех ключевых объектов:
- привилегия (action) — право пользователя на выполнение действия в информационной системе;
- роль (role) — логическая группировка привилегий;
- группа (group) — настройка правил сопоставления ролей и пользователей.
Ролевая модель описывается xml-документом с корневым тегом
<task>
. Внутри корневого элемента перечисляются объекты ролевой модели:- resource — ресурсы определяют и классифицируют доступные привилегии;
- role — роли;
- group — группы.
Структура xml-документа с ролевой моделью:
Раскрыть type=xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <task> <!-- Ресурсы --> <resource code=...> ... </resource> <resource code=...> ... </resource> <!-- Роли --> <role code=...> ... </role> <role code=...> ... </role> <!-- Группы --> <group code=...> ... </group> <group code=...> ... </group> </task>
При создании ролевой модели в коды объектов ролевой модели (привилегии, ресурсы, роли, группы) следует добавлять префикс с кодом тенанта:
<КОД_ТЕНАНТА_ИЗ_ПАСПОРТА_СТЕНДА>.<КОД>
.Рекомендуется следить за значением атрибута
subsystem
при описании ролевой модели прикладного сервиса/АС. Оно должно везде быть одинаковым, включая регистр.Создание xml-документа с ролевой моделью начинается с определения ресурсов (resource) и привилегий (action).
Ресурсы используются только для классификации и удобного отражения привилегий в интерфейсе администратора. Корневой ресурс может содержать в себе ресурс или привилегию. Некорневой ресурс может содержать только привилегию.
Атрибуты ресурса:
- code — код, в случае дочернего ресурса указывается в формате
<Код_родительского_ресурса>.<Код_дочернего_ресурса>
(разделитель «точка»); - name — наименование ресурса, отображаемое в интерфейсе администратора;
- subsystem — код информационной системы — владельца привилегии. Используется для классификации привилегий в интерфейсе администратора.
Атрибуты привилегии:
- code — код, указывается в формате
<Код_родительского_ресурса>.<Код_привилегии>
(разделитель «точка»); - name — наименование атрибута, отображаемое в интерфейсе администратора;
- category — категория пользователей, для которой применяется привилегия. Категории используются для классификации объектов ролевой модели в пользовательском интерфейсе. Допустимо указывать несколько категорий через запятую («,»). Рекомендуется придерживаться встроенного списка категорий:
CLIENT_FL/CLIENT_UL/ADMIN/SOTR
.
Для упрощения ролевой модели рекомендуется указывать только одну категорию —
CLIENT_FL
.Код корневого ресурса укажите с префиксом. Формат:
<КОД_ТЕНАНТА_ИЗ_ПАСПОРТА_СТЕНДА>.<КОД>
.Пример описания ресурсов:
Раскрыть type=xml<resource code="SUPER_SERVICE_AUTH" name="Супер сервис" subsystem="SUPER_SERVICE"> <resource code="SUPER_SERVICE_AUTH.Request" name="Заявки" subsystem="SUPER_SERVICE"> <action code="SUPER_SERVICE_AUTH.Request.View" name="Просмотр" category="CLIENT_FL"/> <action code="SUPER_SERVICE_AUTH.Request.Edit" name="Редактирование" category="CLIENT_FL"/> <action code="SUPER_SERVICE_AUTH.Request.Approve" name="Согласование" category="CLIENT_FL"/> </resource> </resource>
Роли (role) следует понимать в классическом определении ролей в RBAC. Внутри тега
role
задаются ссылки на привилегии через промежуточные теги permission
, action-ref
и channel-ref
.Атрибуты ролей:
- code — код;
- name — наименование роли, отображаемое в интерфейсе администратора;
- category — категория пользователей, для которой применяется роль. Допустимо указывать несколько категорий через разделитель «,» (запятая). Используется для классификации ролей в интерфейсе администратора. Рекомендуется использовать категорию
CLIENT_FL
. - subsystem — код информационной системы — владельца роли. Используется для классификации ролей в интерфейсе администратора.
Тег
action-ref
используется для ссылки на привилегию (action). Код привилегии задается в атрибуте code
.Тег
channel-ref
используется для ограничения применяемости привилегии внутри роли в срезе канала, через который поступил запрос в прикладной сервис. Код канала задается в атрибуте code
.Пример описания ролей:
Описание type=xml<role code="SUPER_SERVICE.EMPLOYEE" name="Сотрудник" subsystem="SUPER_SERVICE" category="CLIENT_FL"> <permission> <action-ref code="SUPER_SERVICE_AUTH.Request.View"/> <channel-ref code="web"/> </permission> <permission> <action-ref code="SUPER_SERVICE_AUTH.Request.Approve"/> <channel-ref code="web"/> </permission> </role> <role code="SUPER_SERVICE.USER" name="Заявитель" subsystem="SUPER_SERVICE" category="CLIENT_FL"> <permission> <action-ref code="SUPER_SERVICE_AUTH.Request.View"/> <channel-ref code="web"/> </permission> <permission> <action-ref code="SUPER_SERVICE_AUTH.Request.Edit"/> <channel-ref code="web"/> </permission> </role>
Для упрощения ролевой модели рекомендуется:
- указывать только одну категорию —
CLIENT_FL
и один канал —web
; - делать соответствие один к одному ролей компонента «Авторизация Platform V IAM» с запроектированными ролями/группами информационной системы.
Код роли следует указывать с префиксом:
<КОД_ТЕНАНТА_ИЗ_ПАСПОРТА_СТЕНДА>.<КОД>
.Группы задают правила сопоставления ролей с пользователем, выполняющим запрос в информационную систему, на основании характеристик (атрибутов) пользователя. Характеристиками пользователя могут быть:
- содержимое access-токена (JWT);
- данные от ЕСИА:
- персональные данные;
- признак активности учетной записи ЕСИА (требуется настройка IAM Keycloak);
- признак входа из-под организации (ИП/ЮЛ);
- вхождение в определенную группу ЕСИА в выбранной организации.
Внутри тега
group
задаются правила сопоставления (groupCondition) и привязка ролей (role-ref). Допускается указывать как несколько правил сопоставления, так и несколько ролей. Для успешного сопоставления необходимо выполнение всех условий.Атрибуты групп:
- code — код;
- name — наименование атрибута группы, отображаемое в интерфейсе администратора;
- category_code — категория пользователей, для которой применяется группа. Допустимо указывать несколько категорий через разделитель «,» (запятая). Используется для классификации группы в интерфейсе пользователя. Рекомендуется использовать категорию
CLIENT_FL
. - subsystem — код информационной системы — владельца роли. Используется для классификации ролей в интерфейсе администратора;
- enabled — признак доступности группы.
Назначение атрибутов группе пользователей выполняется через интерфейс панели администратора IAM Keycloak (см. раздел Назначение ролей внутренним пользователям).
Условия сопоставления (groupCondition) — описывают логическое выражение, успешное выполнение которого позволит сопоставить роли с пользователем. При описании условий сопоставления укажите:
- attr_name — название атрибута пользователя, значение которого будет являться левым операндом логического выражения. Вычисленное значение превращается в список строк, разделитель — «,». Для корректной работы убедитесь, что атрибут создан (объявлен) в компоненте «Авторизация Platform V IAM» (см. раздел Атрибуты);
- attr_value — целевое значение атрибута, правый операнд логического выражения. Превращается в список строк, разделитель — «,»;
- operation — оператор сравнения, применяется к спискам строк. Возможные операторы:
=
— левый операнд содержит все элементы правого;<>
— обратное от условия=
;IN
— существует одно или большее количество общих элементов;EXCLUDED
— нет общих элементов;CALCULATION
— не используется в прикладных сервисах.
- section_name — имя секции, в которой будет выполнен поиск значения атрибута (левого операнда). Допустимо указывать только значение
KEYCLOAK_DATA
.
Тег
role-ref
используется для ссылки на роль (role). Код роли задается в атрибуте code
.Пример описания групп:
Раскрыть type=xml<group code="SUPER_SERVICE.EMPLOYEE_GROUP" name="Сотрудник" category_code="CLIENT_FL" subsystem="SUPER_SERVICE" enabled="true"> <groupCondition attr_name="realm_access.roles.EMPLOYEE" operation="=" attr_value="true" section_name="KEYCLOAK_DATA"/> <role-ref role_code="SUPER_SERVICE.EMPLOYEE"/> </group> <group code="SUPER_SERVICE.USER_GROUP" name="Заявитель" category_code="CLIENT_FL" subsystem="SUPER_SERVICE" enabled="true"> <groupCondition attr_name="realm_access.roles.USER" operation="=" attr_value="true" section_name="KEYCLOAK_DATA"/> <role-ref role_code="SUPER_SERVICE.USER"/> </group>
Строка левого и правого операнда разбивается в список строк с разделителем «,» (запятая). Операция в логическом выражении будет применяться именно к спискам строк. Учитывайте это при описании правил сопоставления.
Для упрощения ролевой модели рекомендуется:
- указывать только одну категорию —
CLIENT_FL
; - делать соответствие один к одному группы и компонента «Авторизация Platform V IAM» с запроектированными ролями/группами прикладного сервиса/АС.
Код группы следует указывать с префиксом:
<КОД_ТЕНАНТА_ИЗ_ПАСПОРТА_СТЕНДА>.<КОД>
.Список примеров ниже не описывает все возможные случаи сопоставления, но позволяет понять принцип, по которому описываются выражения. Атрибуты пользователей могут быть дополнены исходя из прикладных задач:
-
при необходимости путем настройки IAM Keycloak можно добавить в JWT-токен дополнительную информацию о пользователе и сослаться на нее как на атрибут;
Полученный набор дополнительных данных зависит от сценария аутентификации. Часть данных из ЕСИА можно получить только в случае, если настроены необходимые исполнения и сопоставления. -
в зависимости от указанных scope ЕСИА объем данных, участвующих в сопоставлении, может отличаться.
Список текущих доступных атрибутов JWT-токена можно посмотреть, отправив аутентифицированный запрос
GET /jwt/?access=1
в IAM Proxy. Список доступных атрибутов ЕСИА можно получить, отправив запрос GET /auth/realms/{{REALM}}/protocol/openid-connect/userinfo
в IAM Keycloak на порт 8443. Доступные атрибуты будут перечислены в секции esia
.Обратите внимание, что в JWT и в ответе от ЕСИА данные описываются в формате JSON и могут содержать в себе списки и объекты. Чтобы сослаться на элемент массива или значение объекта, задайте путь в плоском виде:
- все промежуточные узлы укажите через символ «.» (точка);
- если в JWT значением является список, для проверки наличия элемента в списке задайте полный путь до элемента через «.» (точку). В качестве значения при этом будет указано
true
.
Пример type=xml{ "realm_access": { "roles": [ "EMPLOYEE", "USER" ] } "emplInfo": { "position": "Бухгалтер", "chief": false, "blocked": false } }
В плоском виде путь и значение будут выглядеть так:
realm_access.roles.EMPLOYEE = TRUE
;realm_access.roles.USER = TRUE
;emplInfo.position = Бухгалтер
;emplInfo.chief = FALSE
;emplInfo.blocked = FALSE
.
Пример заполнения условий групп:
Раскрыть type=xml<!-- Условие на основе роли IAM Keycloak --> <groupCondition attr_name="realm_access.roles.EMPLOYEE" operation="=" attr_value="true" section_name="KEYCLOAK_DATA"/> <!-- Условие для любого аутентифицированного пользователя --> <groupCondition attr_name="sub" operation="<>" attr_value="0" section_name="KEYCLOAK_DATA"/> <!-- Условие для конкретного логина пользователя --> <groupCondition attr_name="preferred_username" operation="=" attr_value="MY_AWESOME_LOGIN" section_name="KEYCLOAK_DATA"/> <!-- Примеры условий на основе данных IAM Keycloak --> <!-- Пользователь, аутентифицированный через ЕСИА (требуется доп. настройка IAM Keycloak) --> <groupCondition attr_name="esia_id" operation="<>" attr_value="0" section_name="KEYCLOAK_DATA"/> <!-- Пользователь с подтвержденной учетной записью ЕСИА (требуется доп. настройка IAM Keycloak) --> <groupCondition attr_name="trusted" operation="=" attr_value="0" section_name="KEYCLOAK_DATA"/> <!-- Пользователь - физическое лицо --> <groupCondition attr_name="organization" operation="=" attr_value="0" section_name="KEYCLOAK_DATA"/> <!-- Пользователь, аутентифицированный как организация (ИП/ЮЛ) --> <groupCondition attr_name="organization" operation="<>" attr_value="0" section_name="KEYCLOAK_DATA"/> <!-- Пользователь входит в группу ЕСИА выбранной организации (ИП/ЮЛ). Здесь SUPER_SERVICE - мнемоника, SUPER_SERVICE_ACOUNTING - код группы ЕСИА --> <groupCondition attr_name="roles.SUPER_SERVICE:SUPER_SERVICE_ACOUNTING" operation="=" attr_value="TRUE" section_name="KEYCLOAK_DATA"/>
Настройка trusted:

Увеличить
Настройка esia_id:

Увеличить
Атрибут — объект компонента «Авторизация Platform V IAM», описывающий список доступных значений поля
attr_name
в groupCondition
.Свойства атрибута:
- attributeName — название атрибута, должно совпадать с
attr_name
вgroupCondition
; - description — описание атрибута;
- sessionSectionName — имя секции, к которой относится атрибут. Допустимо указывать только значение
KEYCLOAK_DATA
.
Пример type=xml<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <dictionariesTask> <attribute attributeName="realm_access.roles.EMPLOYEE" description="Роль IAM Keycloak EMPLOYEE" sessionSectionName="KEYCLOAK_DATA"/> <attribute attributeName="realm_access.roles.USER" description="Роль IAM Keycloak USER" sessionSectionName="KEYCLOAK_DATA"/> </dictionariesTask>
Файл с атрибутами загружается в интерфейсе администратора компонента «Авторизация Platform V IAM» после нажатия кнопки «Импорт справочников».
В демопримерах реализованы стандартные сценарии, демонстрирующие работу отдельных сервисов Платформы ГосТех. Отправка тестовых запросов в демопримерах позволит вам ознакомиться с функциями того или иного сервиса. Доступные демопримеры и описания реализованной в них функциональности представлены ниже.
Авторизация
Авторизация в ЕСИА с использованием личной или предоставленной тестовой учётной записи
Проверка наличия прав
Проверка наличия у пользователя определённых прав по JWT токену