Настройка проксирования
Аутентифицированный доступ пользователей и приложений к прикладным сервисам обеспечивает IAM Proxy. Чтобы подключить прикладное приложение к сервису аутентификации, его нужно добавить в конфигураторе Pacman и настроить правила проксирования на IAM Proxy. Инструкции по подключению и возможным настройкам приведены в этом разделе.
Для подключения приложения:
-
Откройте приложение конфигуратора: зайдите в Звездное небо (общее меню при входе на Платформу) и выберите пункт «Configurator».
-
В навигационном меню слева выберите пункт «Артефакты».
-
В открывшейся таблице выберите строку «Управление маршрутами прокси-сервера (Route Discovery Service)».
Увеличить
Если доступно несколько версий, выберите последнюю. В результате отобразятся все настройки проксирования, доступные в меню IAM. Настройки представляют собой узлы проксирования (junctionPoint). Каждый добавленный junctionPoint отображается в виде отдельного узла дерева в списке. -
Чтобы добавить новое прикладное приложение, добавьте новый узел дерева нажатием пиктограммы «+».
Увеличить
-
Укажите параметры подключаемого приложения.
Увеличить
Параметр Описание, возможные значения GroupТехническое название приложения junctionNameИмя прикладного приложения, которое будет отображаться в Звездном небе junctionPointКорневой контекст запросов, по которому будет определяться принадлежность запроса к конкретной подсистеме Backend serverAddressesIP-адрес или 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 ГБ) для BackendauthorizeByRoleTemplateРоль пользователя из JWT-токена (опционально). Если роль заполнена, IAM Proxy обеспечит доступ только тем пользователям приложения, у которых в JWT-токене есть указанная роль httpsПротокол, используемый на сервере прикладного приложения (HTTPS/SSL) indexUrlАдрес Backend для основного входа в UI приложения. Указывается относительно корня sslCommonNameШаблон/значение имени из CN сертификата Backend-серверов. Поставьте *
, чтобы отключить проверкуtransparentПрозрачность URL. Задайте значение true
-
Сохраните настройки. Для этого в верхней части таблицы нажмите «Сохранить все» → «Play».
Увеличить
Перейдите в Звездное небо, новый пункт появится в списке приложений.
Этот вид доступа подразумевает, что при проксировании запросов от аутентифицированного пользователя JWT-токен не прокидывается в прикладной сервис.
Чтобы добавить анонимный доступ, укажите в параметре «applyJctRequestFilter» (см. в таблице выше) прикладного приложения фильтр
common/oidc-unauth-access.location.conf
.При проксировании с анонимным доступом необходимо учитывать, чтобы все данные
на эндпойнте тоже должны позволять доступ без аутентификации.
Этот вид доступа определяет способ взаимодействия 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 (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 аутентификации:
-
Откройте панель администратора IAM Keycloak.
-
Создайте в нужном реалме (Realm) Keycloak клиента с именем «m2m» (Client ID). Задайте настройки клиента:
- Access Type — «confidential»;
- Standard Flow Enabled — в положение «OFF»;
- Service Accounts Enabled — в положение «ON».
Увеличить
-
При использовании технологии 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=jsoncurl --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'
-
Скопируйте секрет созданного клиента. С его помощью можно будет получить JWT-токен.
Увеличить
-
Создайте заявку администраторам на настройку back-to-back аутентификации. В заявке укажите имя целевого реалма (Realm) Keycloak и оставьте комментарий, что требуется конфигурация IAM Proxy для M2M взаимодействия через client credentials flow.
-
После выполнения работ по вашей заявке настройте проксирование в конфигураторе Pacman:
- Через Звездное небо откройте конфигуратор (пункт «Configurator»).
- Перейдите в настройки junction.
- В параметр «applyJctRequestFilter» добавьте фильтр
custom.d/rds-no-need-oidc-auth-when-token.location.conf
.
Если в «Configurator» уже указан другой фильтр, добавьте новый через разделитель «,» (запятая). -
Сохраните и отправьте конфигурацию.
-
Настройте внешний сервис (см. ниже).
Настройка внешнего сервиса
Чтобы настроить внешний сервис:
-
Выполните аутентификацию. Аутентификация сводится к обмену учетных секретных данных на 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 токен}}'
-
Выполните запрос в прикладной сервис. Запрос в прикладной сервис необходимо выполнять с заголовком
Authorization: Bearer {{Access JWT токен}}
. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl. В примере указано значение эндпоинта, настроенного в рамках пункта 2 раздела выше.curl -vk 'https://{{IAM Proxy domain}}/api/v1/user' -H 'Authorization: Bearer {{Access JWT токен}}'
-
В случае если срок действия access-токена истек, а refresh-токен еще действителен, рекомендуется не проводить повторную аутентификацию, а перевыпустить access-токен с помощью
refresh
. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl.Раскрыть type=jsoncurl -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 аутентификации:
-
Получите 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>'
-
Подставьте полученный JWT-токен и контекст настраиваемого приложения в запрос ниже:
curl -vk '<dns-имя IAM Proxy>/<endpoint>' -H 'Authorization: Bearer JWT-ТОКЕН'
Где:-
<endpoint>
- эндпоинт клиентского прикладного приложения, на которое было настроено проксирование. Начало этого эндпоинта должно совпадать со значением junctionPoint шага 5 раздела «Подключение приложения к сервису аутентификации»; -
<dns-имя IAM Proxy>
- доменное имя клиентского IAM Proxy (см. в паспорте стенда).
-
На этом этапе проверку можно считать успешной.
Аутентификация через endpoint мобильных приложений
Основные шаги:
- Прикладной администратор создает учетную запись под внешний сервис и выпускает offline token и передает его администратору внешнего сервиса;
- Внешний сервис восстанавливает сессию с помощью offline token, получая в ответ платформенные cookie;
- Запросы в сторону прикладного сервиса должны выполняться с использованием платформенных cookie.
Преимущества:
- нет необходимости в дополнительной настройки IAM Keycloak и IAM Proxy;
- за обновлением токенов доступа отвечает IAM Proxy, необходимо лишь использовать новые cookie, если их присылают в ответ на запрос.
К недостаткам можно отнести необходимость во внешнем сервисе работать с cookie.
Настройка и примеры запросов
Чтобы настроить аутентификацию через endpoint мобильных приложений:
-
Создайте учетную запись и назначьте необходимые роли. Процесс создания технической учетной записи для внешнего сервиса не отличается от стандартного процесса создания нового пользователя с присвоением необходимых ролей.Технической учетной записи необходимо назначить роль «offline_access». Необходимо проверить, что в настройках клиента IAM Proxy на вкладке «Шаблоны клиентов» область «offline_access» находится в разделе «Назначенные дополнительные клиентские области».
-
Выпустите offline token.Способ 1. Через браузер.
- Откройте новую вкладку браузера в режиме инкогнито.
- Откройте IAM Proxy с контекстным путем
/mobile/auth/
. При этом IAM Proxy выполнит редирект в IAM Keycloak для аутентификации.
Здесь и далее в контекстном пути/mobile/**
в конце символ «/» обязателен к указанию.-
Пройдите аутентификацию в IAM Keycloak. После успешной аутентификации IAM Keycloak выполнит редирект в IAM Keycloak.
-
Откройте IAM Proxy с контекстным путем
/mobile/get-token/
. В ответ IAM Proxy вернет offline JWT-токен, который необходимо сохранить.
- Откройте панель администратора IAM Keycloak.
- Перейдите в настройки клиента IAM Proxy и включите опцию «Direct Access Grants».
- На вкладке «Учетные данные» сохраните секрет клиента.
- Выполните POST-запрос в IAM Keycloak для аутентификации под ТУЗ с использованием scope
offline_access
. В ответ IAM Proxy вернет JSON, где в ключеrefresh_token
содержится offline JWT-токен, который необходимо сохранить.
Раскрыть type=bashcurl --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'
- Откройте панель администратора IAM Keycloak, перейдите в настройки клиента IAM Proxy и выключите опцию «Direct Access Grants».
-
Настройте внешний сервис. Настройка внешнего сервиса включает:
-
Восстановление платформенной сессии с использованием offline JWT-токена.Для восстановления сессии выполните запрос на IAM Proxy с контекстным путем. Ниже приведен пример запроса, выполненный с помощью консольной утилиты curl. В ответ IAM Proxy в заголовках «Set-Cookie» пришлет один или несколько cookie
PLATFORM_SESSION
(PLATFORM_SESSION
,PLATFORM_SESSION_2
и так далее).Раскрыть type=bashcurl -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}}'
-
Запрос в прикладной сервис.Запросы необходимо выполнять со всеми 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 токена с настраиваемым набором данных пользователя для аутентификации в прикладных приложениях
Получение данных в ЕСИА
Просмотр данных о пользователе из ЕСИА, полученных при аутентификации