Провижининг RBAC с помощью Terraform
Note
Доступно в Grafana Enterprise и Grafana Cloud.
Вы можете создавать, изменять или удалять пользовательские роли и создавать или удалять назначения ролей с помощью провайдера Grafana для Terraform.
Прежде чем настраивать провижининг ролей и назначений, определите, какие роли создавать и как назначать их пользователям и командам. Рекомендации по планированию см. в разделе Планирование стратегии внедрения RBAC.
Прежде чем начать
-
Убедитесь, что у вас установлен провайдер Terraform grafana/grafana версии 1.29.0 или выше.
-
Убедитесь, что вы используете Grafana 9.2 или выше.
-
Решите, как аутентифицировать провайдера. Для самостоятельно развёрнутой Grafana и Grafana Cloud мы рекомендуем токен сервисной учётной записи. Дополнительные сведения см. в разделе Создание токена сервисной учётной записи для провижининга.
Создание токена сервисной учётной записи для провижининга
Для провижининга мы рекомендуем использовать токены сервисных учётных записей. Сервисные учётные записи поддерживают детализированные разрешения, что позволяет легко проходить аутентификацию и использовать минимальный набор разрешений, необходимый для провижининга вашей инфраструктуры RBAC.
Чтобы создать токен сервисной учётной записи для провижининга, выполните следующие шаги.
- Создайте новую сервисную учётную запись для вашего CI-конвейера.
-
Назначьте разрешения сервисной учётной записи:
- Вам понадобятся роли «Role reader», «Role writer», а также роли, включающие все разрешения, которые будут настроены через провижининг. Например, чтобы создать или назначить роль, позволяющую создавать пользователей, сервисной учётной записи нужны разрешения на создание пользователей.
- В качестве альтернативы вы можете назначить сервисной учётной записи базовую роль «Admin».
- Создайте новый токен сервисной учётной записи для использования в Terraform.
В качестве альтернативы можно использовать базовую аутентификацию. Все поддерживаемые форматы аутентификации описаны в документации по аутентификации провайдера.
Настройка провайдера Terraform
Поддержка RBAC входит в состав провайдера Grafana для Terraform.
В следующем примере выполняется настройка провайдера. Чтобы токен сервисной учётной записи не попал в систему контроля версий, задайте учётные данные через переменные окружения GRAFANA_URL и GRAFANA_AUTH, а не прописывайте их в конфигурации:
terraform {
required_providers {
grafana = {
source = "grafana/grafana"
version = ">= 1.29.0"
}
}
}
# Reads credentials from the GRAFANA_URL and GRAFANA_AUTH environment variables
provider "grafana" {}
Экспортируйте переменные окружения перед запуском Terraform:
export GRAFANA_URL="<GRAFANA_URL>"
export GRAFANA_AUTH="<SERVICE_ACCOUNT_TOKEN>"
Замените следующие заполнители:
<GRAFANA_URL>: базовый URL вашего экземпляра Grafana, напримерhttps://<YOUR_STACK_NAME>.grafana.netв Grafana Cloud илиhttp://localhost:3000для локального экземпляра.<SERVICE_ACCOUNT_TOKEN>: токен сервисной учётной записи с разрешением управлять ролями и назначениями, которые вы настраиваете через провижининг, напримерglsa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
В качестве альтернативы задайте атрибуты url и auth непосредственно в блоке provider. Все поддерживаемые форматы аутентификации описаны в документации по аутентификации провайдера.
Провижининг базовых ролей
Базовые роли (None, Viewer, Editor, Admin и Grafana Admin) соответствуют роли организации пользователя или сервисной учётной записи. Разрешения базовой роли производны от роли организации, поэтому управление базовыми ролями выполняется путём установки роли организации, а не путём создания назначения роли RBAC. Ресурс grafana_role_assignment назначает только фиксированные и пользовательские роли.
Чтобы изменить, какие разрешения предоставляет базовая роль, а не то, у кого она есть, отредактируйте разрешения базовой роли. Дополнительные сведения см. в разделе Управление ролями RBAC.
Note
Назначение базовой роли, например
basic_admin, с помощьюgrafana_role_assignmentзавершается ошибкойthis endpoint cannot be used to assign basic, managed or external services roles.
Установка роли организации для сервисной учётной записи
Задайте атрибут role в ресурсе grafana_service_account:
resource "grafana_service_account" "admin_sa" {
name = "terraform_admin_sa"
role = "Admin"
}
Установка роли организации для пользователей
Способ установки роли организации пользователя зависит от вашего развёртывания Grafana.
Самостоятельно развёрнутая Grafana: используйте ресурс grafana_organization для управления участниками по роли организации. Этот ресурс использует административный API Grafana, поэтому требует базовой аутентификации и управляет членством в организации в авторитетном режиме.
resource "grafana_organization" "org" {
name = "my_org"
admins = ["admin@example.com"]
editors = ["editor@example.com"]
viewers = ["viewer@example.com"]
}
Grafana Cloud: ресурс grafana_organization не поддерживается, и ни один ресурс Terraform сейчас не устанавливает роль организации отдельного пользователя. Управляйте ролями организации с помощью конечной точки PATCH /api/org/users/{user_id}
HTTP API организаций, либо через провижининг SCIM, либо через сопоставление ролей SAML или OIDC.
Назначение фиксированной или пользовательской роли команде
Используйте фиксированные или пользовательские роли, чтобы предоставлять разрешения командам:
resource "grafana_team" "writers_team" {
name = "terraform_writers_team"
}
# Assign a fixed role to a team
resource "grafana_role_assignment" "writers_team_fixed_role" {
role_uid = "fixed:dashboards:writer"
teams = [grafana_team.writers_team.id]
}
Провижининг пользовательских ролей
В следующем примере показано, как настроить через провижининг пользовательскую роль с некоторыми разрешениями.
- Скопируйте этот блок кода в файл .tf на вашем локальном компьютере.
resource "grafana_role" "my_new_role" {
name = "custom:users:manager"
description = "Manage organization users and teams"
uid = "customusersmanager"
version = 1
global = false
# Manage organization users
permissions {
action = "org.users:read"
scope = "users:*"
}
permissions {
action = "org.users:add"
scope = "users:*"
}
permissions {
action = "org.users:write"
scope = "users:*"
}
# Manage teams
permissions {
action = "teams:create"
}
permissions {
action = "teams:read"
scope = "teams:*"
}
permissions {
action = "teams:write"
scope = "teams:*"
}
}
Справочник по доступным действиям и областям действия, которые можно предоставить в пользовательской роли, см. в разделе Действия и области действия RBAC.
- Выполните команду
terraform apply. - Перейдите в интерфейс Grafana и убедитесь, что новая роль появилась в средстве выбора ролей:
![Role Picker]()
Провижининг назначений ролей
В следующем примере показано, как настроить через провижининг назначения ролей. В этом примере создаются команда, пользователь и сервисная учётная запись, и им назначается пользовательская роль из предыдущего примера.
- Дополните файл конфигурации из предыдущего примера следующим:
resource "grafana_team" "test_team" {
name = "terraform_test_team"
}
resource "grafana_user" "test_user" {
email = "terraform_user@test.com"
login = "terraform_test_user"
password = <TEST_PASSWORD>
}
resource "grafana_service_account" "test_sa" {
name = "terraform_test_sa"
role = "Viewer"
}
resource "grafana_role_assignment" "my_new_role_assignment" {
role_uid = grafana_role.my_new_role.uid
users = [grafana_user.test_user.id]
teams = [grafana_team.test_team.id]
service_accounts = [grafana_service_account.test_sa.id]
}
-
Замените
<TEST_PASSWORD>на тестовый пароль для вашего тестового пользователя. -
Выполните команду
terraform apply. -
Перейдите в интерфейс Grafana и убедитесь, что пользователь, команда и сервисная учётная запись созданы и что роль им назначена:
![Service Account Role Assignment]()
Обратите внимание, что вместо роли, созданной через провижининг, можно также найти uid уже существующей фиксированной или пользовательской роли и использовать его.
Для поиска uid ролей можно использовать
конечную точку API для получения списка ролей.
Аналогично можно находить и использовать id пользователей, команд и сервисных учётных записей, созданных не через провижининг, чтобы назначать им роли.

