使用CDK Deploy需要哪些IAM权限?

53
我的团队有一个运行在执行IAM角色下的流水线。我们希望通过CloudFormation或CDK将代码部署到AWS。
过去,我们会使用执行IAM角色将一些构件上传到S3存储桶中,然后使用它来创建/更新我们的CloudFormation堆栈。
我们最近转向了CDK,并试图尽可能多地使用CDK Deploy进行自动化,但是我们遇到了许多需要添加的权限项,而这些权限我们以前并没有(例如,cloudformation:GetTemplate)。
我们不想仅授予*(我们要遵循最小特权原则),但我找不到任何明确的文档列表。
CDK Deploy依赖于哪些标准权限列表?除了标准列表外,还有什么“好用的”权限?
5个回答

100

CDK v2 现在具备并承担其自身角色。不再需要手动管理权限。您只需要授予承担 cdk 角色的权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        }
    ]
}

这些角色是通过cdk bootstrap创建的,因此需要具备创建角色和策略的权限。但是,在引导完成后,这不再是必需的。所以你可以使用特权角色手动运行它。
显然,如果任何cdk角色无法被假定,CDK将继续进行。因此,仍然可以像下面那样手动管理CDK策略,但可能需要额外的权限。
请注意,CFN角色附加了管理员策略。

CDK v1的先前答案:

