README.roles.md 8.1 KB

identity-role-access-matrix

Этот документ описывает новый формат хранения данных о well-known сущностях IAM'а.

Пермишены и сервисные роли хранятся в отдельном каталоге для сервиса, который ими управляет. Например, пермишен compute.instances.start может быть задан в файле compute/permissions.yaml, а роль resource-manager.clouds.member — в файле resource-manager/roles.yaml. Внутри своего каталога команда сервиса может организовать данные как угодно, одним файлом или несколькими, положить их в одном каталоге или раскидать по поддиректориям. Обязательное требование — файлы внутри подкаталогов должны называться permissions.yaml, roles.yaml, stages.yaml, resources.yaml для описания набора прав, ролей, стейджей и типов ресурсов соответсвенно. В каждом файле можно сослаться на сущность из любого другого файла — точно так же, как если бы сущности были описаны рядом, явно ссылаться на файл не нужно.

Если эта документация противоречит тому, что на самом деле творится в файлах — значит, в файлах неправильно :)

Тулинг

Для проверки того, что yaml'ы написаны верно, можно воспользоваться yc-iam-compile-role-fixtures из Python-пакета yc_iam_tools. А можно и не пользоваться, такая же проверка запускается в TeamCity на каждый PR.

Роли

roles:
   # В этом dict'е перечисляются роли: ключ — название роли, значение — dict со свойствами
   
   example.editor:  # название роли
   
     # Описание роли на английском для документации.
     summary: |>
       Edit different things that are managed by ExampleService.
       Users with this role are also allowed to whisper to horses.
     
     # Видимость роли: может быть public или internal. Роли public видят пользователи, а internal роли — нет.
     # Public роль не должна включать в себя internal-пермишены, сейчас это warning при компиляции,
     # в будущем повысим до error.
     visibility: public
     
     # Минимальный тип ресурса, на который можно назначить роль.
     resourceType: resource-manager.folder
     # Эту роль можно назначить на фолдер или на клауд, но нельзя на SA или на биллинг-аккаунт.
     # Такая роль может содержать пермишены, у которых resourceType фолдер или какой-нибудь вложенный в него ресурс,
     # но не может содержать никакие другие пермишены.
     
     # Другие роли, входящие в состав этой.
     # Параметр можно не указывать, если не нужно инклюдить никакие другие роли.
     includedRoles:
       - example.viewer
       - horse.whisperer
     # Роль `example.editor` содержит все пермишены из `example.viewer` и `horse.whisperer`.
     # `includedRoles` работает транзитивно: если в определении `example.viewer` тоже инклюдятся какие-то роли,
     # то их пермишены входят и в `example.editor`.
       
     # Пермишены, входящие в роль.
     # Параметр можно не указывать, если роль не включает никаких пермишенов напрямую.
     permissions:
       - example.things.edit
       - example.things.manage
       # Есть сокращённая форма записи:
       - example.thingCollections.{create,update,delete}
       # Фигурные скобки можно использовать в любом месте записи:
       # `sample.{horses,mice,chickens}.{feed,pet}` тоже можно сказать,
       # эта запись разресолвится в 6 пермишенов.
       # (Но лучше таким не злоупотреблять.)
     
     # В итоге получается, что в роль `example.editor` входят пермишены:
     # `example.things.edit`, `example.things.manage`,
     # `example.thingCollections.create`, `example.thingCollections.update`, `example.thingCollections.delete`,
     # а также все пермишены, которые входят в роли `example.viewer` и `horse.whisperer`.
     
   # Ещё одна роль.
   example.viewer:
     # Эта роль используется в роли `example.editor` выше.
     # Но это не значит, что `example.viewer` в файле должна идти после `example.editor` —
     # можно расположить их хоть как или вообще положить в разные файлы.
     ...

Роли задаются аддитивно: можно создать роль "viewer плюс compute.editor плюс iam.serviceAccounts.create", но нельзя задать "viewer минус billing.viewer" или "все пермишены serverless.*.*, кроме serverless.*.delete". Это сделано специально, чтобы при добавлении новой роли/пермишена вся система вела себя более предсказуемо.

Некоторые роли помечены как "псевдороли", у них есть поле pseudorole: true. Это временные сущности, они нужны только для того, чтобы из них составить общеоблачные роли типа viewer. Ни внешние, ни внутренние пользователи не могут видеть псевдороли в API и назначать на ресурсы. Сервисам рекомендуется заменить их на правильные сервисные роли.

Пермишены

permissions:

  iam.accessBinding.delete:  # имя пермишена
  
    # Описание роли на английском для документации.
    description: Delete access binding.
    
    # Стейдж. Чаще всего это GA.
    # Список стейджей лежит в `stages.yaml`.
    stage: GA
    
    # Видимость пермишена: может быть public или internal.
    # Связана с видимостью ролей: internal пермишены не должны входить в public роли.
    visibility: public
    
    # Здесь задаются условия, когда пермишен может действовать.
    allowedWhen:
      
      # Сейчас можно задать только условие на статус клауда.
      cloud:
        status:
        - BLOCKED_BY_BILLING
        - ACTIVE
      # Этим пермишеном можно воспользоваться только тогда, когда клауд
      # находится в статусе ACTIVE или BLOCKED_BY_BILLING.
      # А если клауд в другом статусе — например, BLOCKED — пермишен запрещён.