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

问题描述 投票:0回答:6

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

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

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

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

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

aws-cloudformation amazon-iam aws-cdk
6个回答
102
投票

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 应用程序。除了 CFN 完全访问权限和 S3 对 CDK 暂存存储桶的完全访问权限之外,它还授予通过 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()

,您应该允许操作

ec2:DescribeVpcs

。当然,如果您不担心访问敏感内容,您可以附加 
ReadOnlyAccess 政策。

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

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

27
投票
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-*
    

CDK 有两个阶段:引导和合成/部署。
对于 

9
投票
,使用的 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。
可以通过限制权限来改进引导策略,但缺乏文档,因此我不深入研究具体方面(例如 s3)

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

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

0
投票

我使用它来从 GitHub 操作自动部署,它的唯一工作方式是授予权限
    {
      "Sid": "PolicyForSpecificStack",
      "Effect": "Allow",
      "Action": "cloudformation:*",
      "Resource": "arn:aws:cloudformation:<region>:*:stack/<my-stack-name>/*"
    },
    {
      "Sid": "S3Access",
      "Effect": "Allow",
      "Action": ["s3:*"],
      "Resource": ["*"]
    }

0
投票
对于用于部署我的 cloudformation 堆栈的策略,我的最终策略如下所示

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["iam:PassRole"], "Resource": "*" }, { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": ["arn:aws:iam::*:role/cdk-*"] }, { "Sid": "PolicyForSpecificStack", "Effect": "Allow", "Action": "cloudformation:*", "Resource": "arn:aws:cloudformation:<region>:*:stack/<my-stack-name>/*" }, { "Sid": "S3Access", "Effect": "Allow", "Action": ["s3:*"], "Resource": ["*"] } ] }
    

请注意,虽然
CDK v2

0
投票
解决方案有效,但默认情况下它不遵循最小权限原则。正如他在帖子中提到的,在引导期间创建的 CloudFormation 执行角色具有

arn:aws:iam::aws:policy/AdministratorAccess。因此,通过 AssumeRole 被授予 CDK 角色的每个人都将拥有管理员访问权限。

可以通过创建自定义 IAM 策略并在引导期间使用此角色来解决此问题:
cdk bootstrap aws://<account_id>/eu-west-1 --cloudformation-execution-policies \ 
"arn:aws:iam::$ACCOUNT_ID:policy/cdkCFExecutionPolicy"

这会将执行角色限制为您在自定义策略中定义的任何角色。合适的自定义策略可能如下所示(取自 Maciej Radzikowski 的

CDK Bootstrap 的最低部署权限

)。但您应该确保该政策适合您的要求。

cdkCFExecutionPolicy

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "apigateway:*", "cloudwatch:*", "lambda:*", "logs:*", "s3:*", "ssm:*" ], "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "eu-west-1" } } }, { "Effect": "Allow", "Action": [ "cloudfront:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:*Role*", "iam:GetPolicy", "iam:CreatePolicy", "iam:DeletePolicy", "iam:*PolicyVersion*" ], "NotResource": [ "arn:aws:iam::*:role/cdk-*", "arn:aws:iam::*:policy/cdkCFExecutionPolicy" ] } ] }

© www.soinside.com 2019 - 2024. All rights reserved.