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

Ala*_*Kay 24 aws-cloudformation amazon-iam aws-cdk

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

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

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

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

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

udo*_*dan 29

我正在使用以下策略来部署 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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

您可能想要为您不想允许的事情添加一些明确的拒绝。

另外,请注意,上述条件并不意味着委托人仅限于 CloudFormation 可能发生的事情。潜在的攻击媒介是创建自定义 CFN 资源,由 Lambda 函数支持。通过该自定义资源创建资源时,您可以在 Lambda 中执行任何操作,因为它是通过 CloudFormation 触发的。

  • 似乎还需要“ec2:Describe*”操作,以允许 CDK 应用程序解析 AMI 等类似内容。 (2认同)

jis*_*shi 21

由于我在任何地方都找不到任何文档,因此我不得不进行一些反复试验才能使其正常工作。

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

cloudformation:DescribeStacks
cloudformation:CreateChangeSet
cloudformation:DescribeChangeSet
cloudformation:ExecuteChangeSet
cloudformation:DescribeStackEvents
cloudformation:DeleteChangeSet
Run Code Online (Sandbox Code Playgroud)

对于您正在创建的堆栈 ARN 以及引导程序堆栈:

arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/CDKToolkit/*
Run Code Online (Sandbox Code Playgroud)

您还需要对 boostrap 添加的存储桶的 s3 权限(否则您会遇到可怕的Forbidden: null错误):

s3:*Object
s3:ListBucket
s3:GetBucketLocation
Run Code Online (Sandbox Code Playgroud)

arn:aws:s3:::cdktoolkit-stagingbucket-*
Run Code Online (Sandbox Code Playgroud)

  • 对于发现此问题的任何人,您还需要 `s3:GetBucketLocation` 作为 cdktoolkit 存储桶的 s3 权限。 (2认同)

Fab*_*lla 9

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

在引导的情况下,使用的 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/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

在部署的情况下,角色或配置文件必须具有以下强制权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

加上您正在部署的基础设施所需的所有权限。

我可以建议的是使用两个不同的角色,以便您拥有更高的安全性,并且万一您使用 GitHub 工作流程来利用 OpenIdConnect。

引导策略可以通过限制权限来改进,但缺乏文档,所以我不深入研究具体方面(例如 s3)