Настройка проксирования

Аутентифицированный доступ пользователей и приложений к прикладным сервисам обеспечивает IAM Proxy. Чтобы подключить прикладное приложение к сервису аутентификации, его нужно добавить в конфигураторе Pacman и настроить правила проксирования на IAM Proxy. Инструкции по подключению и возможным настройкам приведены в этом разделе.

Подключение приложения к сервису аутентификации

Для подключения приложения:
  1. Откройте приложение конфигуратора: зайдите в Звездное небо (общее меню при входе на Платформу) и выберите пункт «Configurator».
  2. В навигационном меню слева выберите пункт «Артефакты».
  3. В открывшейся таблице выберите строку «Управление маршрутами прокси-сервера (Route Discovery Service)».

    Увеличить

    Если доступно несколько версий, выберите последнюю. В результате отобразятся все настройки проксирования, доступные в меню IAM. Настройки представляют собой узлы проксирования (junctionPoint). Каждый добавленный junctionPoint отображается в виде отдельного узла дерева в списке.
  4. Чтобы добавить новое прикладное приложение, добавьте новый узел дерева нажатием пиктограммы «+».

    Увеличить

  5. Укажите параметры подключаемого приложения.

    Увеличить

    ПараметрОписание, возможные значения
    Group
    Техническое название приложения
    junctionName
    Имя прикладного приложения, которое будет отображаться в Звездном небе
    junctionPoint
    Корневой контекст запросов, по которому будет определяться принадлежность запроса к конкретной подсистеме Backend
    serverAddresses
    IP-адрес или DNS-имя прикладного приложения с указанием порта. Для добавления узла нажмите «+».
    Если для IAM Keycloak задано пользовательское DNS-имя, то необходимо создать администраторам заявку на донастройку Ufs-provider в части поддержки имен
    applyJctRequestFilter
    Фильтр к запросам junction. Укажите требуемый фильтр или несколько фильтров через запятую.
    Фильтры и их функции:
    - common/rds-ssl-sni-on.server.conf — разрешение передачи имени сервера по SNI. FDQN — имя сервера, обязательно задается в proxy_ssl_name;
    - common/oidc-unauth-access.location.conf — отключение аутентификации/авторизации на ответвлении;
    - common/rds-set-header-host-tobackend.location.conf — переопределение заголовка Host в сторону Backend;
    - common/rds-auth-in-esia.location.conf — автоматический выбор поставщика аутентификации с именем esia при аутентификации на IAM Keycloak;
    - common/rds-large-upload.location.conf — настройка параметров для загрузки больших файлов (до 8 ГБ) для Backend
    authorizeByRoleTemplate
    Роль пользователя из JWT-токена (опционально). Если роль заполнена, IAM Proxy обеспечит доступ только тем пользователям приложения, у которых в JWT-токене есть указанная роль
    https
    Протокол, используемый на сервере прикладного приложения (HTTPS/SSL)
    indexUrl
    Адрес Backend для основного входа в UI приложения. Указывается относительно корня
    sslCommonName
    Шаблон/значение имени из CN сертификата Backend-серверов. Поставьте *, чтобы отключить проверку
    transparent
    Прозрачность URL. Задайте значение true
  6. Сохраните настройки. Для этого в верхней части таблицы нажмите «Сохранить все» → «Play».

    Увеличить

Перейдите в Звездное небо, новый пункт появится в списке приложений.

Вход без аутентификации (анонимный доступ)

Этот вид доступа подразумевает, что при проксировании запросов от аутентифицированного пользователя JWT-токен не прокидывается в прикладной сервис.
Чтобы добавить анонимный доступ, укажите в параметре «applyJctRequestFilter» (см. в таблице выше) прикладного приложения фильтр common/oidc-unauth-access.location.conf.
При проксировании с анонимным доступом необходимо учитывать, чтобы все данные на эндпойнте тоже должны позволять доступ без аутентификации.

Доступ по https

Этот вид доступа определяет способ взаимодействия IAM Proxy с прикладными сервисами. Если прикладной сервис работает по https, выполняется проверка сертификатов.
Чтобы настроить доступ по https:
  • убедитесь, что в параметре «https» (см. в таблице выше) прикладного приложения установлено значение true;
  • укажите в параметре «applyJctRequestFilter» (см. в таблице выше) прикладного приложения фильтр common/rds-ssl-sni-on.server.conf.

Проксирование от корня

