Планирование стратегии внедрения RBAC

Note

Доступно в Grafana Enterprise и Grafana Cloud.

Стратегия внедрения RBAC помогает определить, как вы хотите реализовать RBAC до того, как начнёте назначать роли RBAC пользователям и командам.

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

  • Следует ли назначать пользователям базовые роли или же назначать им фиксированные или пользовательские роли?
  • Когда следует создавать пользовательские роли?
  • К каким сущностям следует применять фиксированные и пользовательские роли? Следует ли применять их к пользователям, командам? Может быть, вместо этого изменить разрешения базовых ролей?
  • Как внедрить разрешения так, чтобы ими было легко управлять?
  • Какой подход использовать при назначении ролей? Использовать веб-интерфейс Grafana, провижининг или API?

Изучение определений базовых и фиксированных ролей

В качестве первого шага при определении стратегии внедрения разрешений мы рекомендуем ознакомиться с определениями базовых и фиксированных ролей. Помимо назначения фиксированных ролей любому пользователю и команде, вы также можете изменять разрешения базовых ролей, что меняет возможности зрителя, редактора или администратора. Такая гибкость означает, что вам доступно множество комбинаций назначения ролей. Если у вас большое количество пользователей и команд Grafana, мы рекомендуем составить список фиксированных ролей, которые вы, возможно, захотите использовать. Учтите, что базовая роль None, то есть роль без разрешений, не может быть изменена или обновлена.

Чтобы узнать больше о базовых и фиксированных ролях, обратитесь к следующей документации:

Соображения о пользователях и командах

RBAC — это гибкая и мощная функция с множеством возможных комбинаций назначения разрешений. Учитывайте следующие рекомендации при назначении разрешений пользователям и командам.

  • Назначайте роли пользователям, когда у вас есть единичный сценарий, в котором небольшому числу пользователей требуется доступ к ресурсу, или когда вы хотите назначить временный доступ. Если у вас большое количество пользователей, этот подход может оказаться сложным в управлении по мере масштабирования использования Grafana. Например, сотруднику вашего ИТ-отдела могут понадобиться роли fixed:licensing:reader и fixed:licensing:writer, чтобы он мог управлять вашей лицензией Grafana Enterprise.

  • Назначайте роли командам, когда у вас есть подмножество пользователей, соответствующее вашей организационной структуре, и вы хотите, чтобы все члены команды имели одинаковый уровень доступа. Например, всем членам конкретной команды инженеров могут понадобиться роли fixed:reports:reader и fixed:reports:writer, чтобы управлять отчётами.

    Когда вы добавляете в команду новых пользователей, система автоматически назначает им разрешения.

Соображения о поставщике аутентификации

Вы можете воспользоваться своим текущим поставщиком аутентификации для управления разрешениями пользователей и команд в Grafana. Когда вы сопоставляете пользователей и команды с группами SAML и LDAP, вы можете синхронизировать эти назначения с Grafana.

Например:

  1. Сопоставьте роли SAML, LDAP или OAuth с базовыми ролями Grafana (viewer, editor или admin).

  2. Используйте функцию синхронизации команд Grafana Enterprise, чтобы синхронизировать команды из вашего поставщика SAML, LDAP или OAuth с Grafana. Дополнительные сведения о синхронизации команд см. в разделе Синхронизация команд.

  3. Внутри Grafana назначьте разрешения RBAC пользователям и командам.

Когда изменять базовые роли, а когда создавать пользовательские роли

Учитывайте следующие рекомендации, определяя, следует ли изменять базовые роли или создавать пользовательские роли.

  • Изменяйте базовые роли, когда определения Grafana того, что могут делать зрители, редакторы и администраторы, не совпадают с вашими определениями этих ролей. Вы можете добавлять или удалять разрешения у любой базовой роли.

    Note

    Изменения, которые вы вносите в базовые роли, влияют на определение роли для всех организаций в экземпляре Grafana. Например, когда вы добавляете разрешения роли fixed:users:writer в базовую роль viewer, все зрители в любой организации экземпляра Grafana смогут создавать пользователей в этой организации.

    Note

    Вы не можете изменять разрешения No Basic Role.

  • Создавайте пользовательские роли, когда определения фиксированных ролей не отвечают вашим требованиям к разрешениям. Например, роль fixed:dashboards:writer позволяет пользователям удалять дашборды. Если вы хотите, чтобы некоторые пользователи или команды могли создавать и обновлять дашборды, но не удалять их, вы можете создать пользовательскую роль с именем вроде custom:dashboards:creator, в которой отсутствует разрешение dashboards:delete.

