跳到主要内容

分享与权限管理

前面六篇解决的是「自己把 Grafana 用起来」,这篇解决「给别人用」:仪表盘怎么安全地分享出去、多团队共用一套 Grafana 权限怎么划、CI 之类的自动化怎么通过 API 接管仪表盘。

环境说明

文中示例基于 Grafana 10/11/12(OSS 版),菜单位置以 Grafana 11 为准,10 和 12 的入口略有差异但功能一致。配置文件均指 grafana.ini,容器部署时换算成 GF_ 前缀环境变量即可。

分享三式​

Share 按钮里藏着三种分享方式,安全等级完全不同,先搞清楚再选。

Snapshot 快照​

操作:仪表盘右上 Share → Snapshot → Publish。Grafana 把当前所有面板的查询结果数据打包成一份静态 JSON,生成一个链接。打开链接的人不需要账号、请求不经过数据源,看到的就是发布那一刻的数据——字面意义的「快照」。

适用场景:给没有 Grafana 账号的人(领导、客户、兄弟团队)看故障现场、周报数据。数据是死的,对方改不了时间范围、点不了下钻,反而安全。

快照数据发到了哪

默认快照发布到 snapshot.raintank.io——Grafana Labs 运营的公共服务。也就是说你的内部指标(主机名、IP、业务量全在查询结果里)原样存到了第三方服务器上。数据敏感的组织要么别用快照,要么关掉外部发布:

[snapshots]
# 关掉外部发布,快照存本地数据库
external_enabled = false

关掉后快照链接照发、数据不出内网,前提是对方能访问你的 Grafana。本地已发布的快照在 Dashboards → Snapshots 页面统一管理和删除。

Public dashboard 公开链接​

Grafana 10 引入:Share → Public dashboard → Create,生成一条带随机 token 的长链接,任何人打开都能看到这个仪表盘的实时数据——不是快照,是真在查数据源。

和 snapshot 的本质区别:snapshot 是数据拷贝,public dashboard 是「免登录的只读入口」。查看者不能编辑、不能跳到别的仪表盘,交互能力受限。

管理面两件事:

  • 全站总开关在 grafana.ini 的 [public_dashboards] 段,管理员可以直接禁用整个功能。
  • 每个公开仪表盘都是单独开启的,Administration → Public dashboards 有全站列表,谁开的、什么时候开的一目了然,建议定期扫一遍。

Embed 嵌入​

Share → Embed 给一段 iframe 代码;单个面板也能嵌(面板菜单 → Share → Embed)。嵌进内部 wiki、状态页、运维大屏页最常用。

两个配置前提,缺一个就是空白页或拒绝连接:

[security]
# 默认 Grafana 发 X-Frame-Options: deny,浏览器拒绝渲染 iframe
allow_embedding = true

[auth.anonymous]
# 看嵌入内容的人没登录,得开匿名访问
enabled = true
org_role = Viewer
匿名访问是把双刃剑

开了 anonymous,任何人访问 Grafana 首页都能看到默认 Org 的仪表盘,不只是被嵌入的那一张。嵌入场景务必配合权限收紧:默认 Org 只放可公开的仪表盘,其余挪到独立 Folder 并把默认角色权限收掉(收法见下面权限一节)。

跨站嵌入还涉及 cookie:cookie_samesite = none 且 cookie_secure = true,并且必须 HTTPS。纯匿名展示不登录的场景不用管这条。

权限体系​

四级结构,从上往下:Org → Team → Folder → Dashboard。

Org:多租户隔离​

Org 是最硬的隔离墙:不同 Org 的仪表盘、数据源、用户、告警完全互不可见。一个用户可以属于多个 Org,在每个 Org 里角色独立,右上角切换。

什么时候真的需要多 Org

大多数团队一个 Org 就够了。开第二个 Org 的正当理由:对外服务(给客户看的监控)、强合规隔离(两个部门连数据源都不能共享)。代价是一切按 Org 重复建——数据源、告警规则、服务账号各配一份,管理成本翻倍。只是想把两个团队的仪表盘分开?用 Folder,别用 Org。

Org 之上还有一档 Server Admin(默认 admin 账号):能建 Org、管全站用户、改全站设置。生产环境这个账号锁进保险柜,日常操作用各 Org 的普通 Admin。

Team 与三角色​

Org 内的角色分三档:

角色能做什么不能做什么
Viewer看仪表盘、调时间范围、临时改查询探索(不保存)建改删仪表盘、管数据源、加注释
EditorViewer 全部 + 建改删仪表盘、管理告警规则、加注释管数据源、管用户、装插件
AdminOrg 内一切:数据源、团队、用户、服务账号、插件跨 Org 操作、全站设置(Server Admin 的活)

Team 是权限的载体,铁律一条:永远给 Team 授权,不给个人授权。人离职从 Team 移除即完成权限回收;给个人授权的结局是半年后没人说得清谁能看什么。

Folder 与 Dashboard​

Folder 是仪表盘的目录,也是权限的实际挂载点。规则两条:

  1. Dashboard 默认继承所在 Folder 的权限;
  2. Dashboard 可以单独覆盖权限,但别这么做——覆盖一次,权限矩阵就再也算不清了。

新建的 Folder 默认带两条权限记录:Editor 角色可编辑、Viewer 角色可查看——等于全 Org 可见。给团队划独立空间的第一步就是把这两条删掉,再显式授权给 Team:

  1. Folder → Permissions,删除默认的 Editor、Viewer 两条记录;
  2. Add permission → 选 Team(如 payment-team)→ 给 Edit;
  3. 需要旁观的团队另给 View。