Если для прикладного приложения настроено проксирование от корня, после аутентификации пользователь сразу попадает в это приложение, минуя Звездное небо.
Для настройки создайте администраторам заявку на проксирование приложения от корня. В заявке укажите нужное приложение и его ingress. Ingress указан в Kubernetes в разделе «Service» → «Ingresses». Если ingress не указан, создайте заявку на настройку прикладного приложения в Kubernetes.
Этот способ проксирования предполагает ручную настройку конфигураций администраторами и накладывает ограничение на дальнейшее управление настройками узла в конфигураторе Pacman.

Настройка back-to-back аутентификации

Back-to-back (M2M, Client Credentials Flow) — термины, обозначающие процесс обмена данными между несколькими приложениями. Этот процесс предусмотрен для случаев, когда вместо пользователя нужно аутентифицировать другое приложение.
Преимущества:
  • использование стандартного заголовка Authorization;
  • нет необходимости анализировать ответы прикладных запросов на наличие заголовков Set-Cookie.
Недостатки:
  • необходимо следить за временем жизни access JWT-токена и по необходимости его обновлять с использованием refresh JWT-токена;
  • в случае истечения времени жизни refresh JWT-токена необходимо пройти повторную аутентификацию;
  • требуется настройка IAM Keycloak и IAM Proxy.
Основные шаги:
  • прикладной администратор настраивает нового клиента и учетную запись внешнего сервиса в IAM Keycloak, передает учетные данные внешнему администратору;
  • прикладной администратор создает задачу в поддержку на конфигурирование IAM Proxy для авторизации по JWT-токену;
  • платформенный администратор по заявке конфигурирует IAM Proxy;
  • прикладной администратор через конфигуратор IAM Proxy добавляет возможность авторизации по JWT-токену по необходимым junction;
  • внешний сервис аутентифицируется на платформе, получая в ответ access и refresh JWT-токены;
  • запросы в сторону прикладного сервиса должны выполняться с использованием access JWT-токен.
Для настройки back-to-back аутентификации:
  1. Откройте панель администратора IAM Keycloak.
  2. Создайте в нужном реалме (Realm) Keycloak клиента с именем «m2m» (Client ID). Задайте настройки клиента:
    • Access Type — «confidential»;
    • Standard Flow Enabled — в положение «OFF»;
    • Service Accounts Enabled — в положение «ON».

    Увеличить

  3. При использовании технологии Service Account назначьте необходимые роли на вкладке «Roles». В этом случае нет необходимости создавать техническую учетную запись. Для аутентификации достаточно использовать идентификатор клиента и его секрет.
    В зависимости от принятых архитектурных решений допускается не включать опцию «Service account». В этом случае необходимо создать техническую учетную запись (ТУЗ), назначить ей необходимые роли и включить опцию «Direct Access Grants» в настройках клиента Realm. Для аутентификации потребуется указывать идентификатор клиента, его секрет, а также имя пользователя и пароль ТУЗ.
    При использовании ТУЗ «Тип доступа» клиента Realm допустимо устанавливать в режим public. В этом случае для аутентификации понадобится указывать идентификатор клиента, имя пользователя и пароль ТУЗ.
    В некоторых случаях передача пароля от ТУЗ недопустима. В этом случае необходимо временно включить опцию «Direct Access Grants», выпустить offline JWT-токен и отключить опцию «Direct Access Grants». В этом случае для аутентификации понадобится указывать идентификатор клиента, секрет клиента (в случае «Тип доступа» confidential) и offline JWT-токен. Пример запроса на выпуск offline JWT ниже (client_secret опциональный).
    Раскрыть type=json
    curl --location -vk 'https://{{IAM Keycloak domain}}/auth/realms/{{IAM Keycloak Realm}}/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'scope=offline_access' \
    --data-urlencode 'client_id={{M2M client id}}' \
    --data-urlencode 'client_secret={{M2M client secret}}' \
    --data-urlencode 'username={{Имя пользователя ТУЗ}}' \
    --data-urlencode 'password={{Пароль ТУЗ}}' \
    --data-urlencode 'grant_type=password'
    
  4. Скопируйте секрет созданного клиента. С его помощью можно будет получить JWT-токен.

    Увеличить

  5. Создайте заявку администраторам на настройку back-to-back аутентификации. В заявке укажите имя целевого реалма (Realm) Keycloak и оставьте комментарий, что требуется конфигурация IAM Proxy для M2M взаимодействия через client credentials flow.
  6. После выполнения работ по вашей заявке настройте проксирование в конфигураторе Pacman:
    1. Через Звездное небо откройте конфигуратор (пункт «Configurator»).
    2. Перейдите в настройки junction.
    3. В параметр «applyJctRequestFilter» добавьте фильтр custom.d/rds-no-need-oidc-auth-when-token.location.conf.
    Если в «Configurator» уже указан другой фильтр, добавьте новый через разделитель «,» (запятая).
  7. Сохраните и отправьте конфигурацию.
  8. Настройте внешний сервис (см. ниже).

