Настройка прав доступа к сервисному аккаунту
Этот раздел про назначение роли на сервисный аккаунт как на ресурс. Чтобы выдать роль сервисному аккаунту на другой ресурс, воспользуйтесь инструкцией Назначение роли сервисному аккаунту.
Примечание
Чтобы назначить роль на сервисный аккаунт, нужна роль iam.serviceAccounts.admin.
Назначить роль на сервисный аккаунт
- В консоли управления
на панели сверху нажмите или и выберите каталог, которому принадлежит сервисный аккаунт. - Перейдите
в сервис Identity and Access Management. - На панели слева выберите
Сервисные аккаунты и выберите нужный сервисный аккаунт. - Перейдите на вкладку Права доступа.
- Нажмите Назначить роли.
- В окне Выдача доступа в поле Кому выдать доступ выберите субъект или воспользуйтесь поиском.
- Нажмите
Добавить роль и выберите роль. - Нажмите Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.
-
Посмотрите описание команды для назначения роли на сервисный аккаунт как на ресурс:
yc iam service-account add-access-binding --help -
Узнайте идентификатор роли:
yc iam role listРезультат:
+-------------------------------------+-------------+ | ID | DESCRIPTION | +-------------------------------------+-------------+ | access-transparency.admin | | | access-transparency.billingProvider | | | access-transparency.editor | | | ... | | -
Назначьте субъекту роль на сервисный аккаунт:
yc iam service-account add-access-binding <имя_или_идентификатор_сервисного_аккаунта> \ --role <идентификатор_роли> \ --subject <тип_субъекта>:<идентификатор_субъекта>Где:
-
--role— идентификатор роли, которую нужно назначить. -
--subject— обозначение субъекта, которому назначается роль.Обозначения субъектов
Для обозначения субъекта используется параметр
--subjectсо значением в формате<тип_субъекта>:<идентификатор>. Для некоторых типов субъектов в Yandex Cloud CLI вместо--subjectдоступны отдельные параметры, в которых достаточно указать имя или идентификатор субъекта без типа. Возможные обозначения субъектов и соответствующие параметры CLI:Тип субъекта
Обозначение субъекта
Параметр Yandex Cloud CLI
userAccountuserAccount:<идентификатор_пользователя>--user-account-idили--user-yandex-loginserviceAccountserviceAccount:<идентификатор_сервисного_аккаунта>--service-account-idили--service-account-namefederatedUserfederatedUser:<идентификатор_пользователя>--user-account-idgroupgroup:<идентификатор_группы>--group-memberssystemsystem:allAuthenticatedUsers(группа
All authenticated users)--all-authenticated-userssystem:allUsers(группа
All users)—
system:group:organization:<идентификатор_организации>:users(группа
All users in organization X)--organization-userssystem:group:federation:<идентификатор_федерации>:users(группа
All users in federation N)--federation-userssystem:group:userpool:<идентификатор_пула>:users(группа
All users in userpool P)—
-
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, аутентифицируйтесь соответствующим способом.
-
Опишите в конфигурационном файле ресурс с ролью на организацию.
Пример структуры конфигурационного файла:
resource "yandex_iam_service_account_iam_binding" "admin-account-iam" { service_account_id = "<идентификатор_сервисного_аккаунта>" role = "<роль>" members = ["<субъект_1>","<субъект_2>,...,<субъект_n>"] }Где:
-
service_account_id— идентификатор сервисного аккаунта, к которому нужно настроить доступ. -
role— назначаемая роль. -
members— обозначения субъектов, которым назначается роль.Обозначения субъектов
Для обозначения субъекта используется комбинация типа и уникального идентификатора —
<тип_субъекта>:<идентификатор>. Возможные обозначения субъектов:Тип субъекта
Обозначение субъекта
userAccountuserAccount:<идентификатор_пользователя>serviceAccountserviceAccount:<идентификатор_сервисного_аккаунта>federatedUserfederatedUser:<идентификатор_пользователя>groupgroup:<идентификатор_группы>systemsystem:allAuthenticatedUsers(группа
All authenticated users)system:allUsers(группа
All users)system:group:organization:<идентификатор_организации>:users(группа
All users in organization X)system:group:federation:<идентификатор_федерации>:users(группа
All users in federation N)system:group:userpool:<идентификатор_пула>:users(группа
All users in userpool P)
Подробнее о ресурсах, которые вы можете создать с помощью Terraform, читайте в документации провайдера.
-
-
Проверьте корректность настроек.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Назначьте роль.
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить создание ресурса можно в консоли управления
или с помощью команды CLI:yc resource-manager service-account list-access-bindings <имя_или_идентификатор_сервисного_аккаунта> -
Воспользуйтесь методом REST API updateAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/UpdateAccessBindings. Вам понадобится идентификатор сервисного аккаунта и идентификатор субъекта, которому назначается роль на сервисный аккаунт.
-
Узнайте идентификатор сервисного аккаунта с помощью метода REST API list:
curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts?folderId=<идентификатор_каталога>Результат:
{ "serviceAccounts": [ { "id": "aje6o61dvog2********", "folderId": "b1gvmob95yys********", "createdAt": "2018-10-19T13:26:29Z", "name": "my-robot" } ... ] } -
Назначьте субъекту роль на сервисный аккаунт, в свойстве
actionукажитеADD:curl \ --request POST \ --header 'Content-Type: application/json' \ --header "Authorization: Bearer <IAM-токен>" \ --data '{ "accessBindingDeltas": [{ "action": "ADD", "accessBinding": { "roleId": "<роль>", "subject": { "id": "<идентификатор_субъекта>", "type": "<тип_субъекта>" }}}]}' \ https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts/<идентификатор_сервисного_аккаунта>:updateAccessBindingsГде:
-
roleId— назначаемая роль. -
subject— субъект, которому назначается роль.Обозначения субъектов
Для обозначения субъекта используется комбинация типа и уникального идентификатора в полях запроса
subject.typeиsubject.id. Возможные комбинации:subject.type
subject.id
userAccount<идентификатор_пользователя>serviceAccount<идентификатор_сервисного_аккаунта>federatedUser<идентификатор_пользователя>group<идентификатор_группы>systemallAuthenticatedUsers(группа
All authenticated users)allUsers(группа
All users)group:organization:<идентификатор_организации>:users(группа
All users in organization X)group:federation:<идентификатор_федерации>:users(группа
All users in federation N)group:userpool:<идентификатор_пула>:users(группа
All users in userpool P) -
<идентификатор_сервисного_аккаунта>— идентификатор сервисного аккаунта, к которому нужно настроить доступ.
-
Примеры
- Настроить доступ пользователя к сервисному аккаунту.
- Назначить несколько ролей.
- Настроить доступ сервисного аккаунта к другому сервисному аккаунту.
Настроить доступ пользователя к сервисному аккаунту
- В консоли управления
на панели сверху нажмите или и выберите каталог, которому принадлежит сервисный аккаунт. - Перейдите
в сервис Identity and Access Management. - На панели слева выберите
Сервисные аккаунты и выберите нужный сервисный аккаунт. - Перейдите на вкладку Права доступа.
- Нажмите Назначить роли.
- В окне Выдача доступа в поле Кому выдать доступ выберите пользователя из списка или воспользуйтесь поиском по пользователям.
- Нажмите
Добавить роль и выберите роль. - Нажмите Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
Назначьте пользователю test-user роль editor на сервисный аккаунт my-robot:
```bash
yc iam service-account add-access-binding my-robot \
--role editor \
--user-yandex-login test-user
```
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, аутентифицируйтесь соответствующим способом.
-
Добавьте в конфигурационный файл параметры ресурса и укажите роль пользователей для доступа к сервисному аккаунту.
Пример структуры конфигурационного файла:
resource "yandex_iam_service_account_iam_binding" "admin-account-iam" { service_account_id = "aje6o61dvog2********" role = "editor" members = ["userAccount:gfei8n54hmfh********",] }Где:
service_account_id— идентификатор сервисного аккаунта, к которому нужно настроить доступ.role— назначаемая роль.members— список пользователей, которым назначается роль. Указывается в видеuserAccount:<идентификатор_пользователя>.
Подробнее о ресурсах, которые вы можете создать с помощью Terraform, читайте в документации провайдера.
-
Проверьте корректность настроек.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Назначьте роль.
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить создание ресурса можно в консоли управления
или с помощью команды CLI:yc resource-manager service-account list-access-bindings <имя_или_идентификатор_сервисного_аккаунта> -
Воспользуйтесь методом REST API updateAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/UpdateAccessBindings. Вам понадобится идентификатор сервисного аккаунта и идентификатор пользователя, которому назначается роль на сервисный аккаунт.
-
Узнайте идентификатор сервисного аккаунта с помощью метода REST API list:
curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts?folderId=b1gvmob95yys********Результат:
{ "serviceAccounts": [ { "id": "aje6o61dvog2********", "folderId": "b1gvmob95yys********", "createdAt": "2018-10-19T13:26:29Z", "name": "my-robot" } ... ] } -
Узнайте идентификатор пользователя по логину с помощью метода REST API getByLogin:
curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.yandexcloud.kz/iam/v1/yandexPassportUserAccounts:byLogin?login=test-userРезультат:
{ "id": "gfei8n54hmfh********", "yandexPassportUserAccount": { "login": "test-user", "defaultEmail": "test-user@yandex.ru" } } -
Назначьте пользователю роль
editorна сервисный аккаунтmy-robot. В свойствеactionукажитеADD, а в свойствеsubject- типuserAccountи идентификатор пользователя:curl \ --request POST \ --header 'Content-Type: application/json' \ --header "Authorization: Bearer <IAM-токен>" \ --data '{ "accessBindingDeltas": [{ "action": "ADD", "accessBinding": { "roleId": "editor", "subject": { "id": "gfei8n54hmfh********", "type": "userAccount" }}}]}' \ https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts/aje6o61dvog2********:updateAccessBindings
Назначить несколько ролей
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
Команда add-access-binding позволяет добавить только одну роль. Вы можете назначить несколько ролей с помощью команды set-access-binding.
Внимание
Команда set-access-binding полностью перезаписывает права доступа к ресурсу! Все текущие роли на ресурс будут удалены.
-
Убедитесь, что на ресурс не назначены роли, которые вы не хотите потерять:
yc iam service-account list-access-bindings my-robot -
Назначьте роль нескольким пользователям:
yc iam service-account set-access-bindings my-robot \ --access-binding role=editor,subject=userAccount:gfei8n54hmfh******** \ --access-binding role=viewer,subject=userAccount:helj89sfj80a********
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, аутентифицируйтесь соответствующим способом.
Чтобы назначить несколько ролей на сервисный аккаунт, созданный с помощью Terraform:
-
Добавьте в конфигурационный файл параметры ресурса и укажите роль пользователей для доступа к сервисному аккаунту:
-
service_account_id— идентификатор сервисного аккаунта, к которому нужно настроить доступ. -
role— назначаемая роль.Примечание
Для каждой роли можно использовать только один ресурс
yandex_iam_service_account_iam_binding. -
members— список пользователей и сервисных аккаунтов, которым назначается роль. Указывается в видеuserAccount:<идентификатор_пользователя>илиserviceAccount:<идентификатор_сервисного_аккаунта>.
Пример назначения нескольких ролей на сервисный аккаунт с помощью Terraform
... resource "yandex_iam_service_account_iam_binding" "admin-account-iam" { service_account_id = "aje82upckiqh********" role = "admin" members = [ "userAccount:aje82upckiqh********", ] } resource "yandex_iam_service_account_iam_binding" "admin-account-iam2" { service_account_id = "aje82upckiqh********" role = "viewer" members = [ "userAccount:aje82upckiqh********", ] } ...Подробнее о ресурсах, которые вы можете создать с помощью Terraform, читайте в документации провайдера.
-
-
Проверьте корректность настроек.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Назначьте роль.
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Проверить изменение каталога можно в консоли управления
или с помощью команды CLI:yc resource-manager service-account list-access-bindings <имя_или_идентификатор_сервисного_аккаунта> -
Назначьте одному пользователю роль editor, а другому viewer:
curl \
--request POST \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer <IAM-токен>" \
--data '{
"accessBindingDeltas": [{
"action": "ADD",
"accessBinding": {
"roleId": "editor",
"subject": {
"id": "gfei8n54hmfh********",
"type": "userAccount"
}
}
},{
"action": "ADD",
"accessBinding": {
"roleId": "viewer",
"subject": {
"id": "helj89sfj80a********",
"type": "userAccount"
}}}]}' \
https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts/aje6o61dvog2********:updateAccessBindings
Вы также можете назначать роли с помощью метода REST API setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
Внимание
Метод setAccessBindings полностью перезаписывает права доступа к ресурсу! Все текущие роли на ресурс будут удалены.
curl \
--request POST \
--header 'Content-Type: application/json' \
--header "Authorization: Bearer <IAM-токен>" \
--data '{
"accessBindings": [{
"roleId": "editor",
"subject": { "id": "ajei8n54hmfh********", "type": "userAccount" }
},{
"roleId": "viewer",
"subject": { "id": "helj89sfj80a********", "type": "userAccount" }
}]}' \
https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts/aje6o61dvog2********:setAccessBindings
Настроить доступ сервисного аккаунта к другому сервисному аккаунту
Разрешите сервисному аккаунту test-sa управлять сервисным аккаунтом my-robot:
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
-
Узнайте идентификатор сервисного аккаунта
test-sa, которому вы хотите назначить роль. Чтобы узнать идентификатор, получите список доступных сервисных аккаунтов:yc iam service-account listРезультат:
+----------------------+----------+------------------+ | ID | NAME | DESCRIPTION | +----------------------+----------+------------------+ | ajebqtreob2d******** | test-sa | test-description | | aje6o61dvog2******** | my-robot | | +----------------------+----------+------------------+ -
Назначьте роль
editorсервисному аккаунтуtest-sa, указав его идентификатор:yc iam service-account add-access-binding my-robot \ --role editor \ --service-account-id ajebqtreob2d********
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы управлять инфраструктурой с помощью Terraform от имени сервисного аккаунта или пользовательских аккаунтов: аккаунта на Яндексе, федеративного аккаунта и локального пользователя, аутентифицируйтесь соответствующим способом.
Чтобы разрешить сервисному аккаунту test-sa управлять сервисным аккаунтом my-robot, созданным при помощи Terraform:
-
Добавьте в конфигурационный файл параметры ресурса и укажите роль пользователей для доступа к сервисному аккаунту:
service_account_id— идентификатор сервисного аккаунта, к которому нужно настроить доступ.role— назначаемая роль.members— список пользователей и сервисных аккаунтов, которым назначается роль. Указывается в видеuserAccount:<идентификатор_пользователя>илиserviceAccount:<идентификатор_сервисного_аккаунта>.
Пример разрешения сервисному аккаунту
test-saуправлять сервисным аккаунтомmy-robotс помощью Terraform... resource "yandex_iam_service_account_iam_binding" "admin-account-iam" { service_account_id = "aje82upckiqh********" role = "admin" members = [ "serviceAccount:aje82upckiqh********", ] } ...Подробнее о ресурсах, которые вы можете создать с помощью Terraform, читайте в документации провайдера.
-
Проверьте корректность настроек.
-
В командной строке перейдите в каталог, в котором расположены актуальные конфигурационные файлы Terraform с планом инфраструктуры.
-
Выполните команду:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
-
Назначьте роль.
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Проверить изменение каталога можно в консоли управления
или с помощью команды CLI:yc resource-manager service-account list-access-bindings <имя_или_идентификатор_сервисного_аккаунта> -
-
Узнайте идентификатор сервисного аккаунта
test-sa, которому вы хотите назначить роль. Чтобы узнать идентификатор, получите список доступных сервисных аккаунтов:curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts?folderId=b1gvmob95yys********Результат:
{ "serviceAccounts": [ { "id": "ajebqtreob2d********", "folderId": "b1gvmob95yys********", "createdAt": "2018-10-18T13:42:40Z", "name": "test-sa", "description": "test-description" }, { "id": "aje6o61dvog2********", "folderId": "b1gvmob95yys********", "createdAt": "2018-10-15T18:01:25Z", "name": "my-robot" } ] } -
Назначьте сервисному аккаунту
test-saрольeditorна другой сервисный аккаунтmy-robot. В свойствеsubjectукажите типserviceAccountи идентификаторtest-sa. В URL запроса в качестве ресурса укажите идентификаторmy-robot:curl \ --request POST \ --header 'Content-Type: application/json' \ --header "Authorization: Bearer <IAM-токен>" \ --data '{ "accessBindingDeltas": [{ "action": "ADD", "accessBinding": { "roleId": "editor", "subject": { "id": "ajebqtreob2d********", "type": "serviceAccount" }}}]}' \ https://iam.api.yandexcloud.kz/iam/v1/serviceAccounts/aje6o61dvog2********:updateAccessBindings