Как назначать роли RBAC

Используйте любой из следующих способов назначения ролей RBAC пользователям и командам.

  • Веб-интерфейс Grafana: используйте веб-интерфейс Grafana, когда нужно назначить ограниченное число ролей RBAC пользователям и командам. В интерфейсе есть средство выбора ролей, с помощью которого можно выбирать роли.
  • HTTP API Grafana: используйте HTTP API Grafana, если хотите автоматизировать назначение ролей.
  • Terraform: используйте Terraform для назначения ролей пользователям и командам и управления ими, если вы применяете Terraform для провижининга.
  • Провижининг Grafana: провижининг Grafana обеспечивает надёжный подход к назначению, удалению и снятию ролей. В одном файле YAML можно разместить несколько записей о назначении и снятии ролей.

Сценарии разрешений

Мы собрали следующие сценарии внедрения разрешений на основе текущих реализаций Grafana.

Note

Если у вас есть сценарий использования, которым вы хотели бы поделиться, не стесняйтесь внести вклад в эту страницу документации. Мы будем рады услышать вас!

Предоставить внутренним сотрудникам-зрителям возможность использовать Explore, но запретить это внешним подрядчикам-зрителям

  1. В Grafana создайте команду с именем Internal employees.
  2. Назначьте команде Internal employees роль fixed:datasources:explorer.
  3. Добавьте внутренних сотрудников в команду Internal employees или сопоставьте их из команды SAML, LDAP или OAuth с помощью синхронизации команд.
  4. Назначьте роль viewer и внутренним сотрудникам, и подрядчикам.

Ограничить разрешения зрителя, редактора или администратора

  1. Изучите список разрешений, связанных с базовой ролью.
  2. Измените разрешения базовой роли.

Разрешить управлять оповещениями только членам одной команды

  1. Создайте команду Alert Managers и назначьте ей все применимые фиксированные роли Alerting.
  2. Добавьте пользователей в команду Alert Managers.
  3. Удалите все разрешения с действиями, начинающимися с alert., из базовых ролей Viewer, Editor и Admin.

Предоставить дашборды пользователям в двух или более географических регионах

  1. Создайте папку для каждого региона, например создайте папку US и папку EU.
  2. Добавьте дашборды в каждую папку.
  3. Используя разрешения папок, добавьте пользователей из США как редакторов в папку US, а пользователей из ЕС назначьте редакторами папки EU.

Назначить пользователю определённый набор ролей

  1. Создайте пользователя с выбранной ролью организации No Basic Role.
  2. Назначьте пользователю набор фиксированных ролей, отвечающий вашим требованиям.

Создать пользовательскую роль для доступа к оповещениям в определённой папке

Чтобы увидеть правило оповещения в Grafana, пользователь должен иметь доступ на чтение к папке, в которой хранится правило оповещения, разрешение на чтение оповещений в этой папке и разрешение на запрос ко всем источникам данных, которые использует правило.

Команда API в этом примере основана на следующем:

  • Папка Test-Folder с идентификатором 92
  • Два источника данных: DS1 с UID _oAfGYUnk и DS2 с UID YYcBGYUnk
  • Правило оповещения, которое хранится в Test-Folder и запрашивает эти два источника данных.

Следующий запрос создаёт пользовательскую роль, включающую разрешения на доступ к правилу оповещения:

curl --location --request POST '<grafana_url>/api/access-control/roles/' \
--header 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' \
--header 'Content-Type: application/json' \
--data-raw '{
    "version": 1,
    "name": "custom:alerts.reader.in.folder.123",
    "displayName": "Read-only access to alerts in folder Test-Folder",
    "description": "Let user query DS1 and DS2, and read alerts in folder Test-Folders",
    "group":"Custom",
    "global": false,
    "permissions": [
        {
            "action": "folders:read",
            "scope": "folders:uid:YEcBGYU22"
        },
        {
            "action": "alert.rules:read",
            "scope": "folders:uid:YEcBGYU22"
        },
        {
            "action": "datasources:query",
            "scope": "datasources:uid:_oAfGYUnk"
        },
        {
            "action": "datasources:query",
            "scope": "datasources:uid:YYcBGYUnk"
        }
    ]
}'

Разрешить редактору создавать пользовательские роли

