Настройка федерации сервисных аккаунтов
Федерации сервисных аккаунтов (Workload Identity Federation) позволяют настроить связь между внешними системами и Yandex Cloud по протоколу OpenID Connect
Чтобы настроить аутентификацию в API Yandex Cloud через федерацию сервисных аккаунтов:
- Подготовьте облако к работе.
- Создайте федерацию сервисных аккаунтов.
- Создайте привязку.
- Обменяйте JWT-токен внешнего субъекта на IAM-токен сервисного аккаунта.
Примеры настройки аутентификации для отдельных OIDC-провайдеров приведены в практических руководствах:
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Для настройки федерации сервисных аккаунтов вам понадобится сервисный аккаунт. Если у вас нет сервисного аккаунта, создайте его.
Создайте федерацию сервисных аккаунтов
Примечание
Чтобы создать федерацию сервисных аккаунтов, пользователю необходима роль iam.workloadIdentityFederations.editor
или выше на каталог.
- В консоли управления
выберите каталог, в котором вы хотите создать федерацию сервисных аккаунтов. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Федерации сервисных аккаунтов. - Нажмите Создать федерацию и в открывшейся форме:
-
В поле Значение Issuer (iss) введите URL OIDC-провайдера.
Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
В поле Допустимые значения Audience (aud) введите ресурс, для которого будет предназначен получаемый токен.
Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
Вы можете задать одновременно несколько ресурсов-получателей IAM-токена.
-
В поле Адрес JWKS введите URL, по которому можно получить актуальный открытый ключ, выпущенный OIDC-провайдером и используемый для проверки подписи JWT
.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
В поле Имя введите имя создаваемой федерации, например
sample-iam-federation
. -
Нажмите кнопку Создать.
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Посмотрите описание команды создания федерации сервисных аккаунтов:
yc iam workload-identity oidc federation create --help
-
Создайте федерацию сервисных аккаунтов в каталоге по умолчанию:
yc iam workload-identity oidc federation create \ --name <имя_федерации> \ --issuer "<URL_OIDC-провайдера>" \ --audiences "<ресурс_1>","<ресурс_2>",...,"<ресурс_n>" \ --jwks-url "<адрес_JWKS>"
Где:
-
--name
— имя создаваемой федерации. Например:sample-iam-federation
. Требования к имени:- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
--issuer
— URL OIDC-провайдера.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
--audiences
— ресурсы, для которых будет предназначен получаемый токен. Вы можете через запятую задать одновременно несколько ресурсов-получателей IAM-токена.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
--jwks-url
— URL, по которому можно получить актуальный открытый ключ, выпущенный OIDC-провайдером и используемый для проверки подписи JWT .Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
Результат:
id: aje2c4qv19lf******** name: sample-iam-federation folder_id: b1gfq9pe6rd2******** enabled: true audiences: - https://gitlab.example.ru - https://gitlab.example.com issuer: https://gitlab.com jwks_url: https://gitlab.com/oauth/discovery/keys created_at: "2024-12-28T16:04:31.530652473Z"
Сохраните значение идентификатора созданной федерации сервисных аккаунтов, оно понадобится при создании привязки.
Подробнее о команде
yc iam workload-identity oidc federation create
см. в справочнике CLI. -
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле Terraform параметры федерации, которую необходимо создать:
resource "yandex_iam_workload_identity_oidc_federation" "wlif" { name = "<имя_федерации>" folder_id = "<идентификатор_каталога>" audiences = ["<ресурс_1>","<ресурс_2>",...,"<ресурс_n>"] issuer = "<URL_OIDC-провайдера>" jwks_url = "<адрес_JWKS>" }
Где:
-
name
— имя создаваемой федерации. Например:sample-iam-federation
. Требования к имени:- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
folder_id
— идентификатор каталога, в котором создается федерация сервисных аккаунтов. -
audiences
— ресурсы, для которых будет предназначен получаемый токен. Вы можете через запятую задать одновременно несколько ресурсов-получателей IAM-токена.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
issuer
— URL OIDC-провайдера.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
jwks_url
— URL, по которому можно получить актуальный открытый ключ, выпущенный OIDC-провайдером и используемый для проверки подписи JWT .Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
Более подробную информацию о параметрах ресурса
yandex_iam_workload_identity_oidc_federation
в Terraform, см. в документации провайдера . -
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
Terraform создаст федерацию сервисных аккаунтов. Убедиться в создании федерации можно в консоли управления
или с помощью команды CLI:yc iam workload-identity oidc federation list
-
Чтобы создать федерацию сервисных аккаунтов, воспользуйтесь методом REST API create для ресурса Federation или вызовом gRPC API FederationService/Create.
Создайте привязку
Привязка — это связь, настроенная между федерацией сервисных аккаунтов, одним сервисным аккаунтом Yandex Cloud и одним внешним субъектом. Привязки необходимы для идентификации внешних субъектов в Yandex Identity and Access Management.
Примечание
-
В консоли управления
выберите каталог, в котором находится сервисный аккаунтПри необходимости создайте новый сервисный аккаунт.
-
В списке сервисов выберите Identity and Access Management.
-
В списке выберите нужный сервисный аккаунт.
-
Перейдите на вкладку Федерации сервисных аккаунтов.
-
Нажмите кнопку Привязать к федерации.
-
В поле Федерация сервисных аккаунтов выберите ранее созданную федерацию.
-
В поле Значение Subject (sub) укажите идентификатор внешнего субъекта.
Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
-
Нажмите кнопку Привязать.
-
Посмотрите описание команды создания привязки:
yc iam workload-identity federated-credential create --help
-
Создайте привязку, указав идентификатор нужного сервисного аккаунта:
yc iam workload-identity federated-credential create \ --service-account-id <идентификатор_сервисного_аккаунта> \ --federation-id <идентификатор_федерации> \ --external-subject-id "<идентификатор_внешнего_субъекта>"
Где:
-
--service-account-id
— идентификатор сервисного аккаунта Yandex Cloud.Сервисный аккаунт может быть расположен в каталоге, отличном от каталога федерации сервисных аккаунтов.
-
--federation-id
— идентификатор федерации сервисных аккаунтов, полученный на предыдущем шаге. -
--external-subject-id
— идентификатор внешнего субъекта.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
Результат:
id: aje401v1sup8******** service_account_id: ajek7v5j65cg******** federation_id: aje2c4qv19lf******** external_subject_id: project_path:root/test-iam-wlif:ref_type:branch:ref:master created_at: "2024-12-28T16:33:47.057632267Z"
Подробнее о команде
yc iam workload-identity federated-credential create
см. в справочнике CLI. -
-
Опишите в конфигурационном файле Terraform параметры привязки, которую необходимо создать:
resource "yandex_iam_workload_identity_federated_credential" "fc" { service_account_id = "<идентификатор_сервисного_аккаунта>" federation_id = "<идентификатор_федерации>" external_subject_id = "<идентификатор_внешнего_субъекта>" }
Где:
-
service_account_id
— идентификатор сервисного аккаунта Yandex Cloud.Сервисный аккаунт может быть расположен в каталоге, отличном от каталога федерации сервисных аккаунтов.
-
federation_id
— идентификатор федерации сервисных аккаунтов. -
external_subject_id
— идентификатор внешнего субъекта.Чтобы узнать это значение, обратитесь к документации или в службу технической поддержки используемого OIDC-провайдера.
Более подробную информацию о параметрах ресурса
yandex_iam_workload_identity_federated_credential
в Terraform, см. в документации провайдера . -
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
Terraform создаст указанную привязку. Убедиться в создании привязки для сервисного аккаунта можно в консоли управления
или с помощью команды CLI:yc iam workload-identity federated-credential list \ --service-account-id <идентификатор_сервисного_аккаунта>
-
Чтобы создать привязку, воспользуйтесь методом REST API create для ресурса FederatedCredential или вызовом gRPC API FederatedCredentialService/Create.
Обменяйте JWT-токен на IAM-токен сервисного аккаунта
Отправьте запрос к сервису обмена токенов Yandex Cloud:
POST https://auth.yandex.cloud/oauth/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:token-exchange&
requested_token_type=urn:ietf:params:oauth:token-type:access_token&
audience=<идентификатор_сервисного_аккаунта>&
subject_token=<JWT-токен>&
subject_token_type=urn:ietf:params:oauth:token-type:id_token
Где:
grant_type
— тип запроса, имеет фиксированное значениеurn:ietf:params:oauth:grant-type:token-exchange
.requested_token_type
— тип запрашиваемого токена, имеет фиксированное значениеurn:ietf:params:oauth:token-type:access_token
.audience
— идентификатор сервисного аккаунта Yandex Cloud.subject_token
— JWT-токен внешнего субъекта.subject_token_type
— тип токена внешнего субъекта, имеет фиксированное значениеurn:ietf:params:oauth:token-type:id_token
.
Результат:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "t1.9euelZqZlJyXlJGNno6JlIzGmsyUzO3rnpWazY6elMidm8-Nk8iPlZyZkJLl8_d_IUBE-e8AIgRS_d3z9z9QPUT57wAiBFL9zef1656Vmo2RyZqOm5KSj82KkZHNi5WL7_zN5_XrnpWaj46TnZvNksmNks2dj43MmJPv-MXrnpWajZHJmo6bkpKPzYqRkc2LlYu9656Vmp2PyJqYnprLk8aRxpqXzZbPteuGnNGWnpLRkI********************",
"token_type": "Bearer",
"expires_in": 43200
}
Где значение поля access_token
— запрашиваемый IAM-токен сервисного аккаунта, который вы можете использовать для аутентификации при выполнении действий в API Yandex Cloud.