Security Hub S3.5 コントロールは AWS CDK ではコード1行で対応できる
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS Security Hub コントロールの 1 つである S3.5 では、バケットポリシーで SSL を要求するように設定することが要求されます。
S3 汎用バケットではリクエストに SSL を使用する必要があります。
S3 general purpose buckets should require requests to use SSL
このコントロールの重要度は MEDIUM であるため、失敗のアラートを受けて解消対応を行ったことのある方も多いのではないでしょうか。
AWS CDK ではコード1行で対応できる
AWS CDK では Bucket コンストラクトの enforceSSL
プロパティを true
に設定する記述を1行追加するだけで、S3.5 に対応することができます。
ドキュメントにはまさに S3.5 に対応するためのプロパティ、として記載されています。デフォルト値は false
です。
S3.5 of the AWS Foundational Security Best Practices Regarding S3.
実装は次のようになります。
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:SecureTransport
が false
の場合に 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 で利用可能となりました。個人的には新発見だったのですが結構昔からあるプロパティなんですね。
おわりに
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 の強みだというのを改めて感じました。
以上