Создание ролевой модели

Начинать разработку ролевой модели в формате компонента «Авторизация 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="&lt;&gt;" 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="&lt;&gt;" 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="&lt;&gt;" 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 токену
Предыдущий раздел
1.13 Авторизация Platform V IAM
Следующий раздел
Импорт ролевой модели
Была ли страница полезной?