Настройка прав доступа к сервисному аккаунту
Этот раздел про назначение роли на сервисный аккаунт как на ресурс. Чтобы выдать роль сервисному аккаунту на другой ресурс, воспользуйтесь инструкцией Назначение роли сервисному аккаунту.
Примечание
Чтобы назначить роль на сервисный аккаунт, нужна роль iam.serviceAccounts.admin
.
Назначить роль на сервисный аккаунт
- В консоли управления
перейдите в каталог, которому принадлежит сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- На панели слева выберите
Сервисные аккаунты и выберите нужный сервисный аккаунт. - Перейдите на вкладку Права доступа.
- Нажмите кнопку Назначить роли.
- В окне Настройка прав доступа нажмите кнопку Выбрать пользователя.
- Выберите пользователя из списка или воспользуйтесь поиском по пользователям.
- Нажмите кнопку Добавить роль.
- Выберите роль.
- Нажмите кнопку Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Посмотрите описание команды для назначения роли на сервисный аккаунт как на ресурс:
yc iam service-account add-access-binding --help
-
Выберите сервисный аккаунт, например
my-robot
:yc iam service-account list
Результат:
+----------------------+----------+------------------+ | ID | NAME | DESCRIPTION | +----------------------+----------+------------------+ | ajebqtreob2d******** | test-sa | test-description | | aje6o61dvog2******** | my-robot | | +----------------------+----------+------------------+
-
Выберите роль:
yc iam role list
Результат:
+--------------------------------+-------------+ | ID | DESCRIPTION | +--------------------------------+-------------+ | admin | | | compute.images.user | | | editor | | | ... | | +--------------------------------+-------------+
-
Узнайте ID пользователя по логину или адресу электронной почты. Чтобы назначить роль не пользователю, а сервисному аккаунту или группе пользователей, воспользуйтесь примерами ниже.
yc iam user-account get test-user
Результат:
id: gfei8n54hmfh******** yandex_passport_user_account: login: test-user default_email: test-user@yandex.ru
-
Назначьте пользователю
test-user
рольeditor
на сервисный аккаунтmy-robot
. В субъекте укажите типuserAccount
и ID пользователя:yc iam service-account add-access-binding my-robot \ --role editor \ --subject userAccount:gfei8n54hmfh********
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Добавьте в конфигурационный файл параметры ресурса и укажите роль пользователей для доступа к сервисному аккаунту:
service_account_id
— идентификатор сервисного аккаунта, к которому нужно настроить доступ.role
— назначаемая роль. Обязательный параметр.members
— список пользователей и сервисных аккаунтов, которым назначается роль. Указывается в видеuserAccount:<идентификатор_пользователя>
илиserviceAccount:<идентификатор_сервисного_аккаунта>
. Обязательный параметр.
Пример структуры конфигурационного файла:
resource "yandex_iam_service_account_iam_binding" "admin-account-iam" { service_account_id = "<идентификатор_сервисного_аккаунта>" role = "<роль>" members = [ "federatedUser:<идентификатор_пользователя>", ] }
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера
. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов: введите в терминал слово
yes
и нажмите Enter.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить создание ресурса можно в консоли управления
или с помощью команды CLI:yc resource-manager service-account list-access-bindings <имя_или_идентификатор_сервисного_аккаунта>
-
Воспользуйтесь методом REST API updateAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/UpdateAccessBindings. Вам понадобится ID сервисного аккаунта и ID пользователя, которому назначается роль на сервисный аккаунт.
-
Узнайте ID сервисного аккаунта с помощью метода REST API list:
curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts?folderId=b1gvmob95yys********
Результат:
{ "serviceAccounts": [ { "id": "aje6o61dvog2********", "folderId": "b1gvmob95yys********", "createdAt": "2018-10-19T13:26:29Z", "name": "my-robot" } ... ] }
-
Узнайте ID пользователя по логину с помощью метода REST API getByLogin:
curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.cloud.yandex.net/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
и ID пользователя: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.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2********:updateAccessBindings
Примеры
- Назначить несколько ролей.
- Настроить имперсонацию.
- Настроить доступ сервисного аккаунта к другому сервисному аккаунту.
Назначить несколько ролей
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
Команда 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:
-
Добавьте в конфигурационный файл параметры ресурса и укажите роль пользователей для доступа к сервисному аккаунту:
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 validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминал слово
yes
и нажмите Enter.Проверить изменение каталога можно в консоли управления
или с помощью команды 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.cloud.yandex.net/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.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2********:setAccessBindings
Настроить имперсонацию
Имперсонация позволяет пользователю выполнять действия от имени сервисного аккаунта с помощью флага --impersonate-service-account-id
. Для этого у сервисного аккаунта должны быть нужные права, а у пользователя — роль iam.serviceAccounts.tokenCreator
.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
-
Узнайте ID сервисного аккаунта, например,
test-sa
, которому вы хотите назначить роль. Чтобы узнать ID, получите список доступных сервисных аккаунтов (в профиле администратора):yc iam service-account list
Результат:
+----------------------+----------+------------------+ | ID | NAME | DESCRIPTION | +----------------------+----------+------------------+ | ajebqtreob2d******** | test-sa | test-description | | aje6o61dvog2******** | my-robot | | +----------------------+----------+------------------+
-
Назначьте сервисному аккаунту
test-sa
рольviewer
на каталогmy-folder
. В типе субъекта укажитеserviceAccount
, а в значении — ID сервисного аккаунта (в профиле администратора):yc resource-manager folder add-access-binding my-folder \ --role viewer \ --subject serviceAccount:ajebqtreob2d********
-
Получите ID пользователя и назначьте ему роль
iam.serviceAccounts.tokenCreator
на сервисный аккаунтtest-sa
(в профиле администратора):yc iam service-account add-access-binding test-sa \ --role iam.serviceAccounts.tokenCreator \ --subject userAccount:gfei8n54hmfh********
-
Пользователь может выполнить команду от имени сервисного аккаунта
test-sa
с помощью флага--impersonate-service-account-id
.Например, пользователь может получить список виртуальных машин в каталоге
my-folder
:yc compute instance list --folder-name my-folder \ --impersonate-service-account-id ajebqtreob2d********
Также пользователь может получить IAM-токен сервисного аккаунта
test-sa
для кратковременного доступа:yc iam create-token --impersonate-service-account-id ajebqtreob2d********
Срок действия полученного токена закончится автоматически.
-
Если доступ больше не нужен пользователю, отзовите роль у сервисного аккаунта (в профиле администратора):
yc resource-manager folder remove-access-binding my-folder \ --role viewer \ --subject serviceAccount:ajebqtreob2d********
-
Отзовите роль
iam.serviceAccounts.tokenCreator
у пользователя, получавшего права сервисного аккаунта:yc iam service-account remove-access-binding test-sa \ --role iam.serviceAccounts.tokenCreator \ --subject userAccount:gfei8n54hmfh********
Настроить доступ сервисного аккаунта к другому сервисному аккаунту
Разрешите сервисному аккаунту test-sa
управлять сервисным аккаунтом my-robot
:
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
-
Узнайте ID сервисного аккаунта
test-sa
, которому вы хотите назначить роль. Чтобы узнать ID, получите список доступных сервисных аккаунтов:yc iam service-account list
Результат:
+----------------------+----------+------------------+ | ID | NAME | DESCRIPTION | +----------------------+----------+------------------+ | ajebqtreob2d******** | test-sa | test-description | | aje6o61dvog2******** | my-robot | | +----------------------+----------+------------------+
-
Назначьте роль
editor
сервисному аккаунтуtest-sa
, указав его ID. В типе субъекта укажитеserviceAccount
:yc iam service-account add-access-binding my-robot \ --role editor \ --subject serviceAccount:ajebqtreob2d********
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы разрешить сервисному аккаунту 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 validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминал слово
yes
и нажмите Enter.Проверить изменение каталога можно в консоли управления
или с помощью команды CLI:yc resource-manager service-account list-access-bindings <имя_или_идентификатор_сервисного_аккаунта>
-
Узнайте ID сервисного аккаунта
test-sa
, которому вы хотите назначить роль. Чтобы узнать ID, получите список доступных сервисных аккаунтов:curl \ --header "Authorization: Bearer <IAM-токен>" \ https://iam.api.cloud.yandex.net/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
и IDtest-sa
. В URL запроса в качестве ресурса укажите IDmy-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.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2********:updateAccessBindings