Настройка внешнего сервиса

Чтобы настроить внешний сервис:
  1. Выполните аутентификацию. Аутентификация сводится к обмену учетных секретных данных на access- и refresh-токены. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl. В ответе JSON с access- и refresh-токенами.
    Раскрыть type=json
    # Если Service account включен
    curl -k -X POST 'https://{{IAM Keycloak domain}}/auth/realms/{{IAM Keycloak Realm}}/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id={{M2M client id}}' \
    --data-urlencode 'client_secret={{M2M client secret}}'
    
    # Если Service account выключен (client_secret опциональный)
    curl -k -X POST 'https://{{IAM Keycloak domain}}/auth/realms/{{IAM Keycloak Realm}}/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=password' \
    --data-urlencode 'client_id={{M2M client id}}' \
    --data-urlencode 'client_secret={{M2M client secret}}' \
    --data-urlencode 'username={{Имя пользователя ТУЗ}}' \
    --data-urlencode 'password={{Пароль ТУЗ}}'
    
    # Если Service account выключен и используется offline токен (client_secret опциональный)
    curl -k -X POST 'https://{{IAM Keycloak domain}}/auth/realms/{{IAM Keycloak Realm}}/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=refresh_token' \
    --data-urlencode 'client_id={{M2M client id}}' \
    --data-urlencode 'client_secret={{M2M client secret}}' \
    --data-urlencode 'refresh_token={{Offline JWT токен}}'
    
  2. Выполните запрос в прикладной сервис. Запрос в прикладной сервис необходимо выполнять с заголовком Authorization: Bearer {{Access JWT токен}}. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl. В примере указано значение эндпоинта, настроенного в рамках пункта 2 раздела выше.
    curl -vk 'https://{{IAM Proxy domain}}/api/v1/user' -H 'Authorization: Bearer {{Access JWT токен}}'
  3. В случае если срок действия access-токена истек, а refresh-токен еще действителен, рекомендуется не проводить повторную аутентификацию, а перевыпустить access-токен с помощью refresh. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl.
    Раскрыть type=json
    curl -k -X POST 'https://{{IAM Keycloak domain}}/auth/realms/{{IAM Keycloak Realm}}/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=refresh_token' \
    --data-urlencode 'client_id={{M2M client id}}' \
    --data-urlencode 'client_secret={{M2M client secret}}' \
    --data-urlencode 'refresh_token={{Refresh / Offline JWT токен}}'
    

Проверка

Чтобы проверить работу back-to-back аутентификации:
  1. Получите JWT-токен через клиента m2m, созданного в Keycloak на шаге 1 настройки. Для этого отправьте запрос:
    Раскрыть type=json
    curl -k -X POST 'https://<fqdn IAM Keycloak>/auth/realms/<имя реалма IAM Keycloak>/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id=<имя клиента: m2m>' \
    --data-urlencode 'client_secret=<секрет клиента, полученный на шаге 4>'
    
  2. Подставьте полученный JWT-токен и контекст настраиваемого приложения в запрос ниже:
    curl -vk '<dns-имя IAM Proxy>/<endpoint>' -H 'Authorization: Bearer JWT-ТОКЕН'
    Где:
    • <endpoint> - эндпоинт клиентского прикладного приложения, на которое было настроено проксирование. Начало этого эндпоинта должно совпадать со значением junctionPoint шага 5 раздела «Подключение приложения к сервису аутентификации»;
    • <dns-имя IAM Proxy> - доменное имя клиентского IAM Proxy (см. в паспорте стенда).
На этом этапе проверку можно считать успешной.

Аутентификация через endpoint мобильных приложений

Основные шаги:
  1. Прикладной администратор создает учетную запись под внешний сервис и выпускает offline token и передает его администратору внешнего сервиса;
  2. Внешний сервис восстанавливает сессию с помощью offline token, получая в ответ платформенные cookie;
  3. Запросы в сторону прикладного сервиса должны выполняться с использованием платформенных cookie.
Преимущества:
  • нет необходимости в дополнительной настройки IAM Keycloak и IAM Proxy;
  • за обновлением токенов доступа отвечает IAM Proxy, необходимо лишь использовать новые cookie, если их присылают в ответ на запрос.
К недостаткам можно отнести необходимость во внешнем сервисе работать с cookie.

Настройка и примеры запросов

