在 CloudFormation 中创建自承担 IAM 角色时的竞争条件

问题描述 投票:0回答:1

在 AWS CloudFormation 中创建 IAM 角色时,我面临竞争条件,该角色具有允许其自行承担的信任策略 (

sts:AssumeRole
)。出现此问题的原因是角色需要在 AssumeRolePolicyDocument 中引用其自己的 ARN,但 CloudFormation 尝试在角色完全创建之前解决此问题,从而导致循环依赖和竞争条件。

问题: 在我的 CloudFormation 模板中,我使用信任策略定义 IAM 角色,该策略允许该角色自行承担:

MyNewRole:
  Type: AWS::IAM::Role
  Properties:
    RoleName: my-new-role
    AssumeRolePolicyDocument:
      Version: "2012-10-17"
      Statement:
        - Effect: Allow
          Principal:
            AWS: arn:aws:iam::<account-id>:role/my-new-role
          Action: sts:AssumeRole

但是,我遇到了以下错误:

Invalid principal in policy: "AWS":"arn:aws:iam::<account-id>:role/my-new-role" (Service: Iam, Status Code: 400)

此错误表明该角色在实际存在之前已在信任策略中被引用,从而导致竞争条件。

问题:

如何在 CloudFormation 中处理这种竞争条件(其中 IAM 角色需要自行承担)?有没有办法在角色创建后延迟或更新信任策略,或者有更好的方法来解决这个问题吗?

我尝试过的:

  1. 使用
    Fn::Sub
    在同一模板内动态引用角色的 ARN,但这仍然会导致竞争条件。
  2. 探索关于 IAM 角色信任策略行为的 AWS 博客更新,但我不确定如何在这种情况下应用它。
  3. 考虑使用 Lambda 支持的自定义资源,但如果可能的话更喜欢纯 CloudFormation 解决方案。

任何有关解决此竞争条件的指导将不胜感激!

aws-cloudformation amazon-iam race-condition sam aws-roles
1个回答
0
投票

此解决方案允许您使用条件过滤可以承担角色的人员,而不是显式指定“主体”。

注意:这可能会触发安全警告,因为它看起来允许“*”

MyNewRole:
  Type: AWS::IAM::Role
  Properties:
    RoleName: my-new-role
    AssumeRolePolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Principal:
            AWS: '*'
          Action: sts:AssumeRole
          Condition:
            StringLike:
              aws:PrincipalArn: !Sub arn:aws:iam::${AWS::AccountId}:role/my-new-role
© www.soinside.com 2019 - 2024. All rights reserved.