【问题标题】:What IAM permissions are needed to use CDK Deploy?使用 CDK Deploy 需要哪些 IAM 权限?
【发布时间】:2019-11-28 18:43:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: amazon-cloudformation amazon-iam aws-cdk


    【解决方案1】:

    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 将在运行时向相关服务发出读取/列表请求 - 当 CDK 合成器运行时,而不是 CloudFormation 部署。当然,您需要哪些权限取决于您在代码中的查找。例如,如果您有 Vpc.fromLookup(),则应允许操作 ec2:DescribeVpcs。如果您不担心访问敏感内容,当然可以附上ReadOnlyAccess 政策。

    【讨论】:

    • 似乎还需要 ec2:Describe* 操作,以允许 CDK 应用程序解析 AMI 和类似的东西。
    • 好电话,是的,这是用于查找的,CDK 通过 API 查找的东西。但这非常适合您的用例。
    • 查找似乎融入了很多 CDK 功能。
    • 我在答案中添加了一条关于查找的注释。当然,这对于您在代码中进行的查找非常具体,因此不能成为通用的一刀切策略的一部分。
    • @udondan 关于 CDK v2 解决方案......我应该在哪里附上这个政策。我尝试创建一个策略并将其附加到用户,但它不起作用。
    【解决方案2】:

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

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

    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-*
    

    【讨论】:

    • 对于发现此问题的任何人,您还需要 s3:GetBucketLocation 作为 cdktoolkit 存储桶的 s3 权限。
    • 我还需要cloudformation:GetTemplate
    猜你喜欢
    • 2017-08-08
    • 2012-10-09
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2014-08-28
    • 2013-01-18
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多