По умолчанию только администратор сервера Grafana может создавать пользовательские роли и управлять ими. Если вы хотите, чтобы ваши редакторы (Editors) могли делать то же самое, обновите разрешения базовой роли Editor. Есть два способа добиться этого:

  • Добавьте следующие разрешения в роль basic:editor с помощью провижининга или HTTP API RBAC:

    Действие Область видимости
    roles:read roles:*
    roles:write permissions:type:delegate
    roles:delete permissions:type:delegate

    В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью jq и обновляет:

    Bash
    # Fetch the role, modify it to add the desired permissions and increment its version
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' \
      -X GET '<grafana_url>/api/access-control/roles/basic_editor' | \
      jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \
      jq '.permissions += [{"action": "roles:read", "scope": "roles:*"}, {"action": "roles:write", "scope": "permissions:type:delegate"}, {"action": "roles:delete", "scope": "permissions:type:delegate"}]' > /tmp/basic_editor.json
    
    # Update the role
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' -H 'Content-Type: application/json' \
      -X PUT-d @/tmp/basic_editor.json '<grafana_url>/api/access-control/roles/basic_editor'
  • Либо добавьте разрешения роли fixed:roles:writer в роль basic:editor с помощью списка role > from вашего файла провижининга:

    YAML
    apiVersion: 2
    
    roles:
      - name: 'basic:editor'
        global: true
        version: 3
        from:
          - name: 'basic:editor'
            global: true
          - name: 'fixed:roles:writer'
            global: true

Note: Любой пользователь или сервисная учётная запись, обладающие возможностью изменять роли, могут создавать, обновлять или удалять роли только с теми разрешениями, которые им были предоставлены. Например, пользователь с ролью Editor смог бы создавать роли и управлять ими только с имеющимися у него разрешениями или их подмножеством.

Разрешить зрителям создавать отчёты

Если вы хотите, чтобы ваши зрители (Viewers) могли создавать отчёты, обновите разрешения базовой роли Viewer. Есть два способа добиться этого:

  • Добавьте следующие разрешения в роль basic:viewer с помощью провижининга или HTTP API RBAC:

    Действие Область видимости
    reports:create н/д
    reports:write reports:*
    reports:id:*
    reports:read reports:*
    reports:send reports:*

    В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью jq и обновляет:

    Bash
    # Fetch the role, modify it to add the desired permissions and increment its version
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' \
      -X GET '<grafana_url>/api/access-control/roles/basic_viewer' | \
      jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \
      jq '.permissions += [{"action": "reports:create"}, {"action": "reports:read", "scope": "reports:*"}, {"action": "reports:write", "scope": "reports:*"}, {"action": "reports:send", "scope": "reports:*"}]' > /tmp/basic_viewer.json
    
    # Update the role
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' -H 'Content-Type: application/json' \
      -X PUT-d @/tmp/basic_viewer.json '<grafana_url>/api/access-control/roles/basic_viewer'
  • Либо добавьте разрешения роли fixed:reports:writer в роль basic:viewer с помощью списка role > from вашего файла провижининга:

    YAML
    apiVersion: 2
    
    roles:
      - name: 'basic:viewer'
        global: true
        version: 3
        from:
          - name: 'basic:viewer'
            global: true
          - name: 'fixed:reports:writer'
            global: true

Note: Роль fixed:reports:writer назначает больше разрешений, чем только создание отчётов. Дополнительные сведения о назначении разрешений фиксированных ролей см. в разделе Определения фиксированных ролей.

Запретить администратору Grafana создавать пользователей и приглашать их

Чтобы запретить администратору Grafana создавать пользователей и приглашать их присоединиться к организации, необходимо обновить разрешение базовой роли. Удаляемые разрешения:

Действие Область видимости
users:create
org.users:add users:*

Есть два способа добиться этого:

  • Используйте HTTP API RBAC.

    В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью jq и обновляет:

    Bash
    # Fetch the role, modify it to remove the undesired permissions and increment its version
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' \
      -X GET '<grafana_url>/api/access-control/roles/basic_grafana_admin' | \
      jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \
      jq 'del(.permissions[] | select (.action == "users:create")) | del(.permissions[] | select (.action == "org.users:add" and .scope == "users:*"))' > /tmp/basic_grafana_admin.json
    
    # Update the role
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' -H 'Content-Type: application/json' \
      -X PUT-d @/tmp/basic_grafana_admin.json '<grafana_url>/api/access-control/roles/basic_grafana_admin'
  • Либо используйте список role > from и параметр permission > state вашего файла провижининга:

    YAML
    apiVersion: 2
    
    roles:
      - name: 'basic:grafana_admin'
        global: true
        version: 3
        from:
          - name: 'basic:grafana_admin'
            global: true
        permissions:
          - action: 'users:create'
            state: 'absent'
          - action: 'org.users:add'
            scope: 'users:*'
            state: 'absent'

