AWS CDK で GuardDuty の RDS 保護を有効化しようとして詰みかけた話
2024-10-15
azblob://2024/10/15/eyecatch/2024-10-15-ek06-enable-guardduty-with-cdk-000.jpg

はじめに

みなさんお疲れ様です。

今年度入社した江藤です。

社会人の生活にも慣れてきて、少しずつお仕事を任されるようになってきました。

今回はその任されたお仕事で躓いたことがあったので、備忘録として記録しておきます。

この記事で長々と書くことを要約すると以下になります。

  • AWS 公式ドキュメントは CDK だけじゃなく CloudFormation も参考にしよう

背景

先輩からあるお仕事を任されました。

内容はいたってシンプル。

「GuardDuty の RDS 保護だけを有効化する CDK を作成してほしい。」

↑簡単そうですよね?

以前、別のリソースの CDK を作成した経験があったため、同じ要領でできるだろうと考え、二つ返事で引き受けました。

まずは以下の方法で情報収集をしました。

  • 他プロジェクトで GuardDuty の CDK が無いか確認する
  • 関連する記事を探す
  • GaiXer(生成 AI)に質問する
  • AWS 公式ドキュメントを探す

「他プロジェクトで GuardDuty の CDK が無いか確認する」に関しては、

コンソール上で有効化していたので断念・・・。

おとなしく参考になる記事を調べてみることにしました。

偉大なる先人の知恵

「CDK GuardDuty」と検索するとたくさんの記事がヒットしました。

先輩方、本当にありがとうございます。頭が上がりません。

複数の記事を見るに以下の記載で有効化できそうでした。

TypeScriptnew guardduty.CfnDetector(this, 'GuardDutyDetector'), {
	enable: true
	});

たったこれだけです。なんて簡単なのでしょう!

コードを書いてデプロイしたところ、無事に GuardDuty が有効化されることを確認しました!

ウキウキで PR(プルリクエスト)を作成していた時、何か忘れている気がしました。

「GuardDuty の RDS 保護だけを有効化するCDKを作成してほしい。」

デフォルト設定で作成してる・・・。

確認したところ、確かに RDS 保護は有効になっていましたが、それ以外にも

  • S3 保護
  • EKS 保護
  • Lambda 保護
  • EC2 マルウェアスキャン

が有効になっていました。これでは依頼内容と合致しません。

「CDK GuardDuty RDS 保護」と検索してもコンソール上から有効化してるものばかりで参考になりませんでした・・・。

以上のことから参考になる記事を探すのは諦めました。

生成AIあるある

ということで試しにGaiXer(生成AI)に聞いてみました。

するとこんな回答が。

TypeScriptnew guardduty.CfnDetector(this, 'GuardDutyDetector', {
	enable: true,
	dataSources: {
		rdsLogs: {
			enable: true
		}
	}
});

↑どうでしょう・・・非常にそれらしいコードが返ってきました。

公式ドキュメントを見ながら確認します。

参考にしたドキュメントはこちらになります。

aws-cdk-lib.aws_guardduty module · AWS CDK (amazon.com)

こちらの CfnDetector クラスを見ていると、確かに dataSources プロパティが存在することは確認できました。

しかし、その型定義を見てみると、

TypeScriptconst cFNDataSourceConfigurationsProperty: guardduty.CfnDetector.CFNDataSourceConfigurationsProperty = {
	kubernetes: {
		auditLogs: {
			enable: false,
		},
	},
	malwareProtection: {
		scanEc2InstanceWithFindings: {
			ebsVolumes: false,
		},
	},
	s3Logs: {
		enable: false,
	}};

と記載があり、RDS 保護のプロパティが存在しないことが分かりました。

危ない危ない。ハルシネーションです。

ではどうやって RDS 保護するんだろうと考えると同時に、

「GuardDuty にはたくさんの機能があるのに、なぜこの3つの機能だけなのか。」

と思ったため、さらにドキュメントを調べてみました。

解決方法の模索

色々なドキュメントを探して探して、以下の記載を見つけました。

GuardDuty legacy actions and parameters - Amazon GuardDuty

2023年3月以降、EC2 向けの GuardDuty マルウェア保護と新しい GuardDuty 保護プランは、features を使用して設定できます。2023年3月以前にリリースされた保護プラン(EC2 向けのマルウェア保護を含む)は、引き続き dataSources を使用して設定できます。 

UpdateDetector - Amazon GuardDuty

dataSources
This parameter has been deprecated.

(このパラメータは非推奨になりました)

な、なんだって~~~~~!?!?!?!?!?!?!?!?!?

道理で機能が少ないわけです。

(非推奨になったことを CfnDetector クラスにも書いてほしいです。)

DetectorFeatureConfiguration - Amazon GuardDuty

features プロパティの型定義を確認してみると、

TypeScriptValid Values: S3_DATA_EVENTS | EKS_AUDIT_LOGS | EBS_MALWARE_PROTECTION | RDS_LOGIN_EVENTS | EKS_RUNTIME_MONITORING | LAMBDA_NETWORK_LOGS | RUNTIME_MONITORING

と、機能の記載があることを確認しました。

「RDS_LOGIN_EVENTS」が RDS 保護のようです。

これらをもとに、RDS 保護だけを有効化するようにコードを書き直します。

今回は RDS 保護以外の機能を明示的に無効化します。

TypeScriptnew guardduty.CfnDetector(this, 'GuardDutyDetector', {
	enable: true,
	features:[
		{ name: 'RDS_LOGIN_EVENTS', status: 'ENABLED'},
		{ name: 'S3_DATA_EVENTS', status: 'DISABLED'},
		{ name: 'EKS_AUDIT_LOGS', status: 'DISABLED'},
		{ name: 'EBS_MALWARE_PROTECTION', status: 'DISABLED'},
		{ name: 'EKS_RUNTIME_MONITORING', status: 'DISABLED'},
		{ name: 'LAMBDA_NETWORK_LOGS', status: 'DISABLED'}
	]
});

上記のコードをデプロイしたところ、無事に RDS 保護だけを有効化することが出来ました!

おわりに

ということで、コーディングは無事に完了しましたが思いのほか時間がかかってしまいました。

CDK を作成する際は以下のドキュメントに加えて、参考になる記事を多数参照することが重要だと感じました。

API Reference · AWS CDK (amazon.com)

Template reference - AWS CloudFormation (amazon.com)

また、生成 AI を使用する際は入力文章を英語にしてみたり、

LLM を変えてみたりすると詰まることが少なくなる気がします。