Grafana Grafana

通过配置管理认证与访问

在 grafana.ini 中设置登录、OAuth 和角色映射,并以代码方式管理用户与团队。

12 min 中级

谁可以登录、拥有什么角色,是平台的一部分,和仪表板一样应当纳入版本控制。其中大部分内容位于 grafana.ini 中。其余部分,例如用户、团队和 service account,没有 provisioning 文件格式,因此本指南也展示如何以代码方式管理它们。下面的选项名称与 Grafana 配置参考一致,但在依赖它们之前,请对照你所用版本的 defaults.ini 进行验证。

基本设置

[users]
allow_sign_up = false          # no self-registration
auto_assign_org = true
auto_assign_org_role = Viewer  # default role for new users

[auth]
disable_login_form = false     # set true once SSO works and you no longer need the form

[auth.anonymous]
enabled = false

除非你有意要一个开放的实例,否则请保持 allow_sign_up = false。如果你确实启用了匿名访问,请给它尽可能低的角色:

[auth.anonymous]
enabled = true
org_role = Viewer

使用通用 OAuth 的单点登录

任何 OpenID Connect 或 OAuth 2 提供商都可以在该文件中接入。密钥来自环境变量:

[server]
root_url = https://grafana.example.com/

[auth.generic_oauth]
enabled = true
name = Company SSO
allow_sign_up = true
client_id = grafana
client_secret = ${OAUTH_CLIENT_SECRET}
scopes = openid profile email groups
auth_url = https://sso.example.com/oauth2/authorize
token_url = https://sso.example.com/oauth2/token
api_url = https://sso.example.com/oauth2/userinfo
login_attribute_path = preferred_username
email_attribute_path = email
role_attribute_path = contains(groups[*], 'grafana-admins') && 'Admin' || contains(groups[*], 'grafana-editors') && 'Editor' || 'Viewer'

需要了解的内容:

  • 提供商的重定向 URI 是 <root_url>login/generic_oauth,所以 root_url 必须准确。
  • role_attribute_path 是针对用户的令牌或 userinfo 求值的 JMESPath 表达式。它将身份提供商的组映射到 Grafana 角色(Admin、Editor、Viewer),这样角色变更发生在身份提供商中,而不是 Grafana 中。
  • 这里的 allow_sign_up 表示”首次 SSO 登录时创建 Grafana 用户”,这正是你想要的,即使 [users] allow_sign_up 是 false。
  • 常见的提供商有专门的配置段([auth.github]、[auth.google]、[auth.azuread]、[auth.gitlab] 等),SAML 和 LDAP 则在 Grafana Enterprise 和 Grafana Cloud 中可用。LDAP 还会读取一个独立的 ldap.toml 文件。

一旦 SSO 工作正常,就设置 disable_login_form = true,并仅把管理员账号保留为应急(break-glass)选项,或者保持登录表单启用但通过网络规则加以保护。

角色以及文件无法设置的内容

Grafana 有组织角色(Admin、Editor、Viewer),RBAC 则在 Enterprise 和 Cloud 中增加了细粒度的角色。这些资源在开源版 Grafana 中没有 provisioning 文件格式:

资源如何以代码管理
用户通过 SSO 创建,或在引导脚本中使用 Admin API
团队与团队成员Terraform(grafana_team)、API,或来自身份提供商的团队同步
组织Terraform(grafana_organization)或 API
Service account 与令牌Terraform(grafana_service_account、grafana_service_account_token)或 API
文件夹与仪表板权限Terraform(grafana_folder_permission、grafana_dashboard_permission)、Operator 或 API

Terraform 指南展示了这一模式。对于小型部署,在仓库中保存一个使用管理员凭据调用 HTTP API 的一次性脚本,并在 CI 中运行它,是一种合理的替代方案。

为自动化引导 service account

Terraform、Operator 和 CI 之类的工具需要一个非人类身份。创建一次 service account,使用可行的最低角色,并将其令牌存为 secret:

# create the service account (Admin API, basic auth)
curl -s -X POST -u admin:$GRAFANA_ADMIN_PASSWORD \
  -H 'Content-Type: application/json' \
  -d '{"name":"terraform","role":"Admin"}' \
  http://localhost:3000/api/serviceaccounts

# create a token for it, using the id returned above
curl -s -X POST -u admin:$GRAFANA_ADMIN_PASSWORD \
  -H 'Content-Type: application/json' \
  -d '{"name":"terraform-token"}' \
  http://localhost:3000/api/serviceaccounts/<id>/tokens

令牌只显示一次。请直接把它放进你的 secret 存储,并设置过期时间或按计划轮换。

值得提交的加固设置

[security]
cookie_secure = true
cookie_samesite = lax
disable_gravatar = true
allow_embedding = false

[auth]
login_maximum_lifetime_duration = 30d
login_maximum_inactive_lifetime_duration = 7d

升级时请复查它们,并让它们在各环境之间保持一致,只有真正不同的值(如 root_url)除外。

无需 UI 即可验证

curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/admin/settings | jq '."auth.generic_oauth" | {enabled, name}'
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/users | jq '.[] | {login, isAdmin}'
curl -s -u admin:$GRAFANA_ADMIN_PASSWORD http://localhost:3000/api/teams/search | jq '.teams[].name'

有关每个提供商的完整选项列表,请参阅 Grafana 认证文档。

热门指南