28

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

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

我们最近切换到 CDK,并试图通过使用 CDK Deploy 尽可能地自动化,但遇到了很多我们需要添加的权限项,而这些权限项是我们之前没有的(例如,cloudformation:GetTemplate) .

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

是否有 CDK Deploy 依赖的标准权限列表?除了标准清单之外,还有什么“值得拥有的”吗?

4

2 回答 2

43

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 合成器正在运行时,而不是 CloudFormation 部署。当然,您需要哪些权限取决于您在代码中的查找。例如,如果你有一个Vpc.fromLookup()你应该允许 action ec2:DescribeVpcs。当然ReadOnlyAccess,如果您不担心访问敏感内容,您可以附上该政策。

于 2020-04-08T13:48:38.800 回答
25

由于我在任何地方都找不到任何文档,因此我不得不进行一些试验和错误才能使其正常工作。

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

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

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

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

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

s3:*Object
s3:ListBucket
s3:GetBucketLocation

arn:aws:s3:::cdktoolkit-stagingbucket-*
于 2019-10-14T08:48:20.853 回答