このページの本文へ

FIXER Tech Blog - Cloud

AWS CDKでGuardDutyのRDS保護を有効化しよう(として詰みかけた話)

2024年10月28日 10時00分更新

文● 江藤皓史

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「AWS CDK で GuardDuty の RDS 保護を有効化しようとして詰みかけた話 」を再編集したものです。

はじめに

 みなさんお疲れ様です。今年度入社した江藤です。

 社会人の生活にも慣れてきて、少しずつお仕事を任されるようになってきました。今回はその任されたお仕事で躓いたことがあったので、備忘録として記録しておきます。

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

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

背景

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

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

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

↑簡単そうですよね?

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

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

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

 「他プロジェクトでGuardDutyのCDKが無いか確認する」に関しては、コンソール上で有効化していたので断念…。

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

偉大なる先人の知恵

 「CDK GuardDuty」と検索するとたくさんの記事がヒットしました。先輩方、本当にありがとうございます。頭が上がりません。

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

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

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

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

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

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

 ぁ

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

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

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

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

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

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

生成AIあるある

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

するとこんな回答が。

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

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

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

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

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

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

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

const 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プロパティの型定義を確認してみると、


Valid 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保護以外の機能を明示的に無効化します。

new 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を変えてみたりすると詰まることが少なくなる気がします

江藤皓史
有明高専卒24入社
チョコミント/TRPG/まーちゃんごめんね

カテゴリートップへ

この連載の記事