Security Hub S3.5 コントロールは AWS CDK ではコード1行で対応できる

Security Hub S3.5 コントロールは AWS CDK ではコード1行で対応できる

Clock Icon2025.03.18

こんにちは、製造ビジネステクノロジー部の若槻です。

AWS Security Hub コントロールの 1 つである S3.5 では、バケットポリシーで SSL を要求するように設定することが要求されます。

S3 汎用バケットではリクエストに SSL を使用する必要があります。
S3 general purpose buckets should require requests to use SSL

https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html

このコントロールの重要度は MEDIUM であるため、失敗のアラートを受けて解消対応を行ったことのある方も多いのではないでしょうか。

AWS CDK ではコード1行で対応できる

AWS CDK では Bucket コンストラクトの enforceSSL プロパティを true に設定する記述を1行追加するだけで、S3.5 に対応することができます。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html#enforcessl

ドキュメントにはまさに S3.5 に対応するためのプロパティ、として記載されています。デフォルト値は false です。

S3.5 of the AWS Foundational Security Best Practices Regarding S3.

実装は次のようになります。

lib/main-stack.ts
import * as cdk from "aws-cdk-lib";
import * as s3 from "aws-cdk-lib/aws-s3";
import { Construct } from "constructs";

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, "MyBucket", {
      enforceSSL: true, // この行を追加
    });
  }
}

上記を CDK デプロイして作成されたバケットポリシーを確認すると、以下のように aws:SecureTransportfalse の場合に Deny されるポリシーが設定され、S3.5 対応がされていることが確認できます。

作成されたバケットポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::main-mybucketf68f3ff0-nemdczyufe14",
                "arn:aws:s3:::main-mybucketf68f3ff0-nemdczyufe14/*"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        }
    ]
}

AWS CDK にいつ追加された?

enforceSSL プロパティは 2021年3月にリリースされた CDK v1.92.0 で利用可能となりました。個人的には新発見だったのですが結構昔からあるプロパティなんですね。
https://github.com/aws/aws-cdk/releases/tag/v1.92.0
https://github.com/aws/aws-cdk/pull/12804

おわりに

Security Hub S3.5 コントロールは AWS CDK ではコード1行で対応できるという話でした。

最近 Security Hub のアラート対応を担当することが多く、当初は下記のように明示的にバケットポリシーを記載してしまっていました。

bucket.addToResourcePolicy(
  new iam.PolicyStatement({
    effect: iam.Effect.DENY,
    actions: ["s3:*"],
    resources: [bucket.bucketArn, bucket.arnForObjects("*")],
    principals: [new iam.StarPrincipal()],
    conditions: {
      Bool: {
        "aws:SecureTransport": false,
      },
    },
  })
);

CloudFormation のようなリソース定義の全文を宣言的に記述するのではなく、今回の enforceSSL のように少ないコードで手続き的にリソース定義を記述できるのが AWS CDK の強みだというのを改めて感じました。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.