Планирование стратегии внедрения 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.
Например:
-
Сопоставьте роли SAML, LDAP или OAuth с базовыми ролями Grafana (viewer, editor или admin).
-
Используйте функцию синхронизации команд Grafana Enterprise, чтобы синхронизировать команды из вашего поставщика SAML, LDAP или OAuth с Grafana. Дополнительные сведения о синхронизации команд см. в разделе Синхронизация команд.
-
Внутри 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, но запретить это внешним подрядчикам-зрителям
- В Grafana создайте команду с именем
Internal employees. - Назначьте команде
Internal employeesрольfixed:datasources:explorer. - Добавьте внутренних сотрудников в команду
Internal employeesили сопоставьте их из команды SAML, LDAP или OAuth с помощью синхронизации команд. - Назначьте роль viewer и внутренним сотрудникам, и подрядчикам.
Ограничить разрешения зрителя, редактора или администратора
- Изучите список разрешений, связанных с базовой ролью.
- Измените разрешения базовой роли.
Разрешить управлять оповещениями только членам одной команды
- Создайте команду
Alert Managersи назначьте ей все применимые фиксированные роли Alerting. - Добавьте пользователей в команду
Alert Managers. - Удалите все разрешения с действиями, начинающимися с
alert., из базовых ролей Viewer, Editor и Admin.
Предоставить дашборды пользователям в двух или более географических регионах
- Создайте папку для каждого региона, например создайте папку
USи папкуEU. - Добавьте дашборды в каждую папку.
- Используя разрешения папок, добавьте пользователей из США как редакторов в папку
US, а пользователей из ЕС назначьте редакторами папкиEU.
Назначить пользователю определённый набор ролей
- Создайте пользователя с выбранной ролью организации
No Basic Role. - Назначьте пользователю набор фиксированных ролей, отвечающий вашим требованиям.
Создать пользовательскую роль для доступа к оповещениям в определённой папке
Чтобы увидеть правило оповещения в Grafana, пользователь должен иметь доступ на чтение к папке, в которой хранится правило оповещения, разрешение на чтение оповещений в этой папке и разрешение на запрос ко всем источникам данных, которые использует правило.
Команда API в этом примере основана на следующем:
- Папка
Test-Folderс идентификатором92 - Два источника данных:
DS1с UID_oAfGYUnkиDS2с UIDYYcBGYUnk - Правило оповещения, которое хранится в
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:В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью
jqи обновляет:# 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вашего файла провижининга: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:В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью
jqи обновляет:# 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вашего файла провижининга: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 создавать пользователей и приглашать их присоединиться к организации, необходимо обновить разрешение базовой роли. Удаляемые разрешения:
Есть два способа добиться этого:
-
Используйте HTTP API RBAC.
В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью
jqи обновляет:# 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вашего файла провижининга: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'
Запретить зрителям доступ к прикладному плагину
По умолчанию зрители, редакторы и администраторы имеют доступ ко всем прикладным плагинам, к которым им разрешает доступ их организационная роль. Чтобы изменить это поведение по умолчанию и запретить зрителям доступ к прикладному плагину, необходимо обновить разрешения базовой роли.
В этом примере установлены и включены три прикладных плагина:
Таким образом, по умолчанию зрители смогут видеть оба прикладных плагина — On Call и Kentik Connect Pro. Если вы хотите отозвать у них доступ к прикладному плагину On Call, вам нужно:
- Удалить разрешение на доступ ко всем прикладным плагинам:
- Выдать разрешение на доступ только к прикладному плагину Kentik Connect Pro:
Вот два способа добиться этого:
-
Используйте HTTP API RBAC.
В качестве примера приведём небольшой скрипт bash, который получает роль, изменяет её с помощью
jqи обновляет:# 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вашего файла провижининга:--- 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'Если ваша цель — снять доступ к приложению, вам следует удалить его из роли и обновить роль. Например:
# 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 и позволить назначить роль назначению команды.
-
В 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 -
Перезапустите экземпляр Grafana.
-
Создайте команду с нужным именем.
-
Назначьте команде фиксированные роли.
-
Добавьте пользователей в команду.
Пользователь будет автоматически добавлен в организацию по умолчанию, но не будет иметь никаких разрешений, пока не будет добавлен в команду.
Сократить область действия сервисных учётных записей
Использование сервисных учётных записей — эффективный способ организации коммуникации между машинами (M2M). Однако они могут представлять угрозу безопасности, если их область действия не ограничена должным образом. Чтобы ограничить область действия сервисной учётной записи, вы можете начать с создания сервисной учётной записи с базовой ролью None, а затем назначить учётной записи необходимые разрешения.
- Обратитесь к разделу Сервисные учётные записи и добавьте новую сервисную учётную запись.
- Установите базовую роль в
None. - Установите фиксированные роли, необходимые для сервисной учётной записи.
Это сократит требуемые для сервисной учётной записи разрешения и минимизирует риск компрометации.