Запретить зрителям доступ к прикладному плагину

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

В этом примере установлены и включены три прикладных плагина:

Имя ID Требуемая роль организации
On Call grafana-oncall-app Viewer
Kentik Connect Pro kentik-connect-app Viewer
Enterprise logs grafana-enterprise-logs-app Admin

Таким образом, по умолчанию зрители смогут видеть оба прикладных плагина — On Call и Kentik Connect Pro. Если вы хотите отозвать у них доступ к прикладному плагину On Call, вам нужно:

  1. Удалить разрешение на доступ ко всем прикладным плагинам:
    Действие Область видимости
    plugins.app:access plugins:*
  2. Выдать разрешение на доступ только к прикладному плагину Kentik Connect Pro:
    Действие Область видимости
    plugins.app:access plugins:id:kentik-connect-app

Вот два способа добиться этого:

  • Используйте HTTP API RBAC.

    В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью jq и обновляет:

    Bash
    # Fetch the role, modify it to remove the undesired permissions, add the new permission and increment its version
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' \
      -X GET '<grafana_url>/api/access-control/roles/basic_viewer' | \
      jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \
      jq 'del(.permissions[] | select (.action == "plugins.app:access" and .scope == "plugins:*"))' | \
      jq '.permissions += [{"action": "plugins.app:access", "scope": "plugins:id:kentik-connect-app"}]' > /tmp/basic_viewer.json
    
    # Update the role
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' -H 'Content-Type: application/json' \
      -X PUT -d @/tmp/basic_viewer.json '<grafana_url>/api/access-control/roles/basic_viewer'

    Токен, используемый в этом запросе, — это токен сервисной учётной записи.

  • Либо используйте список role > from и параметр permission > state вашего файла провижининга:

    YAML
    ---
    apiVersion: 2
    
    roles:
      - name: 'basic:viewer'
        version: 8
        global: true
        from:
          - name: 'basic:viewer'
            global: true
        permissions:
          - action: 'plugins.app:access'
            scope: 'plugins:*'
            state: 'absent'
          - action: 'plugins.app:access'
            scope: 'plugins:id:kentik-connect-app'
            state: 'present'

    Если ваша цель — снять доступ к приложению, вам следует удалить его из роли и обновить роль. Например:

    Bash
    # Fetch the role, modify it to remove permissions to kentik-connect-app and increment role version
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' \
      -X GET '<grafana_url>/api/access-control/roles/basic_viewer' | \
      jq 'del(.created)| del(.updated) | del(.permissions[].created) | del(.permissions[].updated) | .version += 1' | \
      jq 'del(.permissions[] | select (.action == "plugins.app:access" and .scope == "plugins:id:kentik-connect-app"))'
    
    # Update the role
    curl -H 'Authorization: Bearer glsa_iNValIdinValiDinvalidinvalidinva_5b582697' -H 'Content-Type: application/json' \
      -X PUT -d @/tmp/basic_viewer.json '<grafana_url>/api/access-control/roles/basic_viewer'

Управление разрешениями пользователей через команды

В сценарии, когда вы хотите, чтобы пользователи получали доступ в зависимости от команды, к которой они принадлежат, мы рекомендуем установить пользователям роль No Basic Role и позволить назначить роль назначению команды.

  1. В Grafana убедитесь, что включены следующие параметры конфигурации.

    [users]
    # Set to true to automatically assign new users to the default organization (id 1)
    auto_assign_org = true
    
    # Set this value to automatically add new users to the provided organization (if auto_assign_org above is set to true)
    auto_assign_org_id = <org_id>
    
    # Default role new users will be automatically assigned (if auto_assign_org above is set to true)
    auto_assign_org_role = None
  2. Перезапустите экземпляр Grafana.

  3. Создайте команду с нужным именем.

  4. Назначьте команде фиксированные роли.

  5. Добавьте пользователей в команду.

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

Сократить область действия сервисных учётных записей

Использование сервисных учётных записей — эффективный способ организации коммуникации между машинами (M2M). Однако они могут представлять угрозу безопасности, если их область действия не ограничена должным образом. Чтобы ограничить область действия сервисной учётной записи, вы можете начать с создания сервисной учётной записи с базовой ролью None, а затем назначить учётной записи необходимые разрешения.

  1. Обратитесь к разделу Сервисные учётные записи и добавьте новую сервисную учётную запись.
  2. Установите базовую роль в None.
  3. Установите фиксированные роли, необходимые для сервисной учётной записи.

Это сократит требуемые для сервисной учётной записи разрешения и минимизирует риск компрометации.