适用场景
使用 Grafana 搭建监控面板的运维团队,尤其是面板暴露在公网或内网多网段可达的场景。当监控数据包含业务指标、服务器资源占用、数据库连接数等敏感信息时,未加固的 Grafana 面板可能成为攻击者收集情报的入口。本文适用于 Grafana 8.x/9.x/10.x 全系列,同样适用于通过 Nginx 反向代理部署的方式。
前置条件
- 已安装 Grafana,版本可通过
grafana-server -v查看 - 具有服务器 root 或 sudo 权限,可修改
/etc/grafana/grafana.ini - 防火墙规则可调整(本机
ufw、firewalld或nftables均可) - 如需 HTTPS,需准备域名与证书(可用 Certbot 自动签发)
原理说明
Grafana 安全风险的根源在于默认配置面向易用性而非安全:匿名访问开关默认关闭但常被误开启;管理员账号默认 admin/admin 若不修改即完全暴露;面板服务默认监听 0.0.0.0:3000,任何可达主机都能访问登录页。历史上 Grafana 曾曝出多个高危漏洞,例如 CVE-2021-43798(任意文件读取,未授权即可利用)、CVE-2023-3128(低权限目录穿越)以及登录页 CSRF 类漏洞(CVE-2022-39328),这些漏洞均可通过限制网络暴露面、关闭匿名访问、强制 HTTPS 等方式显著降低利用风险。
操作步骤
1. 关闭匿名访问并修改默认口令
编辑 /etc/grafana/grafana.ini,确保以下配置生效:
# 关闭匿名访问
[auth.anonymous]
enabled = false
# 修改默认管理员(首次启动后也可在 Web 界面修改)
[security]
admin_user = admin
admin_password = <强密码>
# 建议 32 位以上随机字符串,用于签名会话与数据源加密
secret_key = <openssl rand -hex 32 生成>
修改后重启服务:systemctl restart grafana-server。注意 secret_key 一旦变更,所有已保存的数据源密码将无法解密,需重新录入,因此务必在配置前备份。
2. 配置 IP 白名单与绑定地址
让 Grafana 只监听内网地址,并将公网访问收敛到反向代理层:
# 仅监听内网,示例为 10.0.0.10
[server]
http_addr = 10.0.0.10
http_port = 3000
同时在系统防火墙限制 3000 端口仅对管理网段开放:
# firewalld
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.0.1.0/24 port port=3000 protocol=tcp accept'
firewall-cmd --reload
# 或 ufw
ufw allow from 10.0.1.0/24 to any port 3000 proto tcp
3. 通过 Nginx 反向代理并启用 HTTPS
推荐把 3000 端口完全关闭公网,用 Nginx 代理并叠加 TLS 与访问认证:
server {
listen 443 ssl;
server_name grafana.example.com;
ssl_certificate /etc/letsencrypt/live/grafana.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/grafana.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 关键:显式传递 X-Forwarded-Proto,避免 Grafana 生成 http 链接
proxy_set_header X-Forwarded-Proto $scheme;
# 限制来源 IP(可选)
allow 10.0.1.0/24;
deny all;
}
}
对应在 grafana.ini 中开启强制跳转:
[server]
root_url = https://grafana.example.com
domain = grafana.example.com
enforce_domain = false
[auth]
# 关键参数:登录 Cookie 仅经 HTTPS 传输
login_cookie_secure = true
4. 加固会话与面板访问
[security]
# 禁止在 iframe 中嵌入面板,防点击劫持
allow_embedding = false
# Cookie SameSite 策略
cookie_samesite = strict
[users]
# 禁止自助注册
allow_sign_up = false
# 新用户默认只读权限
auto_assign_org_role = Viewer
配置验证
# 1. 验证监听地址
ss -tlnp | grep 3000
# 2. 未登录访问需 302 跳转登录页
curl -sI http://10.0.0.10:3000/ | head -3
# 3. 匿名访问应返回 302/403(若返回 200 则匿名未关闭)
curl -sI http://10.0.0.10:3000/api/health
# 4. 反向代理 HTTPS 正常
curl -sI https://grafana.example.com/ | head -3
# 5. 检查面板版本并对照官方安全公告
curl -s http://10.0.0.10:3000/api/health
常见问题
Q1:修改 secret_key 后数据源全部报错怎么办?
这是预期行为,secret_key 是数据源密码的加密密钥。恢复方式:改回原 secret_key 重启;若已丢失,需在各数据源中重新录入密码。建议修改前备份 grafana.db。
Q2:关闭匿名访问后监控大屏无法分享给同事?
不要为了分享而重新开启匿名。推荐方案:为访客创建只读账号(Viewer 角色)并设置面板链接分享;或使用 Grafana 官方分享功能(Public Dashboards,需显式开启并限定时间范围),同时保持 allow_embedding = false。
总结
Grafana 安全加固的核心是「收敛暴露面、关闭默认后门、加密传输」三步:关闭匿名访问并修改默认口令,限制监听地址与来源 IP,用 Nginx+HTTPS 反向代理,最后加固会话 Cookie。按本方案配置后,可有效降低 CVE-2021-43798 等历史漏洞的未授权利用风险。建议结合版本升级(始终运行最新稳定版)与定期审计,形成常态化安全检查。