如何创建允许所有AWS服务访问但排除Delete权限的IAM策略?
解决AWS策略允许所有服务但禁止Delete权限的简便方法
嘿,我完全懂你的困扰——逐个枚举每个AWS服务的Delete*动作不仅麻烦,而且直接用"*:Delete*"在NotAction里根本不生效,这其实是IAM的规则限制导致的。别担心,有个更简洁的方案能搞定这个需求。
核心思路:用Deny规则覆盖Allow权限
IAM的权限评估逻辑里,Deny会优先于Allow。所以我们可以先创建一个允许所有AWS服务操作的规则,再添加一个全局拒绝所有Delete开头动作的规则,这样就能轻松实现“允许所有,除了删除”的效果,不用逐个服务去标注。
完整策略示例
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" }, { "Effect": "Deny", "Action": "*:Delete*", "Resource": "*" } ] }
为什么这个方案可行?
- 第一个语句
"Action": "*"会允许所有AWS服务的所有操作,范围是全局的。 - 第二个语句
"Action": "*:Delete*"会匹配所有服务中以Delete开头的动作(比如ec2:DeleteVolume、s3:DeleteObject、iam:DeleteUser等),并且用Deny来禁止这些操作——由于Deny的优先级更高,这些删除动作会被彻底拦截。
注意事项
虽然绝大多数AWS服务的删除动作都是以Delete开头,但极少数服务可能有例外(比如某些自定义动作或者特殊命名的操作)。如果遇到这种情况,只需要在Deny语句里额外添加对应的动作即可,不过这种场景非常少见。
为什么你之前的NotAction方案不行?
IAM的NotAction字段不支持跨服务的通配符写法(比如*:Delete*),它只接受明确的服务前缀(比如ec2:*)或者完整的动作名。所以逐个服务写NotAction才会生效,但显然效率太低,不如上面的Deny方案简洁。
内容的提问来源于stack exchange,提问作者David Williams
相关产品推荐
相关产品推荐

