如何限制IAM角色/用户仅访问指定CloudWatch Dashboard用于Grafana?
解决方案:CloudWatch Dashboard 精细化权限控制与Grafana隔离
首先得明确:AWS CloudWatch 本身支持资源级IAM权限来限定单个Dashboard的访问,但要彻底解决客户间数据隔离(包括防止修改查询越权),需要结合IAM权限控制和Grafana的权限配置,双管齐下。
1. 用IAM资源级权限精确锁定单个Dashboard与对应指标
你之前的尝试可能没覆盖到指标层面的权限限制——只限制Dashboard访问是不够的,用户如果能修改Grafana查询,依然可以调取其他客户的指标。所以需要同时限制Dashboard访问和指标访问:
示例IAM权限策略(针对客户A)
{ "Version": "2012-10-17", "Statement": [ // 仅允许访问指定的Dashboard A { "Effect": "Allow", "Action": "cloudwatch:GetDashboard", "Resource": "arn:aws:cloudwatch::YOUR_ACCOUNT_ID:dashboard/Dashboard-A" }, // 仅允许获取客户A专属指标的数据(假设你的指标按客户分命名空间) { "Effect": "Allow", "Action": [ "cloudwatch:GetMetricData", "cloudwatch:GetMetricStatistics" ], "Resource": "*", "Condition": { "StringEquals": { "cloudwatch:namespace": "Customer-A-Namespace" } } }, // 如果Grafana需要加载Dashboard中的图表,补充ListMetrics权限并加条件 { "Effect": "Allow", "Action": "cloudwatch:ListMetrics", "Resource": "*", "Condition": { "StringEquals": { "cloudwatch:namespace": "Customer-A-Namespace" } } } ] }
- 核心思路:把指标按客户隔离在独立的命名空间(或维度),通过IAM条件限制只能访问该命名空间的指标,从根源上阻止越权查询。
- 注意:
cloudwatch:ListDashboards无法按Dashboard名称过滤,建议不要给这个权限,让Grafana直接通过Dashboard的ARN或名称加载,避免用户看到其他Dashboard列表。
2. 为每个客户创建独立的IAM角色
不要共用同一个IAM角色,而是给每个客户创建专属角色:
- 每个角色绑定对应客户的专属权限策略(匹配自己的Dashboard和指标命名空间)。
- Grafana通过AssumeRole方式访问CloudWatch,每个客户的Grafana数据源对应一个专属角色,彻底隔离权限范围。
3. Grafana端的权限加固
光靠IAM还不够,需要在Grafana层面限制用户操作权限:
- 创建专属用户组:比如给客户A创建
Customer-A-Viewers组,只赋予该组对Dashboard A的View权限,完全拒绝Edit权限(包括修改查询、编辑仪表盘结构)。 - 锁定数据源:在Grafana的CloudWatch数据源设置中,取消“允许编辑数据源”选项,防止用户修改配置切换到其他角色。
- 隐藏其他Dashboard:在Grafana权限设置中,确保每个客户的用户组只能看到自己的Dashboard,无法访问其他客户的资源。
4. 替代方案:用CloudWatch Embedded Dashboard(如果不需要Grafana高级功能)
如果你的需求只是让客户查看固定Dashboard,不需要Grafana的自定义查询功能,可以直接使用CloudWatch的嵌入式Dashboard:
- 生成带有签名的嵌入URL,有效期可控,且只能访问指定Dashboard。
- 这种方式不需要Grafana,直接让客户通过URL查看,完全避免修改查询的风险。
关键提醒
- 一定要在IAM层面限制指标的访问范围,而不是只限制Dashboard——这是防止越权的核心。
- 测试时模拟客户操作:尝试修改Grafana查询,验证是否能调取其他客户的指标,如果可以,说明IAM条件配置不到位,需要调整。
内容的提问来源于stack exchange,提问作者darkownage
相关产品推荐
相关产品推荐