Folder 设计的经验

按「需要不同权限的最小单位」建 Folder,一般就等于业务团队:payment、infra、data 各一个。全公司共用的大盘单独建一个 Folder 保持默认权限即可。别按仪表盘类型建(「CPU」「网络」这种),权限没法按类型分。

服务账号与 API​

人走 UI,机器走 Service account。Grafana 10.3 起 Service account 全面取代旧的 API Keys,Grafana 11 里 API Keys 已彻底移除——老文档里教的 API Key 那套别再用了。

创建:Administration → Users and access → Service accounts → Add service account。起名、选角色(最小权限:CI 只推仪表盘给 Editor 就够)、Add token。token 是一长串 glsa_ 开头的字符串,只显示一次,直接存进 CI 的密钥管理,别贴进群消息。

HTTP API 速览​

日常自动化用得最多的三个端点:

端点用途
POST /api/dashboards/db新建或更新仪表盘(body 带 dashboard JSON 和 folderUid)
GET /api/dashboards/uid/:uid按 UID 导出仪表盘 JSON
GET /api/search按关键词搜仪表盘和 Folder

两行 curl 示例,照抄改地址:

# 搜索名称含 node 的仪表盘
curl -H "Authorization: Bearer $GRAFANA_TOKEN" \
"http://grafana.internal:3000/api/search?query=node"
# 把本地 dashboard.json 推到 Grafana(CI 里建仪表盘就这么干)
curl -X POST -H "Authorization: Bearer $GRAFANA_TOKEN" \
-H "Content-Type: application/json" \
-d @dashboard.json \
http://grafana.internal:3000/api/dashboards/db

push 用的 JSON 骨架长这样,外层包一层 dashboard、folderUid、overwrite:

{
"dashboard": { "title": "...", "uid": "...", "panels": [] },
"folderUid": "payment",
"overwrite": true,
"message": "update from CI"
}
更大规模用 provisioning

仪表盘一多,CI 逐条 push 不如 provisioning:把 JSON 放进文件系统,Grafana 启动自动加载,天然配合 git 做版本管理。API 推送适合轻量自动化,provisioning 适合全量管理。

实战:给团队分一套独立空间​

需求:支付团队要自己的地盘,能随便建改仪表盘,别动别人的,也别被别人动。

决策第一步:Folder 还是 Org?同实例内共享数据源体系,选 Folder + Team;需要完全隔离(连数据源都不共享)才建 Org。下面按 Folder 方案走一遍:

  1. 建 Team:Administration → Teams → New team,命名 payment,把成员拉进去(成员得先是本 Org 的用户)。
  2. 建 Folder:Dashboards → New folder,命名「支付业务」。
  3. 收默认权限:Folder → Permissions,删掉默认的 Editor、Viewer 两条记录。
  4. 授权给 Team:Add permission → Team 选 payment → 权限给 Edit;只看不改的人另建 payment-readonly Team 给 View。
  5. 设默认首页:让团队一进 Grafana 就看到自己的大盘。Org 级在 Administration → Default preferences 里选 Home Dashboard;Team 级在 Team 的 Settings 里也能设,Team 首页优先于 Org 首页。
新仪表盘放错地方怎么办

成员建仪表盘时如果保存到了别的 Folder,权限就跟着那边走了。养成习惯:保存时先看一眼 Folder 选择。存错了就用 Move 移回自己的 Folder,权限立即继承目标 Folder。

常见坑​

公开链接一旦发出就收不回​

Public dashboard 的链接不可猜,但谁拿到谁就能看,被转发一次等于公开。开之前想清楚:这上面的数据给外人看到会怎样。定期在 Administration → Public dashboards 扫一遍全站列表,没人认领的就 Disable。泄露后可以删除重建(换新 token),但已经泄出去的数据收不回来。

Snapshot 的数据驻留问题​

这条再说一遍,因为它最隐蔽:默认快照存在 snapshot.raintank.io,快照 JSON 里是完整的查询结果。内网数据敏感的组织直接把外部发布关掉,快照存本地库:

[snapshots]
external_enabled = false

Viewer 不是「低配 Editor」​

Viewer 是硬只读:不能加注释、不能改告警规则、不能保存任何修改。常见误会:给巡检同学开 Viewer,然后要求人家故障时在仪表盘上打注释标时间点——做不到。需要标注释就给 Editor;或者开 [users] viewers_can_edit = true,允许 Viewer 临时编辑探索,但仍然不能保存。告警相关的权限边界见告警与通知一篇。

API token 权限最小化​

Service account 直接给 Admin 是偷懒的顶级形式:CI 脚本泄露 token 等于整个 Org 敞开。按用途拆分:推仪表盘的给 Editor、只读拉报表的给 Viewer,一个用途一个 service account。token 创建时设过期时间、到期轮换;怀疑泄露立刻进 Service account 页面吊销,别等排查结论。

小结​

本篇把「给别人用」的三件事讲完了:分享按数据敏感度选——静态数据用 snapshot(注意数据驻留第三方的问题)、实时只读用 public dashboard(注意泄露面)、嵌入选 iframe(记得 allow_embedding 与匿名访问的配合);权限记住 Org 隔离、Team 授权、Folder 挂载、Dashboard 别单独覆盖;自动化走 Service account 加 HTTP API,token 最小权限、定期轮换。下一篇收尾:生产部署、备份、安全基线与排障。