Настройка прав доступа к сервисному аккаунту

Этот раздел про назначение роли на сервисный аккаунт как на ресурс. Чтобы выдать роль сервисному аккаунту на другой ресурс, воспользуйтесь инструкцией Назначение роли сервисному аккаунту.

Через консоль управления нельзя установить права доступа к сервисному аккаунту. Вы можете назначить роль на каталог, которому принадлежит сервисный аккаунт.

Назначить роль на сервисный аккаунт

По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью флага --folder-name или --folder-id.

  1. Посмотрите описание команды для назначения роли на сервисный аккаунт как на ресурс:

    $ yc iam service-account add-access-binding --help
    
  2. Выберите сервисный аккаунт, например my-robot:

    $ yc iam service-account list
    +----------------------+----------+------------------+
    |          ID          |   NAME   |   DESCRIPTION    |
    +----------------------+----------+------------------+
    | ajebqtreob2dpblin8pe | test-sa  | test-description |
    | aje6o61dvog2h6g9a33s | my-robot |                  |
    +----------------------+----------+------------------+
    
  3. Выберите роль:

    $ yc iam role list
    +--------------------------------+-------------+
    |               ID               | DESCRIPTION |
    +--------------------------------+-------------+
    | admin                          |             |
    | compute.images.user            |             |
    | editor                         |             |
    | ...                            |             |
    +--------------------------------+-------------+
    
  4. Узнайте ID пользователя по логину или адресу электронной почты. Чтобы назначить роль не пользователю, а сервисному аккаунту или группе пользователей, воспользуйтесь примерами ниже.

    $ yc iam user-account get test-user
    id: gfei8n54hmfhuk5nogse
    yandex_passport_user_account:
        login: test-user
        default_email: test-user@yandex.ru
    
  5. Назначьте пользователю test-user роль editor на сервисный аккаунт my-robot. В субъекте укажите тип userAccount и ID пользователя:

    $ yc iam service-account add-access-binding my-robot \
        --role editor \
        --subject userAccount:gfei8n54hmfhuk5nogse
    

Воспользуйтесь методом updateAccessBindings для ресурса ServiceAccount. Вам понадобится ID сервисного аккаунта и ID пользователя, которому назначается роль на сервисный аккаунт.

  1. Узнайте ID сервисного аккаунта с помощью метода list:

    $ curl -H "Authorization: Bearer <IAM-TOKEN>" \
        https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts?folderId=b1gvmob95yysaplct532
    
    {
     "serviceAccounts": [
      {
       "id": "aje6o61dvog2h6g9a33s",
       "folderId": "b1gvmob95yysaplct532",
       "createdAt": "2018-10-19T13:26:29Z",
       "name": "my-robot"
      }
      ...
     ]
    }
    
  2. Узнайте ID пользователя по логину с помощью метода getByLogin:

    $ curl -H "Authorization: Bearer <IAM-TOKEN>" \
        https://iam.api.cloud.yandex.net/iam/v1/yandexPassportUserAccounts:byLogin?login=test-user
    
    {
     "id": "gfei8n54hmfhuk5nogse",
     "yandexPassportUserAccount": {
      "login": "test-user",
      "defaultEmail": "test-user@yandex.ru"
     }
    }
    
  3. Назначьте пользователю роль editor на сервисный аккаунт my-robot. В свойстве action укажите ADD, а в свойстве subject - тип userAccount и ID пользователя:

    $ curl -X POST \
        -H 'Content-Type: application/json' \
        -H "Authorization: Bearer <IAM-TOKEN>" \
        -d '{
        "accessBindingDeltas": [{
            "action": "ADD",
            "accessBinding": {
                "roleId": "editor",
                "subject": {
                    "id": "gfei8n54hmfhuk5nogse",
                    "type": "userAccount"
        }}}]}' \
        https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2h6g9a33s:updateAccessBindings
    

Примеры

Назначить несколько ролей

Команда add-access-binding позволяет добавить только одну роль. Вы можете назначить несколько ролей с помощью команды set-access-binding.

Предупреждение

Команда set-access-binding полностью перезаписывает права доступа к ресурсу! Все текущие роли на ресурс будут удалены.

  1. Убедитесь, что на ресурс не назначено ролей, которые вы не хотите потерять:
    $ yc iam service-account list-access-binding my-robot
    
  2. Например, назначьте роль нескольким пользователям:
    $ yc iam service-account set-access-bindings my-robot \
        --access-binding role=editor,subject=userAccount:gfei8n54hmfhuk5nogse
        --access-binding role=viewer,subject=userAccount:helj89sfj80aj24nugsz
    

Назначьте одному пользователю роль editor, а другому viewer:

