通过配置管理认证与访问
在 grafana.ini 中设置登录、OAuth 和角色映射,并以代码方式管理用户与团队。
谁可以登录、拥有什么角色,是平台的一部分,和仪表板一样应当纳入版本控制。其中大部分内容位于 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 认证文档。
热门指南
-
将 Grafana 作为代码运维:全景图 哪些可以放在文件里,哪些需要 API,以及各部分如何组合在一起。 -
使用 grafana.ini 和环境变量配置 Grafana 服务器 了解配置文件的位置、覆盖的顺序,以及如何将设置保存在 Git 中。 -
从 JSON 文件 Provision 仪表板 从磁盘加载仪表板,从目录映射文件夹,并在不丢失变更的前提下创作仪表板。 -
Provision 告警规则、联系点与通知策略 用 YAML 定义整条告警管线,使其像代码一样被审查和版本化。 -
使用 Helm 和 Provisioning Values 在 Kubernetes 上部署 Grafana 通过 Helm chart 运行 Grafana,数据源、仪表板和设置都来自 values 文件。 -
从命令行重新加载、验证并排查 Provisioning 问题 找出 Grafana 加载了什么,无需重启即可重新加载,并修复常见的 provisioning 错误。