使用 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 权限?的主要内容,如果未能解决你的问题,请参考以下文章
无论如何确定 CloudFormation 模板实际需要哪些 IAM 权限?
如何使用 CDK Python 创建包含多个语句的 IAM PolicyDocument?
从 Terraform cdk deploy lambda 获取属性
如何将 IAM OIDC 身份提供者与带有 CDK 的 EKS 集群相关联?
服务角色 arn:aws:iam::20011470201:role/deploy 无权执行以下操作:autoscaling:DescribeLifecycleHooks