如何用单条IAM策略语句拒绝AWS所有含-prod-的生产资源访问?
解决同一AWS账户下拒绝所有生产环境资源的IAM策略问题
我们团队在同一AWS账户内通过资源名称区分开发与生产环境(比如S3桶example-dev-bucket和example-prod-bucket),需要创建IAM角色实现“允许访问所有资源,但拒绝所有生产资源”的权限控制。
配置基础允许策略
先设置允许所有资源访问的策略,语句如下:
{ "Effect": "Allow", "Action": "*", "Resource": "*" }
遇到的问题
单独针对S3配置拒绝生产资源的策略可以正常生效:
{ "Effect": "Deny", "Action": "*", "Resource": "arn:aws:s3:::*-prod-*" }
但尝试用单条语句覆盖所有服务时,*-prod-*或arn:aws:*:*:*:*:*-prod-*这类格式会提示语法无效——这是因为AWS IAM的ARN通配符必须符合ARN的标准结构,不能随意添加多余的分隔符。
通用解决方案
要通过单条语句匹配所有ARN中包含-prod-的资源,可使用如下符合ARN规则的通配符策略:
{ "Effect": "Deny", "Action": "*", "Resource": "arn:aws:*:*:*:*prod*" }
策略说明
arn:aws:*匹配AWS所有服务- 中间的
*分别匹配任意区域、任意账户ID(如果是固定账户,可替换为具体账户ID提升安全性) - 最后的
*prod*匹配资源名称/路径中包含prod的内容,覆盖不同服务的ARN结构差异(比如S3桶的ARN无区域/账户段,EC2实例的ARN包含区域和账户段)
如果需要更严格的匹配(仅命中包含-prod-的资源,避免误匹配如myprod这类名称),可补充覆盖边界场景:
{ "Effect": "Deny", "Action": "*", "Resource": [ "arn:aws:*:*:*:*prod*", "arn:aws:*:*:*:prod*", "arn:aws:*:*:*:*prod" ] }
内容的提问来源于stack exchange,提问作者JanJetze
相关产品推荐
相关产品推荐