我正在使用以下策略部署CDK应用程序。除了对CDK暂存桶具有CFN完全访问权限和S3完全访问权限外,它还授予通过CloudFormation进行所有操作的权限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudformation:*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:CalledVia": [
                        "cloudformation.amazonaws.com"
                    ]
                }
            },
            "Action": "*",
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::cdktoolkit-stagingbucket-*",
            "Effect": "Allow"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": "arn:aws:ssm::*:parameter/cdk-bootstrap/*"
        }
    ]
}

你可能需要添加一些明确的拒绝项,以防止不想允许的事情发生。

此外,请注意上述条件并不意味着主体仅限于可以使用CloudFormation实现的事物。潜在的攻击向量是创建一个由Lambda函数支持的自定义CFN资源。通过该自定义资源创建资源时,您可以在Lambda中执行任何操作,因为它是通过CloudFormation触发的。

当您使用查找(这些是.fromXxx(...)方法)时,CDK将在运行时向相关服务进行读取/列表请求 - 在CDK synth运行时,而不是CloudFormation部署时。当然,您需要哪些权限取决于代码中的查找。例如,如果您有一个Vpc.fromLookup(),则应允许操作ec2:DescribeVpcs。当然,如果您不担心访问敏感内容,可以附加ReadOnlyAccess策略。


4
似乎 ec2:Describe* 操作也是必需的,以允许 CDK 应用程序解析 AMI 等内容。 - solidsnack
1
查找似乎被嵌入了许多CDK功能中。 - solidsnack
我在答案中添加了一个关于查找的注释。当然,这非常特定于您在代码中进行的查找,因此不能成为一种通用的“一刀切”的政策的一部分。 - udondan
@udondan 关于CDK v2解决方案... 我应该将这个策略附加在哪里?我尝试创建了一个策略并将其附加到用户,但它没有起作用。 - alayor
@alayor,那应该已经足够了。如果还不起作用,您应该查看CloudTrail,并查看用户是否已记录权限问题。 - udondan
显示剩余2条评论

27

由于我无法在任何地方找到文档,所以我不得不进行一些试错才能使其正常工作。

除了权限之外,您需要创建堆栈中定义的实际资源,您还需要提供以下内容:

cloudformation:DescribeStacks
cloudformation:CreateChangeSet
cloudformation:DescribeChangeSet
cloudformation:ExecuteChangeSet
cloudformation:DescribeStackEvents
cloudformation:DeleteChangeSet
cloudformation:GetTemplate

对于您正在创建的堆栈 ARN 和引导堆栈:

arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/CDKToolkit/*

您还需要对引导程序添加的存储桶具有S3权限(否则会出现可怕的Forbidden: null错误):

s3:*Object
s3:ListBucket
s3:GetBucketLocation

to

arn:aws:s3:::cdktoolkit-stagingbucket-*

2
对于任何找到这篇文章的人,你还需要在 CDK 工具包存储桶中添加 s3:GetBucketLocation 权限作为 S3 权限。 - Jacob Lambert
1
我也需要 cloudformation:GetTemplate - Aleksi

9

CDK 有两个阶段:引导(bootstrap)和合成/部署(synth/deploy)。

在进行引导时,使用的 IAM 角色或配置文件必须具备以下策略权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StsAccess",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole",
                "iam:*Role*"
            ],
            "Resource": [
                "arn:aws:iam::${AWS_ACCOUNT_ID}:role/cdk-*"
            ]
        },
        {
            "Action": [
                "cloudformation:*"
            ],
            "Resource": [
                "arn:aws:cloudformation:${AWS_REGION}:${AWS_ACCOUNT_ID}:stack/CDKToolkit/*"
            ],
            "Effect": "Allow"
        },
        {
            "Sid": "S3Access",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "ECRAccess",
            "Effect": "Allow",
            "Action": [
                "ecr:SetRepositoryPolicy",
                "ecr:GetLifecyclePolicy",
                "ecr:PutImageScanningConfiguration",
                "ecr:DescribeRepositories",
                "ecr:CreateRepository",
                "ecr:DeleteRepository"
            ],
            "Resource": [
                "arn:aws:ecr:${AWS_REGION}:${AWS_ACCOUNT_ID}:repository/cdk-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter*",
                "ssm:PutParameter*",
                "ssm:DeleteParameter*"
            ],
            "Resource": "arn:aws:ssm:${AWS_REGION}:${AWS_ACCOUNT_ID}:parameter/cdk-bootstrap/*"
        }
    ]
}

在部署的情况下,角色或配置文件必须具备以下权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        }
    ]
}

除了部署所需的所有权限外,还需要额外的权限。

我的建议是使用两种不同的角色来增加安全性,并且如果您正在使用GitHub工作流程,则可以利用OpenIdConnect。

引导策略可以通过限制权限来改进,但是文档缺乏具体内容(例如s3),因此我不会深入研究。


谢谢!这真的很有帮助。你能分享一下你获取启动所需权限信息的来源吗? - SweetFeet
在通过OIDC令牌访问GitHub的基础上,您还可以在IAM侧将此访问限制在GitHub环境中。 可以配置GitHub环境以要求明确的批准。这可以在CDK假定的角色的信任关系中配置为“条件”。 - Felix
这篇帖子对于引导权限非常有用:https://dev59.com/CHMOtIcB2Jgan1znSCWT#71923639。您还可以使用CDK CLI并运行:cdk bootstrap --show-template > bootstrap-template.yaml。这提供了用于引导的CloudWatch模板。 - Joelster
1
我需要添加:"ecr:PutLifecyclePolicy" - Ben Stickley

0
我们还需要添加以下权限。
ssm:PutParameter
ecr:SetRepositoryPolicy
ecr:GetLifecyclePolicy
ecr:PutImageScanningConfiguration
ssm:GetParameters
ecr:DescribeRepositories

0

我正在使用这个来自GitHub actions的自动化部署,唯一能让它工作的方法是授予权限。

    {
      "Sid": "PolicyForSpecificStack",
      "Effect": "Allow",
      "Action": "cloudformation:*",
      "Resource": "arn:aws:cloudformation:<region>:*:stack/<my-stack-name>/*"
    },
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["*"]
    }

根据我部署CloudFormation堆栈的策略,我的最终策略如下所示。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["iam:PassRole"],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": ["sts:AssumeRole"],
      "Resource": ["arn:aws:iam::*:role/cdk-*"]
    },
    {
      "Sid": "PolicyForSpecificStack",
      "Effect": "Allow",
      "Action": "cloudformation:*",
      "Resource": "arn:aws:cloudformation:<region>:*:stack/<my-stack-name>/*"
    },
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["*"]
    }
  ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接