Назначение роли

Чтобы предоставить доступ к ресурсу, назначьте субъекту роль на сам ресурс или ресурс, от которого наследуются права доступа, например на каталог или облако. Подробнее читайте в разделе Как устроено управление доступом в Яндекс.Облаке.

Назначить роль пользователю

В этом разделе описывается, как назначить роль пользователю с аккаунтом на Яндексе. В примерах ниже описано, как назначить роль сервисному аккаунту, пользователю федерации или всем пользователям сразу.

В консоли управления можно назначить роль только на облако или каталог:

  1. Откройте страницу Управление доступом для выбранного облака. Если необходимо, переключитесь на другое облако.

  2. Выберите пользователя, которому хотите назначить роль, нажмите значок image и выберите Настроить роли.

  3. Для добавления роли на облако нажмите значок image в блоке Роли на облако <имя облака>.

    Для добавления роли на каталог, выберите каталог и нажмите Назначить роль в блоке Роли в каталогах.

  4. Выберите роль из списка.

  1. Выберите роль из списка в разделе Роли.

  2. Получите идентификатор пользователя.

  3. Назначьте роль с помощью команды:

    yc <SERVICE-NAME> <RESOURCE> add-access-binding <RESOURCE-NAME>|<RESOURCE-ID> \
        --role <ROLE-ID> \
        --subject userAccount:<USER-ACCOUNT-ID>
    

    где:

    • <SERVICE-NAME> — имя сервиса, на чей ресурс назначается роль, например resource-manager.
    • <RESOURCE> — категория ресурса, например cloud.
    • <RESOURCE-NAME> — имя ресурса. Вы можете указать ресурс по имени или идентификатору.
    • <RESOURCE-ID> — идентификатор ресурса.
    • <ROLE-ID> — идентификатор роли, например resource-manager.clouds.owner.
    • <USER-ACCOUNT-ID> — идентификатор аккаунта пользователя, которому назначается роль.

    Например, назначьте роль viewer на облако mycloud:

    $ yc resource-manager cloud add-access-binding mycloud \
        --role viewer \
        --subject userAccount:aje6o61dvog2h6g9a33s
    

Воспользуйтесь методом updateAccessBindings для соответствующего ресурса.

  1. Выберите роль из списка в разделе Роли.

  2. Получите идентификатор пользователя.

  3. Сформируйте тело запроса, например в файле body.json. В свойстве action укажите ADD, а в свойстве subject - тип userAccount и идентификатор пользователя:

    body.json:

    {
        "accessBindingDeltas": [{
            "action": "ADD",
            "accessBinding": {
                "roleId": "editor",
                "subject": {
                    "id": "gfei8n54hmfhuk5nogse",
                    "type": "userAccount"
                    }
                }
            }
        ]
    }
    
  4. Назначьте роль, например на каталог с идентификатором b1gvmob95yysaplct532:

    $ export FOLDER_ID=b1gvmob95yysaplct532
    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${IAM_TOKEN}" \
        -d '@body.json' \
        "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/${FOLDER_ID}:updateAccessBindings"
    

Вы можете ознакомиться с подробной инструкцией назначения роли для соответствующего ресурса:

Примеры

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

Воспользуйтесь инструкцией в начале раздела и назначьте пользователю несколько ролей.

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

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

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

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

Например, чтобы назначить несколько ролей на каталог:

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

    body.json:

    {
        "accessBindingDeltas": [{
            "action": "ADD",
            "accessBinding": {
                "roleId": "editor",
                "subject": {
                    "id": "gfei8n54hmfhuk5nogse",
                    "type": "userAccount"
                }
            }
        },{
            "action": "ADD",
            "accessBinding": {
                "roleId": "viewer",
                "subject": {
                    "id": "helj89sfj80aj24nugsz",
                    "type": "userAccount"
                }
            }
        }]
    }
    
  2. Назначьте указанные роли, например на каталог с идентификатором b1gvmob95yysaplct532:

    $ export FOLDER_ID=b1gvmob95yysaplct532
    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${IAM_TOKEN}" \
        -d '@body.json' \
        "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/${FOLDER_ID}:updateAccessBindings"
    

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

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

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

  1. В теле запроса укажите список новых привязок прав доступа.

    body.json:

    {
        "accessBindings": [{
            "roleId": "editor",
            "subject": { "id": "ajei8n54hmfhuk5nog0g", "type": "userAccount" }
        },{
            "roleId": "viewer",
            "subject": { "id": "helj89sfj80aj24nugsz", "type": "userAccount" }
        }]
    }
    
  2. Назначьте роли:

    $ export FOLDER_ID=b1gvmob95yysaplct532
    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${IAM_TOKEN}" \
        -d '@body.json' \
        "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/${FOLDER_ID}:setAccessBindings"
    

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

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

Чтобы назначить сервисному аккаунту роль на каталог, в котором он был создан:

  1. Выберите каталог.
  2. Выберите вкладку Сервисные аккаунты.
  3. Нажмите значок image напротив сервисного аккаунта и выберите Редактировать сервисный аккаунт.
  4. Нажмите Добавить роль и выберите роль.
  5. Нажмите кнопку Сохранить.

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

Чтобы назначить сервисному аккаунту роль на ресурс, выполните команду:

yc <SERVICE-NAME> <RESOURCE> add-access-binding <RESOURCE-NAME>|<RESOURCE-ID> \
    --role <ROLE-ID> \
    --subject serviceAccount:<SERVICE-ACCOUNT-ID>

где:

  • <SERVICE-NAME> — имя сервиса, на чей ресурс назначается роль, например resource-manager.
  • <RESOURCE> — категория ресурса, например cloud.
  • <RESOURCE-NAME> — имя ресурса. Вы можете указать ресурс по имени или идентификатору.
  • <RESOURCE-ID> — идентификатор ресурса.
  • <ROLE-ID> — идентификатор роли, например resource-manager.clouds.owner.
  • <SERVICE-ACCOUNT-ID> — идентификатор сервисного аккаунта, которому назначается роль.

Например, чтобы назначить сервисному аккаунту роль viewer на каталог my-folder:

  1. Узнайте идентификатор сервисного аккаунта по его имени:

    $ yc iam service-account get my-robot
    id: aje6o61dvog2h6g9a33s
    folder_id: b1gvmob95yysaplct532
    created_at: "2018-10-15T18:01:25Z"
    name: my-robot
    

    Если вы не знаете имя сервисного аккаунта, получите список сервисных аккаунтов с их идентификаторами:

    $ yc iam service-account list
    +----------------------+------------------+-----------------+
    |          ID          |       NAME       |   DESCRIPTION   |
    +----------------------+------------------+-----------------+
    | aje6o61dvog2h6g9a33s | my-robot         | my description  |
    +----------------------+------------------+-----------------+
    
  2. Назначьте роль сервисному аккаунту my-robot, используя его идентификатор:

    $ yc resource-manager folder add-access-binding my-folder \
        --role viewer \
        --subject serviceAccount:aje6o61dvog2h6g9a33s
    
  1. Узнайте ID каталога с сервисными аккаунтами.

  2. Получите список сервисных аккаунтов в каталоге, чтобы узнать их идентификаторы:

    $ export FOLDER_ID=b1gvmob95yysaplct532
    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -H "Authorization: Bearer ${IAM_TOKEN}" \
        "https://iam.api.cloud.yandex.net/iam/v1/serviceAccounts?folderId=${FOLDER_ID}"
    
    {
     "serviceAccounts": [
      {
       "id": "ajebqtreob2dpblin8pe",
       "folderId": "b1gvmob95yysaplct532",
       "createdAt": "2018-10-18T13:42:40Z",
       "name": "my-robot",
       "description": "my description"
      }
     ]
    }
    
  3. Сформируйте тело запроса, например в файле body.json. В свойстве action укажите ADD, а в свойстве subject - тип serviceAccount и ID сервисного аккаунта:

    body.json:

    {
        "accessBindingDeltas": [{
            "action": "ADD",
            "accessBinding": {
                "roleId": "editor",
                "subject": {
                    "id": "ajebqtreob2dpblin8pe",
                    "type": "serviceAccount"
                    }
                }
            }
        ]
    }
    
  4. Назначьте роль, например на каталог с идентификатором b1gvmob95yysaplct532:

    $ export FOLDER_ID=b1gvmob95yysaplct532
    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${IAM_TOKEN}" \
        -d '@body.json' \
        "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/${FOLDER_ID}:updateAccessBindings"
    

Доступ к ресурсу для федеративного пользователя

Сейчас федеративному пользователю можно назначить роль только в консоли управления.

Назначение роли происходит так же, как назначение роли пользователю с аккаунтом на Яндексе. Рядом с именем пользователя будет указано имя федерации, к которой он относится.

В консоли управления можно назначить роль только на облако или каталог:

  1. Откройте страницу Управление доступом для выбранного облака. Если необходимо, переключитесь на другое облако.

  2. Выберите пользователя, которому хотите назначить роль, нажмите значок image и выберите Настроить роли.

  3. Для добавления роли на облако нажмите значок image в блоке Роли на облако <имя облака>.

    Для добавления роли на каталог, выберите каталог и нажмите Назначить роль в блоке Роли в каталогах.

  4. Выберите роль из списка.

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

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

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

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

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

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

Назначьте роль viewer на каталог my-folder. В качестве субъекта укажите тип system и идентификатор allAuthenticatedUsers:

$ yc resource-manager folder add-access-binding my-folder \
    --role viewer \
    --subject system:allAuthenticatedUsers
  1. Сформируйте тело запроса, например в файле body.json. В roleId назначьте роль viewer. В свойстве subject укажите тип system и идентификатор allAuthenticatedUsers:

    body.json:

    {
    "accessBindingDeltas": [{
        "action": "ADD",
        "accessBinding": {
            "roleId": "viewer",
            "subject": {
                "id": "allAuthenticatedUsers",
                "type": "system"
                }
            }
        }]
    }
    
  2. Назначьте роль, например на каталог с идентификатором b1gvmob95yysaplct532:

    $ export FOLDER_ID=b1gvmob95yysaplct532
    $ export IAM_TOKEN=CggaATEVAgA...
    $ curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer ${IAM_TOKEN}" \
        -d '@body.json' \
        "https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/${FOLDER_ID}:updateAccessBindings"