Чтобы настроить аутентификацию через endpoint мобильных приложений:
  1. Создайте учетную запись и назначьте необходимые роли. Процесс создания технической учетной записи для внешнего сервиса не отличается от стандартного процесса создания нового пользователя с присвоением необходимых ролей.
    Технической учетной записи необходимо назначить роль «offline_access». Необходимо проверить, что в настройках клиента IAM Proxy на вкладке «Шаблоны клиентов» область «offline_access» находится в разделе «Назначенные дополнительные клиентские области».
  2. Выпустите offline token.
    Способ 1. Через браузер.
    1. Откройте новую вкладку браузера в режиме инкогнито.
    2. Откройте IAM Proxy с контекстным путем /mobile/auth/. При этом IAM Proxy выполнит редирект в IAM Keycloak для аутентификации.
    Здесь и далее в контекстном пути /mobile/** в конце символ «/» обязателен к указанию.
    1. Пройдите аутентификацию в IAM Keycloak. После успешной аутентификации IAM Keycloak выполнит редирект в IAM Keycloak.
    2. Откройте IAM Proxy с контекстным путем /mobile/get-token/. В ответ IAM Proxy вернет offline JWT-токен, который необходимо сохранить.
    Способ 2. Через curl.
    1. Откройте панель администратора IAM Keycloak.
    2. Перейдите в настройки клиента IAM Proxy и включите опцию «Direct Access Grants».
    3. На вкладке «Учетные данные» сохраните секрет клиента.
    4. Выполните POST-запрос в IAM Keycloak для аутентификации под ТУЗ с использованием scope offline_access. В ответ IAM Proxy вернет JSON, где в ключе refresh_token содержится offline JWT-токен, который необходимо сохранить.
    Раскрыть type=bash
    curl --location -vk 'https://{{IAM Keycloak domain}}/auth/realms/{{IAM Keycloak Realm}}/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'scope=offline_access' \
    --data-urlencode 'client_id={{IAM Proxy client id}}' \
    --data-urlencode 'client_secret={{IAM Proxy client secret}}' \
    --data-urlencode 'username={{Имя пользователя ТУЗ}}' \
    --data-urlencode 'password={{Пароль ТУЗ}}' \
    --data-urlencode 'grant_type=password'
    
    1. Откройте панель администратора IAM Keycloak, перейдите в настройки клиента IAM Proxy и выключите опцию «Direct Access Grants».
  3. Настройте внешний сервис. Настройка внешнего сервиса включает:
    1. Восстановление платформенной сессии с использованием offline JWT-токена.
      Для восстановления сессии выполните запрос на IAM Proxy с контекстным путем. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl. В ответ IAM Proxy в заголовках «Set-Cookie» пришлет один или несколько cookie PLATFORM_SESSION (PLATFORM_SESSION, PLATFORM_SESSION_2 и так далее).
      Раскрыть type=bash
      curl -vk --location 'https://{{IAM Proxy domain}}/mobile/restore-session/' -c platform_cookie.txt \
      --header 'Content-Type: application/x-www-form-urlencoded' \
      --data-urlencode 'token={{Offline token}}'
      
    2. Запрос в прикладной сервис.
      Запросы необходимо выполнять со всеми cookie PLATFORM_SESSION, полученными в предыдущем шаге. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl.
      curl -vk 'https://{{IAM Proxy domain}}/api/v1/user' -b platform_cookie.txt
За обновление сессии отвечает IAM Proxy, поэтому необходимо проверять все ответы на прикладные запросы на наличие заголовков «Set-Cookie» с новыми cookie PLATFORM_SESSION.
В случае если IAM Proxy отвечает HTTP-статусом 401, например, после длительного простоя, повторно восстановите платформенную сессию с использованием offline JWT-токена.

Демопримеры

В демопримерах реализованы стандартные сценарии, демонстрирующие работу отдельных сервисов Платформы ГосТех. Отправка тестовых запросов в демопримерах позволит вам ознакомиться с функциями того или иного сервиса. Доступные демопримеры и описания реализованной в них функциональности представлены ниже.
Аутентификация
Аутентификация в прикладных приложениях с проверкой JWT токена и присвоением сессии уникального идентификатора
Создание локального JWT токена
Создание JWT токена с настраиваемым набором данных пользователя для аутентификации в прикладных приложениях
Получение данных в ЕСИА
Просмотр данных о пользователе из ЕСИА, полученных при аутентификации
Предыдущий раздел
1.13 Аутентификация Platform V IAM
Следующий раздел
Получение данных о пользователе в прикладном приложении
Была ли страница полезной?