过去,我们会使用执行IAM角色将一些构件上传到S3存储桶中,然后使用它来创建/更新我们的CloudFormation堆栈。
我们最近转向了CDK,并试图尽可能多地使用CDK Deploy进行自动化,但是我们遇到了许多需要添加的权限项,而这些权限我们以前并没有(例如,cloudformation:GetTemplate)。
我们不想仅授予*(我们要遵循最小特权原则),但我找不到任何明确的文档列表。
CDK Deploy依赖于哪些标准权限列表?除了标准列表外,还有什么“好用的”权限?
CDK v2 现在具备并承担其自身角色。不再需要手动管理权限。您只需要授予承担 cdk 角色的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::*:role/cdk-*"
]
}
]
}
cdk bootstrap
创建的,因此需要具备创建角色和策略的权限。但是,在引导完成后,这不再是必需的。所以你可以使用特权角色手动运行它。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函数支持的自定义CFN资源。通过该自定义资源创建资源时,您可以在Lambda中执行任何操作,因为它是通过CloudFormation触发的。
当您使用查找(这些是.fromXxx(...)
方法)时,CDK将在运行时向相关服务进行读取/列表请求 - 在CDK synth运行时,而不是CloudFormation部署时。当然,您需要哪些权限取决于代码中的查找。例如,如果您有一个Vpc.fromLookup(),则应允许操作ec2:DescribeVpcs
。当然,如果您不担心访问敏感内容,可以附加ReadOnlyAccess
策略。
由于我无法在任何地方找到文档,所以我不得不进行一些试错才能使其正常工作。
除了权限之外,您需要创建堆栈中定义的实际资源,您还需要提供以下内容:
cloudformation:DescribeStacks
cloudformation:CreateChangeSet
cloudformation:DescribeChangeSet
cloudformation:ExecuteChangeSet
cloudformation:DescribeStackEvents
cloudformation:DeleteChangeSet
cloudformation:GetTemplate
对于您正在创建的堆栈 ARN 和引导堆栈:
arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/CDKToolkit/*
您还需要对引导程序添加的存储桶具有S3权限(否则会出现可怕的Forbidden: null
错误):
s3:*Object
s3:ListBucket
s3:GetBucketLocation
to
arn:aws:s3:::cdktoolkit-stagingbucket-*
s3:GetBucketLocation
权限作为 S3 权限。 - Jacob Lambertcloudformation:GetTemplate
。 - AleksiCDK 有两个阶段:引导(bootstrap)和合成/部署(synth/deploy)。
在进行引导时,使用的 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),因此我不会深入研究。
cdk bootstrap --show-template > bootstrap-template.yaml
。这提供了用于引导的CloudWatch模板。 - Joelsterssm:PutParameter
ecr:SetRepositoryPolicy
ecr:GetLifecyclePolicy
ecr:PutImageScanningConfiguration
ssm:GetParameters
ecr:DescribeRepositories
我正在使用这个来自GitHub actions的自动化部署,唯一能让它工作的方法是授予权限。
{
"Sid": "PolicyForSpecificStack",
"Effect": "Allow",
"Action": "cloudformation:*",
"Resource": "arn:aws:cloudformation:<region>:*:stack/<my-stack-name>/*"
},
{
"Sid": "S3Access",
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["*"]
}
{
"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": ["*"]
}
]
}
ec2:Describe*
操作也是必需的,以允许 CDK 应用程序解析 AMI 等内容。 - solidsnack