使用 CDK Deploy 需要哪些 IAM 权限?
What IAM permissions are needed to use CDK Deploy?
我的团队有一个在执行 IAM 角色下运行的管道。我们想通过 CloudFormation 或 CDK 将代码部署到 AWS。
过去,我们会使用执行 IAM 角色将一些工件上传到 creating/updating 我们的 CloudFormation 堆栈之前的 S3 存储桶。
我们最近切换到 CDK,并试图通过使用 CDK Deploy 尽可能地实现自动化,但是 运行 我们需要添加很多我们没有的权限项先验(例如,cloudformation:GetTemplate)。
我们不想只授予 *(我们想遵循最小特权),但我找不到任何明确的记录列表。
是否有CDK Deploy 依赖的标准权限列表?有没有超出标准列表的"nice to have's"?
因为我在任何地方都找不到任何文档,所以我不得不反复试验才能让它发挥作用。
除了创建您在堆栈中定义的实际资源所需的权限外,您还需要提供以下内容:
cloudformation:DescribeStacks
cloudformation:CreateChangeSet
cloudformation:DescribeChangeSet
cloudformation:ExecuteChangeSet
cloudformation:DescribeStackEvents
cloudformation:DeleteChangeSet
cloudformation:GetTemplate
到您正在创建的堆栈 ARN,以及 bootstrap 堆栈:
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 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 将在 运行 时向相关服务发出 read/list 请求 - 而 CDK 合成器是 运行ning,不是 CloudFormation 部署。当然,您需要哪些权限取决于您在代码中进行的查找。例如,如果您有 Vpc.fromLookup(),您应该允许操作 ec2:DescribeVpcs
。如果您不担心访问敏感内容,当然可以附上 ReadOnlyAccess
政策。
我们还需要添加以下权限。
ssm:PutParameter
ecr:SetRepositoryPolicy
ecr:GetLifecyclePolicy
ecr:PutImageScanningConfiguration
ssm:GetParameters
ecr:DescribeRepositories
CDK 有两个阶段 bootstrap 和 synth/deploy。
在 bootstrap 的情况下,使用的 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。
可以通过限制权限来改进 bootstrap 政策,但缺少文档,因此我不深入研究具体方面(示例 s3)
我的团队有一个在执行 IAM 角色下运行的管道。我们想通过 CloudFormation 或 CDK 将代码部署到 AWS。
过去,我们会使用执行 IAM 角色将一些工件上传到 creating/updating 我们的 CloudFormation 堆栈之前的 S3 存储桶。
我们最近切换到 CDK,并试图通过使用 CDK Deploy 尽可能地实现自动化,但是 运行 我们需要添加很多我们没有的权限项先验(例如,cloudformation:GetTemplate)。
我们不想只授予 *(我们想遵循最小特权),但我找不到任何明确的记录列表。
是否有CDK Deploy 依赖的标准权限列表?有没有超出标准列表的"nice to have's"?
因为我在任何地方都找不到任何文档,所以我不得不反复试验才能让它发挥作用。
除了创建您在堆栈中定义的实际资源所需的权限外,您还需要提供以下内容:
cloudformation:DescribeStacks
cloudformation:CreateChangeSet
cloudformation:DescribeChangeSet
cloudformation:ExecuteChangeSet
cloudformation:DescribeStackEvents
cloudformation:DeleteChangeSet
cloudformation:GetTemplate
到您正在创建的堆栈 ARN,以及 bootstrap 堆栈:
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 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 将在 运行 时向相关服务发出 read/list 请求 - 而 CDK 合成器是 运行ning,不是 CloudFormation 部署。当然,您需要哪些权限取决于您在代码中进行的查找。例如,如果您有 Vpc.fromLookup(),您应该允许操作 ec2:DescribeVpcs
。如果您不担心访问敏感内容,当然可以附上 ReadOnlyAccess
政策。
我们还需要添加以下权限。
ssm:PutParameter
ecr:SetRepositoryPolicy
ecr:GetLifecyclePolicy
ecr:PutImageScanningConfiguration
ssm:GetParameters
ecr:DescribeRepositories
CDK 有两个阶段 bootstrap 和 synth/deploy。
在 bootstrap 的情况下,使用的 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。
可以通过限制权限来改进 bootstrap 政策,但缺少文档,因此我不深入研究具体方面(示例 s3)