含多主体与条件的AWS角色信任策略正确性及文档咨询
问题解答
你当前生成的信任策略不正确,会导致AWS Backup服务无法正常扮演该角色,原因如下:
IAM策略的单个Statement内,所有配置项(Principal、Action、Condition)是逻辑与的关系——即该Statement下的所有Principal都必须满足Condition的要求才能匹配规则。你的策略把AWS账户根用户和Backup服务放在同一个Statement中并附加了sts:ExternalId条件,这意味着Backup服务尝试调用sts:AssumeRole时也必须提供指定的ExternalId,但AWS服务本身无法传入自定义的ExternalId参数,因此会被拒绝访问。
正确的策略写法
必须将两种需求拆分为两个独立的Statement,分别定义规则:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCrossAccountAccessWithExternalId", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::444555666:root" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "444-555-666-777-888" } } }, { "Sid": "AllowAWSBackupServiceAccess", "Effect": "Allow", "Principal": { "Service": "backup.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
对应的Terraform HCL代码示例:
resource "aws_iam_role" "target_role" { name = "cross-account-backup-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Sid = "AllowCrossAccountAccessWithExternalId" Effect = "Allow" Principal = { AWS = "arn:aws:iam::444555666:root" } Action = "sts:AssumeRole" Condition = { StringEquals = { "sts:ExternalId" = "444-555-666-777-888" } } }, { Sid = "AllowAWSBackupServiceAccess" Effect = "Allow" Principal = { Service = "backup.amazonaws.com" } Action = "sts:AssumeRole" } ] }) }
AWS策略逻辑说明
IAM采用基于语句的评估机制:
- 每个Statement是独立的判断单元,只要有一个Statement的Effect为Allow且所有匹配条件都满足,请求就会被允许;仅当所有Statement都不匹配,或匹配的都是Deny时,请求才会被拒绝。
- 单个Statement内部的所有元素(Principal、Action、Condition等)是逻辑与的关系,必须全部满足才能触发该Statement的规则。
内容的提问来源于stack exchange,提问作者user2728349
相关产品推荐
相关产品推荐

