0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS CDK CloudFormationExecutionRole

Last updated at Posted at 2024-11-02

AWS CDKのworkshopで提供された一般権限ユーザを用いて管理者権限を持つユーザを作成できたため、その原因について調査を行いました。

事象

  • cdk --version
    2.165.0 (build 00f70f1)

使用する一般ユーザの権限

  • cdk bootstrapに必要な権限のみ
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:*",
                "ecr:*",
                "ssm:*",
                "s3:*",
                "iam:*"
            ],
            "Resource": "*"
        }
    ]
}

Stack(python)

  • ユーザを新規作成し、AdministratorAccess policyを付与
from aws_cdk import (
    Stack,
    aws_iam as iam 
    ,SecretValue
)
from constructs import Construct

class HelloCdkStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        user = iam.User(self, "adminuser", password=SecretValue.unsafe_plain_text("......"))
        user.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name('AdministratorAccess'))

deploy結果

  • cdk bootstrap
  • cdk deploy

AdministratorAccess policyが付与されたユーザを作成できました。

image.png

image.png

原因

cdk v2ではcdk bootstrapを実行する際に、cloudformation-execution-policiesを指定しないと、デフォルトでAdministratorAccess policyが使用されることです。
ref-cli-cmd-bootstrap

--cloudformation-execution-policies ARRAY

    The managed IAM policy ARNs that should be attached to the deployment role assumed by AWS CloudFormation during deployment of your stacks.

    By default, stacks are deployed with full administrator permissions using the AdministratorAccess policy.

cdk bootstrap log

cdk bootstrapの実行ログに、以下の内容が出力されていました。

Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.

CloudFormationExecutionRole

bootstrapで作成したCloudFormationExecutionRoleを確認したところ、AdministratorAccess policyが付与されていることが分かりました。

image.png

382418658-02ee424b-b828-45f8-9e5a-f0924d573c32.png

要するに、cdk bootstrapを実行する際に、cloudformation-execution-policiesを指定しないと、cdk deploy時に利用されるCloudFormation execute roleがAdministratorAccess権限を持つことになります。

cloudformation-execution-policies指定

  • cloudformation-execution-policiesにAmazonS3FullAccessを指定
cdk bootstrap --cloudformation-execution-policies arn:aws:iam::aws:policy/AmazonS3FullAccess

AmazonS3FullAccessしか持っていないCloudFormationExecutionRoleが作成されました。

image.png

382419623-f6388800-04bf-4911-ba66-23dad1c82171-1.png

  • この状態で同様なstackを用いてcdk deployを実行
    想定通りのAccessDeniedExceptionが発生しました。
cdk deploy
❌  HelloCdkStack failed: ValidationError: User: arn:aws:sts::xxx:assumed-role/cdk-hnb659fds-cfn-exec-role-xxx-ap-northeast-1/AWSCloudFormation is not authorized to perform: ssm:GetParameters on resource: arn:aws:ssm:ap-northeast-1:xxx:parameter/cdk-bootstrap/hnb659fds/version because no identity-based policy allows the ssm:GetParameters action (Service: AWSSimpleSystemsManagement; Status Code: 400; Error Code: AccessDeniedException; Request ID: 496d7206-1db8-4812-b2e0-068b2b6afce0; Proxy: null)
Waiting for the debugger to disconnect...

対策

AWSがShared Responsibility Modelを主張しているので、AdministratorAccessがdefault値であることは今後も変わらないと思われます。
しかし、cdk経由で管理者としてやり放題になることを避けべきです。
実際に試していませんが、以下の対策でcdk bootstrapの権限を制御できるはずです。

  • SCP設定
  • AWS Config ruleを利用
    • roleにboundaryを強制
  • Eventbridge + Lambda
    • roleの新規作成をtriggerとして、roleにboundaryを自動的に追加
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?