You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:01:18