Провижининг RBAC с помощью Terraform

Note

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

Вы можете создавать, изменять или удалять пользовательские роли и создавать или удалять назначения ролей с помощью провайдера Grafana для Terraform.

Прежде чем настраивать провижининг ролей и назначений, определите, какие роли создавать и как назначать их пользователям и командам. Рекомендации по планированию см. в разделе Планирование стратегии внедрения RBAC.

Прежде чем начать

Создание токена сервисной учётной записи для провижининга

Для провижининга мы рекомендуем использовать токены сервисных учётных записей. Сервисные учётные записи поддерживают детализированные разрешения, что позволяет легко проходить аутентификацию и использовать минимальный набор разрешений, необходимый для провижининга вашей инфраструктуры RBAC.

Чтобы создать токен сервисной учётной записи для провижининга, выполните следующие шаги.

  1. Создайте новую сервисную учётную запись для вашего CI-конвейера.
  2. Назначьте разрешения сервисной учётной записи:
    • Вам понадобятся роли «Role reader», «Role writer», а также роли, включающие все разрешения, которые будут настроены через провижининг. Например, чтобы создать или назначить роль, позволяющую создавать пользователей, сервисной учётной записи нужны разрешения на создание пользователей.
    • В качестве альтернативы вы можете назначить сервисной учётной записи базовую роль «Admin».
  3. Создайте новый токен сервисной учётной записи для использования в Terraform.

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

Настройка провайдера Terraform

Поддержка RBAC входит в состав провайдера Grafana для Terraform.

В следующем примере выполняется настройка провайдера. Чтобы токен сервисной учётной записи не попал в систему контроля версий, задайте учётные данные через переменные окружения GRAFANA_URL и GRAFANA_AUTH, а не прописывайте их в конфигурации:

terraform
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:

Bash
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:

terraform
resource "grafana_service_account" "admin_sa" {
  name = "terraform_admin_sa"
  role = "Admin"
}

Установка роли организации для пользователей

Способ установки роли организации пользователя зависит от вашего развёртывания Grafana.

Самостоятельно развёрнутая Grafana: используйте ресурс grafana_organization для управления участниками по роли организации. Этот ресурс использует административный API Grafana, поэтому требует базовой аутентификации и управляет членством в организации в авторитетном режиме.

terraform
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.

Назначение фиксированной или пользовательской роли команде

Используйте фиксированные или пользовательские роли, чтобы предоставлять разрешения командам:

terraform
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]
}

Провижининг пользовательских ролей

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

  1. Скопируйте этот блок кода в файл .tf на вашем локальном компьютере.
terraform
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.

  1. Выполните команду terraform apply.
  2. Перейдите в интерфейс Grafana и убедитесь, что новая роль появилась в средстве выбора ролей: Role Picker

Провижининг назначений ролей

В следующем примере показано, как настроить через провижининг назначения ролей. В этом примере создаются команда, пользователь и сервисная учётная запись, и им назначается пользовательская роль из предыдущего примера.

  1. Дополните файл конфигурации из предыдущего примера следующим:
terraform
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]
}
  1. Замените <TEST_PASSWORD> на тестовый пароль для вашего тестового пользователя.

  2. Выполните команду terraform apply.

  3. Перейдите в интерфейс Grafana и убедитесь, что пользователь, команда и сервисная учётная запись созданы и что роль им назначена: User Role Assignment Team Role Assignment Service Account Role Assignment

Обратите внимание, что вместо роли, созданной через провижининг, можно также найти uid уже существующей фиксированной или пользовательской роли и использовать его. Для поиска uid ролей можно использовать конечную точку API для получения списка ролей. Аналогично можно находить и использовать id пользователей, команд и сервисных учётных записей, созданных не через провижининг, чтобы назначать им роли.

Полезные ссылки