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

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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

以上是关于使用 CDK Deploy 需要哪些 IAM 权限?的主要内容,如果未能解决你的问题,请参考以下文章

从 CDK 对 HTTP API 网关启用 IAM 授权

无论如何确定 CloudFormation 模板实际需要哪些 IAM 权限?

如何使用 CDK Python 创建包含多个语句的 IAM PolicyDocument?

从 Terraform cdk deploy lambda 获取属性

如何将 IAM OIDC 身份提供者与带有 CDK 的 EKS 集群相关联?

服务角色 arn:aws:iam::20011470201:role/deploy 无权执行以下操作:autoscaling:DescribeLifecycleHooks