Методы аутентификации. JWT/OIDC (API)
В данной документации представлено API для плагина метода аутентификации JWT/OIDC StarVault. Чтобы узнать больше об использовании и работе, смотрите документацию метода StarVault JWT/OIDC.
|
Данный механизм может использовать внешние сертификаты X.509 в качестве части TLS или проверки подписи. Проверка подписей на сертификаты X.509 с использованием SHA-1 устарела и больше не может использоваться без обходного решения. |
В данном руководстве предполагается, что плагин подключен по пути /auth/jwt в StarVault. Поскольку возможно включать методы аутентификации в любом месте, пожалуйста, обновите ваши вызовы API соответственно.
1. Конфигурация
Настраивает информацию о валидации, которая будет использоваться глобально для всех ролей. Должен быть установлен один (и только один) из параметров oidc_discovery_url, jwks_url и jwt_validation_pubkeys.
| Метод | Путь |
|---|---|
|
|
1.1. Параметры
-
oidc_discovery_url(string: <optional>)- URL OIDC Discovery без какого-либо компонента .well-known (базовый путь). Не может использоваться сjwks_urlилиjwt_validation_pubkeys. -
oidc_discovery_ca_pem(string: <optional>)- содержимое CA сертификата или цепочки сертификатов в формате PEM, используемое для проверки соединений с URL OIDC Discovery. Если не установлено, используются системные сертификаты. -
oidc_client_id(string: <optional>)- OAuth Client ID от провайдера для ролей OIDC. -
oidc_client_secret(string: <optional>)- OAuth Client Secret от провайдера для ролей OIDC. -
oidc_response_mode(string: <optional>)- режим ответа, который будет использоваться в OAuth2 запросе. Разрешенные значения:queryиform_post. По умолчаниюquery. -
oidc_response_types(строка, разделенная запятыми, или массив строк: <optional>)- типы ответа для запроса. Разрешенные значения:codeиid_token. По умолчаниюcode.
"id_token" может использоваться только если oidc_response_mode установлен в form_post.
-
jwks_url(string: <optional>)- URL JWKS для аутентификации подписей. Не может использоваться сoidc_discovery_urlилиjwt_validation_pubkeys. -
jwks_ca_pem(string: <optional>)- содержимое CA сертификата или цепочки сертификатов в формате PEM, используемое для проверки соединений с URL JWKS. Если не установлено, используются системные сертификаты. -
jwt_validation_pubkeys(строка, разделенная запятыми, или массив строк: <optional>)- список публичных ключей в формате PEM для аутентификации подписей локально. Не может использоваться сjwks_urlилиoidc_discovery_url. -
bound_issuer(string: <optional>)- значение, с которым будет сопоставлено утверждениеissв JWT. -
jwt_supported_algs(строка, разделенная запятыми, или массив строк: <optional>)- список поддерживаемых алгоритмов подписи. По умолчанию [RS256] для ролей OIDC. По умолчанию все доступные алгоритмы для ролей JWT. -
default_role(string: <optional>)- роль по умолчанию, которая будет использоваться, если не указана при входе. -
provider_config(map: <optional>)- опции конфигурации для специфичной обработки провайдеров. Провайдеры со специфичной обработкой включают: Azure, Google, SecureAuth, IBM ISAM. Опции описаны в разделе каждого провайдера в Настройке OIDC провайдера. -
override_allowed_server_names(строка, разделенная запятыми, или массив строк: <optional>)- список имен хостов, принимаемых при выполнении проверки TLS, которую применяют как к OIDC, так и к JWKS. Это переопределяет стандартные проверки, которые ожидают, что субъект TLS соответствует имени хоста, указанному в URL соединения. -
namespace_in_state(bool: true)- передает пространство имен в параметре состояния OIDC вместо использования отдельного параметра запроса. С учетом этой настройки разрешенные URL перенаправления в StarVault и на стороне провайдера не должны содержать параметр запроса namespace. Это означает, что на стороне провайдера необходимо поддерживать только одну запись URL перенаправления для всех пространств имен хранилища, которые будут аутентифицироваться через него. По умолчанию true для новых конфигураций. -
skip_jwks_validation(bool: false)- когдаtrueи указаныoidc_discovery_urlилиjwks_url, если соединение не удается загрузить, будет выдано предупреждение и статус можно будет проверить позже, прочитав конечную точку конфигурации. Когдаfalse, сохранение конфигурации не удастся, если проверка поставщика не сможет завершиться успешно.
{
"oidc_discovery_url": "https://myco.auth0.com/",
"bound_issuer": "https://myco.auth0.com/"
}
$ curl \
--header "X-Vault-Token: ..." \
--request POST \
--data @payload.json \
https://127.0.0.1:8200/v1/auth/jwt/config
2. Чтение конфигурации
Возвращает ранее настроенную конфигурацию.
| Метод | Путь |
|---|---|
|
|
$ curl \
--header "X-Vault-Token: ..." \
https://127.0.0.1:8200/v1/auth/jwt/config
{
"data": {
"oidc_discovery_url": "https://myco.auth0.com/",
"oidc_discovery_ca_pem": [],
"bound_issuer": "https://myco.auth0.com/",
"jwt_validation_pubkeys": []
},
...
}
3. Создание/Обновление роли
Регистрация роли в методе. Типы ролей имеют специфические сущности, которые могут выполнять операции входа через эту конечную точку. Ограничения, специфичные для типа роли, должны быть установлены на роли. Эти ограничения применяются к аутентифицированным сущностям, пытающимся войти в систему. Должно быть установлено хотя бы одно из связанных значений.
| Метод | Путь |
|---|---|
|
|
3.1. Параметры
-
name(string: <required>)- имя роли. -
role_type(string: <optional>)- тип роли, либо "oidc" (по умолчанию), либо "jwt". -
bound_audiences(array: <optional>)- список утвержденийaudдля соответствия. Любое соответствие достаточно. Для ролей "jwt" требуется как минимум одно изbound_audiences,bound_subject,bound_claimsилиtoken_bound_cidrs. Опционально для ролей "oidc". -
user_claim(string: <required>)- утверждение, которое будет использоваться для уникальной идентификации пользователя; это будет использоваться как имя для созданного алиаса сущности идентичности в результате успешного входа. Значение утверждения должно быть строкой. -
user_claim_json_pointer(bool: false)- указывает, использует ли значениеuser_claimсинтаксис JSON pointer для обращения к утверждениям. По умолчанию значениеuser_claimне будет использовать JSON pointer. -
clock_skew_leeway(int или string: <optional>)- сколько свободы времени следует добавить ко всем утверждениям, чтобы учесть расхождение часов в секундах. По умолчанию60секунд, если установлено0, и может быть отключено, если установлено-1. Принимает целое число секунд или строку формата продолжительности Go. Применимо только с "jwt" ролями. -
expiration_leeway(int или string: <optional>)- сколько свободы времени следует добавить к утверждениям срока действия (exp), чтобы учесть расхождение часов в секундах. По умолчанию150секунд, если установлено0, и может быть отключено, если установлено-1. Принимает целое число секунд или строку формата продолжительности Go. Применимо только с "jwt" ролями. -
not_before_leeway(int или string: <optional>)- сколько свободы времени следует добавить к утверждениям not before (nbf), чтобы учесть расхождение часов в секундах. По умолчанию150секунд, если установлено0, и может быть отключено, если установлено-1. Принимает целое число секунд или строку формата продолжительности Go. Применимо только с "jwt" ролями. -
bound_subject(string: <optional>)- если установлено, требует, чтобы утверждениеsubсоответствовало этому значению. -
bound_claims(map: <optional>)- если установлено, отображение утверждений (ключей) для совпадения с соответствующими значениями утверждений (значениями). Ожидаемое значение может быть одной строкой или списком строк. Интерпретация значений связанных утверждений настраивается с помощьюbound_claims_type. Ключи поддерживают синтаксис JSON pointer для обращения к утверждениям. -
bound_claims_type(string: "string")- настраивает интерпретацию значений bound_claims. Еслиstring(по умолчанию), значения будут рассматриваться как строковые литералы и должны совпадать точно. Если установлено наglob, значения будут интерпретированы как шаблоны, где*соответствует любому количеству символов. -
groups_claim(string: <optional>)- утверждение, которое будет использоваться для уникальной идентификации набора групп, к которым принадлежит пользователь; это будет использоваться как имена для созданных из-за успешного входа алиасов группы идентичности. Значение утверждения должно быть списком строк. Поддерживает синтаксис JSON pointer для обращения к утверждениям. -
claim_mappings(map: <optional>)- если установлено, отображение утверждений (ключей), которые будут скопированы в указанные метаданные (значения). Ключи поддерживают синтаксис JSON pointer для обращения к утверждениям. -
oauth2_metadata(list: <optional>)- если установлено, список типов токенов, которые поступают от OIDC провайдера, которые нужно вернуть в метаданных. Типы могут быть любыми изaccess_token,id_tokenилиrefresh_token, и при наличии значения возвращаются в соответствующих полях метаданных с префиксамиoauth2_. Обратите внимание, что эти токены могут потенциально включать конфиденциальную безопасность, поэтому проявляйте осторожность перед их включением и убедитесь, что клиент обрабатывает информацию безопасно. -
oidc_scopes(list: <optional>)- если установлено, список OIDC скоупов, которые будут использоваться с OIDC ролью. Стандартный скоуп "openid" автоматически включается и не требует указания. -
allowed_redirect_uris(list: <required, кроме режима обратного вызова устройства>)- список разрешенных значений для redirect_uri во время OIDC входов. -
callback_mode(string: <optional>)- режим обратного вызова от OIDC провайдера, либоclient(по умолчанию), чтобы выполнить обратный вызов к клиенту,directдля выполнения обратного вызова к серверу StarVault или "device" для устройства, у которого нет обратного вызова. -
poll_interval(int: <optional>)- интервал опроса в секундах для режимов устройства и прямого обратного вызова, значение по умолчанию от сервера авторизации для потока устройства или '5'. -
verbose_oidc_logging(bool: false)- логировать полученные OIDC токены и утверждения при активном режиме отладки. Не рекомендуется в производстве, поскольку в ответах OIDC могут присутствовать конфиденциальные данные. -
max_age(int или string: <optional>)- указывает допустимое прошедшее время в секундах с момента последней активной аутентификации пользователя с OIDC провайдером. Если установлено, параметр запросаmax_ageбудет включен в запрос аутентификации. См. AuthRequest для получения дополнительных деталей. Принимает целое число секунд или строку формата продолжительности Go. -
token_policies_template_claims(bool: false)- когда включено, позволяет элементам вtoken_policiesсодержать шаблоны, которые вычисляются со всеми утверждениями на подлежащем JWT или OIDC ID токене. Это используетsdk/helper/template, основанный наtext/templateдля шаблонирования. Шаблоны, которые приводят к пустой строке, удаляются, и все ссылки на утверждения должны существовать на аутентифицирующем токене. См. примеры ниже.
3.2. Примеры шаблонов ACL политики
Если данный JWT содержит пользовательские утверждения для project_id, environment и branch (например, из CI интеграции) и существует политика ACL для project_1234/env_prod/branch_main, это можно закодировать следующим образом:
token_policies=["project_{{.project_id}}/env_{{.environment}}/branch_{{.branch}}"]
Чтобы сделать это условным в зависимости от того, является ли окружение prod, это можно закодировать следующим образом:
token_policies=["{{if eq \"prod\" .environment}}project_{{.project_id}}/env_{{.environment}}/branch_{{.branch}}{{end}}"]
И эта политика ACL будет пустой (и, следовательно, удаленной), если значение утверждения environment на токене, используемом во время аутентификации, было testing или staging.
Чтобы сослаться на утверждения, которые не всегда присутствуют в токене, вы можете обернуть выражение в проверку if, используя функцию index:
{{ if ne nil (index . "optional_claim") }}
... какое-то выражение с .optional_claim ...
{{ end }}
{
"policies": ["dev", "prod"],
"bound_subject": "sl29dlldsfj3uECzsU3Sbmh0F29Fios1@clients",
"bound_audiences": "https://myco.test",
"user_claim": "https://StarVault/user",
"groups_claim": "https://StarVault/groups",
"bound_claims": {
"department": "engineering",
"sector": "7g"
},
"claim_mappings": {
"preferred_language": "language",
"group": "group"
}
}
$ curl \
--header "X-Vault-Token: ..." \
--request POST \
--data @payload.json \
https://127.0.0.1:8200/v1/auth/jwt/role/dev-role
4. Чтение роли
Возвращает ранее зарегистрированную конфигурацию роли.
| Метод | Путь |
|---|---|
|
|
4.1. Параметры
-
name(string: <required>)- имя роли.
$ curl \
--header "X-Vault-Token: ..." \
https://127.0.0.1:8200/v1/auth/jwt/role/dev-role
{
"data": {
"bound_subject": "sl29dlldsfj3uECzsU3Sbmh0F29Fios1@clients",
"bound_audiences": [
"https://myco.test"
],
"bound_cidrs": [],
"user_claim": "https://StarVault/user",
"groups_claim": "https://StarVault/groups",
"policies": [
"dev",
"prod"
],
"period": 0,
"ttl": 0,
"num_uses": 0,
"max_ttl": 0
},
...
}
5. Список ролей
Перечислить все роли, зарегистрированные с помощью плагина.
| Метод | Путь |
|---|---|
|
|
5.1. Параметры
-
after(string: "")- необязательная запись, с которой следует начинать перечисление для постраничной навигации; не требуется существовать. -
limit(int: 0)- необязательное количество записей для возврата; по умолчанию возвращаются все записи.
$ curl \
--header "X-Vault-Token: ..." \
--request LIST \
https://127.0.0.1:8200/v1/auth/jwt/role
{
"data": {
"keys": [
"dev-role",
"prod-role"
]
},
...
}
7. Запрос URL авторизации OIDC
Получите URL авторизации от StarVault для начала потока входа OIDC.
Ответ будет включать auth_url, куда пользователю необходимо перейти в веб-браузере для завершения потока входа.
В режиме обратного вызова устройства ответ может включать ключевое слово user_code, которое должно быть показано пользователю для ввода на auth_url.
| Метод | Путь |
|---|---|
|
|
7.1. Параметры
-
role(string: <optional>)- имя роли, против которой осуществляется попытка входа. По умолчанию используется настроеннаяdefault_role, если не указана. -
redirect_uri(string: <required, кроме режима обратного вызова устройства>)- путь к обратному вызову для завершения входа. Это будет в форме "https://…/oidc/callback", где начальная часть зависит от вашего местоположения сервера StarVault, порта и монтирования плагина JWT. Это должно быть настроено в StarVault и провайдере. См. Redirect URIs для получения дополнительной информации. -
client_nonce(string: <optional>)- необязательный nonce, предоставленный клиентом, который должен совпадать с значениемclient_nonce, предоставленным во время последующего запроса к callback API .
7.2. Примеры полезной нагрузки
Для режимов клиента или прямого обратного вызова:
{
"role": "dev-role",
"redirect_uri": "https://StarVault.myco.com:8200/ui/StarVault/auth/jwt/oidc/callback",
"client_nonce": "ni42i2idj2jj"
}
Для режима обратного вызова устройства:
{
"role": "dev-role",
"client_nonce": "ni42i2idj2jj"
}
$ curl \
--request POST \
--data @payload.json \
https://127.0.0.1:8200/v1/auth/jwt/oidc/auth_url
Для режимов клиента или прямого обратного вызова:
{
"request_id": "c701169c-64f8-26cc-0315-078e8c3ce897",
"data": {
"auth_url": "https://myco.auth0.com/authorize?client_id=r3qXcK2bezU3Sbmh0K16fatW6&nonce=851b69a9bfa5a6a5668111314414e3687891a599&redirect_uri=https%3A%2F%2FStarVault.myco.com3A8200%2Fui%2FStarVault%2Fauth%2Fjwt%2Foidc%2Fcallback&response_type=code&scope=openid+email+profile&state=1011e726d24960e09cfca2e04b36b38593cb6a22"
},
...
}
Для режима обратного вызова устройства:
{
"request_id": "c701169c-64f8-26cc-0315-078e8c3ce897",
"data": {
"auth_url": "https://myco.auth0.com/device",
"user_code": "ABCDEFGHIJK"
},
...
}
8. Обратный вызов OIDC
Обменяйте код авторизации на OIDC ID токен. ID токен будет дополнительно проверен на соответствие любым связанным утверждениям, и если он действителен, будет возвращен токен StarVault.
Это обычно инициируется сервером авторизации в клиентских или прямых режимах обратного вызова и не используется в режиме обратного вызова устройства.
| Метод | Путь |
|---|---|
|
|
-
state(string: <required>)- непрозрачный идентификатор состояния, который является частью URL авторизации и будет включен в перенаправление после успешной аутентификации на провайдере. -
code(string: <optional>)- код авторизации, сгенерированный провайдером, который StarVault обменяет на ID токен. Обязателен, если не указанid_token. -
id_token(string: <optional>)- если указан вместо кода авторизации, будет использоваться напрямую вместо обмена кода, чтобы получить его. Обязателен, если не указанcode. -
client_nonce(string: <optional>)- необязательный nonce, предоставленный клиентом, который должен совпадать с значениемclient_nonce, предоставленным во время предыдущего запроса к APIauth_url. -
error_description(string: <optional>)- подробное описание ошибки, если произошла ошибка. Если присутствует, будет включено в сообщение об ошибке, возвращаемое запрашивающему.
$ curl \
https://127.0.0.1:8200/v1/auth/jwt/oidc/callback?state=n2kfh3nsl&code=mn2ldl2nv98h2jl&client_nonce=ni42i2idj2jj
{
"auth": {
"client_token": "f33f8c72-924e-11f8-cb43-ac59d697597c",
"accessor": "0e9e354a-520f-df04-6867-ee81cae3d42d",
"policies": [
"default",
"dev",
"prod"
],
"lease_duration": 2764800,
"renewable": true
},
...
}
9. Опрос OIDC
Опрос ответа при использовании прямого или устройства режима обратного вызова для завершения входа. Ответ от API auth_url возвращает элемент данных poll_interval, содержащий количество секунд, которое клиент должен подождать между вызовами API опроса.
Если обратный вызов прямого режима или устройство авторизации еще не произошло, код HTTP ответа будет 400 и будет включать список JSON errors, включая либо authorization_pending, либо slow_down. Если ответ slow_down, клиент должен добавить дополнительное время перед повторным вызовом API опроса.
Когда обратный вызов или авторизация произошли, ответ будет включать либо другое сообщение об ошибках, либо успешно вернуть токен авторизации.
| Метод | Путь |
|---|---|
|
|
9.1. Параметры
-
state(string: <required>)- непрозрачный идентификатор состояния, который был частью URL авторизации и должен соответствовать состоянию, возвращенному провайдером OIDC. -
client_nonce(string: <optional>)- необязательный nonce, предоставленный клиентом, который должен совпадать с значениемclient_nonce, предоставленным во время предыдущего запроса к API [auth_url].
{
"state": "n2kfh3nsl",
"client_nonce": "ni42i2idj2jj"
}
$ curl \
--request POST \
--data @payload.json \
https://127.0.0.1:8200/v1/auth/jwt/oidc/poll
Когда ответ еще не произошел:
{
"errors": [
"authorization_pending"
]
}
При успешном завершении:
{
"auth": {
"client_token": "f33f8c72-924e-11f8-cb43-ac59d697597c",
"accessor": "0e9e354a-520f-df04-6867-ee81cae3d42d",
"policies": [
"default",
"dev",
"prod"
],
"lease_duration": 2764800,
"renewable": true
},
...
}
10. JWT вход
Получите токен. Эта конечная точка принимает подписанный JSON Web Token (JWT) и имя роли для некоторой сущности. Он проверяет подпись JWT для аутентификации этой сущности и затем авторизует сущность для данной роли.
| Метод | Путь |
|---|---|
|
|
10.1. Параметры
-
role(string: <optional>)- имя роли, против которой осуществляется попытка входа. По умолчанию используется настроеннаяdefault_role, если не указана. -
jwt(string: <required>)- подписанный JSON Web Token (JWT).
{
"role": "dev-role",
"jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
$ curl \
--request POST \
--data @payload.json \
https://127.0.0.1:8200/v1/auth/jwt/login
{
"auth": {
"client_token": "f33f8c72-924e-11f8-cb43-ac59d697597c",
"accessor": "0e9e354a-520f-df04-6867-ee81cae3d42d",
"policies": [
"default",
"dev",
"prod"
],
"lease_duration": 2764800,
"renewable": true
},
...
}