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

What IAM permissions are needed to use CDK Deploy?

我的团队有一个在执行 IAM 角色下运行的管道。我们想通过 CloudFormation 或 CDK 将代码部署到 AWS。

过去,我们会使用执行 IAM 角色将一些工件上传到 creating/updating 我们的 CloudFormation 堆栈之前的 S3 存储桶。

我们最近切换到 CDK,并试图通过使用 CDK Deploy 尽可能地实现自动化,但是 运行 我们需要添加很多我们没有的权限项先验(例如,cloudformation:GetTemplate)。

我们不想只授予 *(我们想遵循最小特权),但我找不到任何明确的记录列表。

是否有CDK Deploy 依赖的标准权限列表?有没有超出标准列表的"nice to have's"?

因为我在任何地方都找不到任何文档,所以我不得不反复试验才能让它发挥作用。

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

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

到您正在创建的堆栈 ARN,以及 bootstrap 堆栈:

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

您还需要对 boostrap 添加的存储桶具有 s3 权限(否则您会遇到可怕的 Forbidden: null 错误):

s3:*Object
s3:ListBucket
s3:GetBucketLocation

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

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 函数支持的 custom CFN resource。通过该自定义资源创建资源时,您可以在 Lambda 中执行 任何操作,因为它是通过 CloudFormation 触发的。

当您使用查找(那些是 .fromXxx(...) 方法)时,CDK 将在 运行 时向相关服务发出 read/list 请求 - 而 CDK 合成器是 运行ning,不是 CloudFormation 部署。当然,您需要哪些权限取决于您在代码中进行的查找。例如,如果您有 Vpc.fromLookup(),您应该允许操作 ec2:DescribeVpcs。如果您不担心访问敏感内容,当然可以附上 ReadOnlyAccess 政策。

我们还需要添加以下权限。

ssm:PutParameter
ecr:SetRepositoryPolicy
ecr:GetLifecyclePolicy
ecr:PutImageScanningConfiguration
ssm:GetParameters
ecr:DescribeRepositories

CDK 有两个阶段 bootstrap 和 synth/deploy。

bootstrap 的情况下,使用的 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。

可以通过限制权限来改进 bootstrap 政策,但缺少文档,因此我不深入研究具体方面(示例 s3)