分享与权限管理
前面六篇解决的是「自己把 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 重复建——数据源、告警规则、服务账号各配一份,管理成本翻倍。只是想把两个团队的仪表盘分开?用 Folder,别用 Org。
Org 之上还有一档 Server Admin(默认 admin 账号):能建 Org、管全站用户、改全站设置。生产环境这个账号锁进保险柜,日常操作用各 Org 的普通 Admin。
Team 与三角色
Org 内的角色分三档:
| 角色 | 能做什么 | 不能做什么 |
|---|---|---|
| Viewer | 看仪表盘、调时间范围、临时改查询探索(不保存) | 建改删仪表盘、管数据源、加注释 |
| Editor | Viewer 全部 + 建改删仪表盘、管理告警规则、加注释 | 管数据源、管用户、装插件 |
| Admin | Org 内一切:数据源、团队、用户、服务账号、插件 | 跨 Org 操作、全站设置(Server Admin 的活) |
Team 是权限的载体,铁律一条:永远给 Team 授权,不给个人授权。人离职从 Team 移除即完成权限回收;给个人授权的结局是半年后没人说得清谁能看什么。
Folder 与 Dashboard
Folder 是仪表盘的目录,也是权限的实际挂载点。规则两条:
- Dashboard 默认继承所在 Folder 的权限;
- Dashboard 可以单独覆盖权限,但别这么做——覆盖一次,权限矩阵就再也算不清了。
新建的 Folder 默认带两条权限记录:Editor 角色可编辑、Viewer 角色可查看——等于全 Org 可见。给团队划独立空间的第一步就是把这两条删掉,再显式授权给 Team:
- Folder → Permissions,删除默认的 Editor、Viewer 两条记录;
- Add permission → 选 Team(如 payment-team)→ 给 Edit;
- 需要旁观的团队另给 View。
按「需要不同权限的最小单位」建 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"
}
仪表盘一多,CI 逐条 push 不如 provisioning:把 JSON 放进文件系统,Grafana 启动自动加载,天然配合 git 做版本管理。API 推送适合轻量自动化,provisioning 适合全量管理。
实战:给团队分一套独立空间
需求:支付团队要自己的地盘,能随便建改仪表盘,别动别人的,也别被别人动。
决策第一步:Folder 还是 Org?同实例内共享数据源体系,选 Folder + Team;需要完全隔离(连数据源都不共享)才建 Org。下面按 Folder 方案走一遍:
- 建 Team:Administration → Teams → New team,命名
payment,把成员拉进去(成员得先是本 Org 的用户)。 - 建 Folder:Dashboards → New folder,命名「支付业务」。
- 收默认权限:Folder → Permissions,删掉默认的 Editor、Viewer 两条记录。
- 授权给 Team:Add permission → Team 选
payment→ 权限给 Edit;只看不改的人另建payment-readonlyTeam 给 View。 - 设默认首页:让团队一进 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 最小权限、定期轮换。下一篇收尾:生产部署、备份、安全基线与排障。