如何创建仅允许通过CloudFormation创建AWS资源的IAM策略与角色?
仅允许通过CloudFormation创建资源的AWS策略与角色实现方案
这是个非常典型的合规管控需求,我来分享一套经过生产环境验证的最优实现方案——核心是利用AWS IAM的条件键精准限制操作发起方,确保只有CloudFormation能创建资源,彻底阻断控制台的直接操作。
1. 编写核心IAM权限策略
这个策略的核心逻辑是:仅允许当请求由CloudFormation发起时,执行指定的资源创建/管理操作,所有其他场景(包括控制台手动操作)都会因为IAM默认的拒绝规则而被阻断。
下面是一个示例策略(你可以根据实际需要调整资源和操作范围):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:RunInstances", "s3:CreateBucket", "lambda:CreateFunction", // 这里添加你需要CloudFormation管理的所有资源操作 "cloudformation:*" // 允许CloudFormation自身的栈操作 ], "Resource": "*", // 建议根据实际需求缩小资源范围,比如指定特定S3桶前缀、EC2实例类型等 "Condition": { "StringEquals": { "aws:CalledVia": "cloudformation.amazonaws.com" } } } ] }
关键细节说明
aws:CalledVia条件键:这个键会记录请求的发起服务,当CloudFormation调用其他AWS服务API时,该值会被设为cloudformation.amazonaws.com,完美区分控制台手动操作(控制台操作的aws:CalledVia不会包含这个值)。- 最小权限原则:不要直接用
Action: "*",而是明确列出CloudFormation需要执行的具体操作,比如如果只需要创建S3桶,就只保留s3:CreateBucket。 - 资源范围:尽量缩小
Resource的范围,比如指定特定的VPC ARN、S3桶前缀,进一步降低权限风险。
2. 创建IAM角色并关联策略
接下来需要创建一个IAM角色,让CloudFormation可以扮演这个角色来执行资源操作:
2.1 设置信任策略(Trust Policy)
信任策略要允许CloudFormation服务作为主体来扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "cloudformation.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
2.2 关联权限策略
将第一步编写的权限策略附加到这个角色上。
3. 使用该角色创建CloudFormation栈
当你创建CloudFormation栈时,需要指定这个角色的ARN,确保CloudFormation使用该角色执行操作:
- AWS CLI命令示例:
aws cloudformation create-stack --stack-name MyRestrictedStack --template-body file://my-template.yaml --role-arn arn:aws:iam::123456789012:role/CloudFormationRestrictedRole
- 如果用控制台创建栈(注意:这里是创建栈的操作,不是创建底层资源的操作),在“权限”步骤中选择刚才创建的角色即可。
4. 验证效果
- 允许场景验证:使用上述角色创建CloudFormation栈,应该能成功创建所有指定的资源。
- 禁止场景验证:尝试直接通过AWS控制台创建资源(比如手动创建S3桶),会收到权限拒绝的错误;用普通IAM用户调用API(不通过CloudFormation)也会被拒绝。
额外注意事项
- 如果你的CloudFormation模板需要调用其他服务(比如Lambda函数、SNS主题),确保权限策略中包含对应的操作权限。
- 如果你需要允许特定用户管理CloudFormation栈(比如创建/删除栈),可以单独给这些用户添加
cloudformation:*权限,但要注意不要让他们直接操作底层资源。 - 可以结合AWS Config来监控是否有非CloudFormation创建的资源,作为额外的合规校验层。
内容的提问来源于stack exchange,提问作者Sarang
相关产品推荐
相关产品推荐