$ curl -X POST \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer <IAM-TOKEN>" \
    -d '{
    "accessBindingDeltas": [{
        "action": "ADD",
        "accessBinding": {
            "roleId": "editor",
            "subject": {
                "id": "gfei8n54hmfhuk5nogse",
                "type": "userAccount"
            }
        }
    },{
        "action": "ADD",
        "accessBinding": {
            "roleId": "viewer",
            "subject": {
                "id": "helj89sfj80aj24nugsz",
                "type": "userAccount"
    }}}]}' \
    https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2h6g9a33s:updateAccessBindings

Вы также можете назначать роли с помощью метода setAccessBindings.

Предупреждение

Метод setAccessBindings полностью перезаписывает права доступа к ресурсу! Все текущие роли на ресурс будут удалены.

curl -X POST \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer <IAM-TOKEN>" \
    -d '{
    "accessBindings": [{
        "roleId": "editor",
        "subject": { "id": "ajei8n54hmfhuk5nog0g", "type": "userAccount" }
    },{
        "roleId": "viewer",
        "subject": { "id": "helj89sfj80aj24nugsz", "type": "userAccount" }
    }]}' \
    https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2h6g9a33s:setAccessBindings

Доступ сервисного аккаунта к другому сервисному аккаунту

Разрешите сервисному аккаунту test-sa управлять сервисным аккаунтом my-robot:

  1. Узнайте ID сервисного аккаунта test-sa, которому вы хотите назначить роль. Чтобы узнать ID, получите список доступных сервисных аккаунтов:

    $ yc iam service-account list
    +----------------------+----------+------------------+
    |          ID          |   NAME   |   DESCRIPTION    |
    +----------------------+----------+------------------+
    | ajebqtreob2dpblin8pe | test-sa  | test-description |
    | aje6o61dvog2h6g9a33s | my-robot |                  |
    +----------------------+----------+------------------+
    
  2. Назначьте роль editor сервисному аккаунту test-sa, указав его ID. В типе субъекта укажите serviceAccount:

    $ yc iam service-account add-access-binding my-robot \
        --role editor \
        --subject serviceAccount:ajebqtreob2dpblin8pe
    
  1. Узнайте ID сервисного аккаунта test-sa, которому вы хотите назначить роль. Чтобы узнать ID, получите список доступных сервисных аккаунтов:

    $ curl -H "Authorization: Bearer <IAM-TOKEN>" \
        https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts?folderId=b1gvmob95yysaplct532
    
    {
     "serviceAccounts": [
      {
       "id": "ajebqtreob2dpblin8pe",
       "folderId": "b1gvmob95yysaplct532",
       "createdAt": "2018-10-18T13:42:40Z",
       "name": "test-sa",
       "description": "test-description"
      },
      {
       "id": "aje6o61dvog2h6g9a33s",
       "folderId": "b1gvmob95yysaplct532",
       "createdAt": "2018-10-15T18:01:25Z",
       "name": "my-robot"
      }
     ]
    }
    
  2. Назначьте сервисному аккаунту test-sa роль editor на другой сервисный аккаунт my-robot. В свойстве subject укажите тип serviceAccount и ID test-sa. В URL запроса в качестве ресурса укажите ID my-robot:

$ curl -X POST \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer <IAM-TOKEN>" \
    -d '{
    "accessBindingDeltas": [{
        "action": "ADD",
        "accessBinding": {
            "roleId": "editor",
            "subject": {
                "id": "ajebqtreob2dpblin8pe",
                "type": "serviceAccount"
    }}}]}' \
    https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2h6g9a33s:updateAccessBindings

Доступ к ресурсу всем пользователям

Вы можете предоставить публичный доступ к ресурсу. Для этого назначьте роль системной группе allAuthenticatedUsers или allUsers.

Системной группе можно назначить любые роли, кроме resource-manager.clouds.owner и resource-manager.clouds.member.

Предупреждение

Не назначайте системной группе роли editor и admin на каталог или облако. Это позволит любому, кто узнает идентификатор каталога, пользоваться Яндекс.Облаком за ваш счет.

Например, разрешите любому прошедшему аутентификацию пользователю просматривать информацию о сервисном аккаунте my-robot:

Назначьте роль viewer системной группе allAuthenticatedUsers. В типе субъекта укажите system:

$ yc iam service-account add-access-binding my-robot \
    --role viewer \
    --subject system:allAuthenticatedUsers

Назначьте роль viewer системной группе allAuthenticatedUsers. В свойстве subject укажите тип system:

$ curl -X POST \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer <IAM-TOKEN>" \
    -d '{
    "accessBindingDeltas": [{
        "action": "ADD",
        "accessBinding": {
            "roleId": "viewer",
            "subject": {
                "id": "allAuthenticatedUsers",
                "type": "system"
    }}}]}' \
    https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts/aje6o61dvog2h6g9a33s:updateAccessBindings