Настройка прав доступа к каталогу

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

Назначить роль на каталог

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

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

  3. Выберите каталог в блоке Роли в каталогах и нажмите значок image.
  4. Выберите необходимую роль из списка.
  1. Посмотрите описание команды для назначения роли на каталог:

    $ yc resource-manager folder add-access-binding --help
    
  2. Выберите каталог, например my-folder:

    $ yc resource-manager folder list
    +----------------------+-----------+--------+--------+
    |          ID          |   NAME    | LABELS | STATUS |
    +----------------------+-----------+--------+--------+
    | b1gd129pp9ha0vnvf5g7 | my-folder |        | ACTIVE |
    +----------------------+-----------+--------+--------+
    
  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-folder. В субъекте укажите тип userAccount и ID пользователя:

    $ yc resource-manager folder add-access-binding my-folder \
        --role editor \
        --subject userAccount:gfei8n54hmfhuk5nogse
    

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

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

    $ curl -H "Authorization: Bearer <IAM-TOKEN>" \
        https://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders?cloudId=b1gg8sgd16g7qca5onqs
    
    {
     "folders": [
      {
       "id": "b1g66mft1vopnevbn57j",
       "cloudId": "b1gd129pp9ha0vnvf5g7",
       "createdAt": "2018-10-17T12:44:31Z",
       "name": "my-folder",
       "status": "ACTIVE"
      }
     ]
    }
    
  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-folder. В свойстве 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://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/b1gd129pp9ha0vnvf5g7:updateAccessBindings
    

Примеры

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

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

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

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

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

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

  1. Убедитесь, что на ресурс не назначено ролей, которые вы не хотите потерять:
    $ yc resource-manager folder list-access-binding my-folder
    
  2. Например, назначьте роль нескольким пользователям:
    $ yc resource-manager folder set-access-bindings my-folder \
        --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://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/b1gd129pp9ha0vnvf5g7: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://resource-manager.api.cloud.yandex.net/resource-manager/v1/folders/b1gd129pp9ha0vnvf5g7:setAccessBindings

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

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

Разрешите сервисному аккаунту управлять каталогом и ресурсами в нем:

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

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

Вы можете предоставить публичный доступ к ресурсу. Для этого назначьте роль системной группе 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"
    

Что дальше