基于OpenID Connect的AWS跨账号角色配置权限问题排查
跨账号IAM角色权限拒绝排查与解决
问题场景
Bitbucket仓库中的Terraform ACM模块通过OpenID Connect认证到MGMT账号,获取bitbucket.pipelines角色并成功在MGMT账号创建证书。但执行到PROD账号创建CNAME记录完成证书验证步骤时,出现权限拒绝错误。
已配置内容
MGMT账号配置
- 角色ARN:
arn:aws:iam::987654321:role/bitbucket.pipelines - 该角色的STS假设权限策略:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": [ "sts:AssumeRole" ], "Resource": "arn:aws:iam::123456789:role/AWS-SCM-ROLE" } }
PROD账号配置
- 角色ARN:
arn:aws:iam::123456789:role/AWS-SCM-ROLE - 该角色的信任关系策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::987654321:role/bitbucket.pipelines" ] }, "Action": "sts:AssumeRole" } ] }
执行流程
Bitbucket +-------------+ OpenID Connect +-----------------+ | +-----------------------------> | | Terraform | | MGMT Account | | <-----------------------------+ | +-------------+ Token: bitbucket role +-----------------+ Bitbucket +-------------+ Execute TF ACM Module +-----------------+ | +-----------------------------> | | Terraform | | MGMT Account | | <-----------------------------+ | +-------------+ Exit Code 0 +-----------------+ Bitbucket +-------------+ ACM Cont. Execution +-----------------+ | +-----------------------------> | | Terraform | | PROD Account | | <-----------------------------+ | +-------------+ Exit Code 1 +-----------------+
排查与解决方法
1. 补全PROD角色的资源操作权限
当前仅配置了PROD角色的信任关系,但该角色缺少创建CNAME记录的具体权限。需为AWS-SCM-ROLE添加Route53(或对应DNS托管服务)的权限策略,示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["route53:ChangeResourceRecordSets"], "Resource": "arn:aws:route53:::hostedzone/[你的托管区ID]" }, { "Effect": "Allow", "Action": ["route53:ListHostedZones"], "Resource": "*" } ] }
2. 确认Terraform角色切换逻辑正确性
确保Terraform在操作PROD账号时,正确调用sts:AssumeRole获取临时凭证并绑定到对应provider,示例代码:
provider "aws" { alias = "prod" assume_role { role_arn = "arn:aws:iam::123456789:role/AWS-SCM-ROLE" } } resource "aws_route53_record" "acm_validation" { provider = aws.prod # 此处填入CNAME记录的具体配置 }
3. 检查MGMT角色的条件限制
如果bitbucket.pipelines角色配置了会话标签、外部ID等条件策略,需确保这些条件在假设PROD角色时满足。比如MGMT角色的权限策略若有StringEquals标签限制,要验证标签是否能传递到PROD角色的会话中。
4. 排查AWS组织SCP限制
若两个账号属于同一AWS组织,检查组织级服务控制策略(SCP)是否封禁了sts:AssumeRole或Route53相关操作,确保对应权限未被全局限制。
5. 验证信任关系的准确性
确认PROD角色信任关系中的Principal是MGMT角色的完整正确ARN,无账号ID、角色名拼写错误。若MGMT角色配置了外部ID,需在PROD信任关系中添加对应Condition验证:
"Condition": { "StringEquals": { "sts:ExternalId": "[你的外部ID值]" } }
内容的提问来源于stack exchange,提问作者notomera
相关产品推荐
相关产品推荐

