Amazon GuardDuty を AWS CloudFormation で有効にしようと思ったらハマりました

こんにちは、広野です。

Amazon GuardDuty の設定は機能ごとに有効/無効にできるのですが、それを AWS CloudFormation で設定しようと試みたときにハマりました。

もし同じエラーが出た方には役立つかもしれません。そもそも AWS CloudFormation で Amazon GuardDuty の設定をする人ってあまりいないかもですが・・・。

ハマったこと

始まりは、AWS CloudFormation IaC ジェネレーターを使用したこと

IaC ジェネレーターは、既存のデプロイ済みリソースをスキャンして、CloudFormation テンプレートにしたいリソースを選択すると、そのテンプレートを出力してくれるというスゴイやつです。

今回、Amazon GuardDuty を AWS マネジメントコンソールからボタンぽちっとな、で有効にしたものを IaC ジェネレーターでテンプレート化して、他のアカウントにデプロイしようとしました。

IaC ジェネレーターが出力したテンプレートはこちら。↓ ここに、ハマり要素が潜んでいました。注意!動きません。

---
Metadata:
  TemplateId: "arn:aws:cloudformation:ap-northeast-2:xxxxxxxxxxxxx:generatedTemplate/a4c6ba10-b002-47b3-bee2-587defc7921a"
Resources:
  GuardDutyDetector0082c84d2d1e796541ecd974b782ea181600qtDWT:
    UpdateReplacePolicy: "Delete"
    Type: "AWS::GuardDuty::Detector"
    DeletionPolicy: "Delete"
    Properties:
      FindingPublishingFrequency: "SIX_HOURS"
      Enable: true
      DataSources:
        MalwareProtection:
          ScanEc2InstanceWithFindings:
            EbsVolumes: true
        S3Logs:
          Enable: true
        Kubernetes:
          AuditLogs:
            Enable: true
      Features:
      - Status: "ENABLED"
        Name: "CLOUD_TRAIL"
      - Status: "ENABLED"
        Name: "DNS_LOGS"
      - Status: "ENABLED"
        Name: "FLOW_LOGS"
      - Status: "ENABLED"
        Name: "S3_DATA_EVENTS"
      - Status: "ENABLED"
        Name: "EKS_AUDIT_LOGS"
      - Status: "ENABLED"
        Name: "EBS_MALWARE_PROTECTION"
      - Status: "ENABLED"
        Name: "RDS_LOGIN_EVENTS"
      - Status: "DISABLED"
        AdditionalConfiguration:
        - Status: "DISABLED"
          Name: "EKS_ADDON_MANAGEMENT"
        Name: "EKS_RUNTIME_MONITORING"
      - Status: "ENABLED"
        Name: "LAMBDA_NETWORK_LOGS"
      - Status: "DISABLED"
        AdditionalConfiguration:
        - Status: "DISABLED"
          Name: "EKS_ADDON_MANAGEMENT"
        - Status: "DISABLED"
          Name: "ECS_FARGATE_AGENT_MANAGEMENT"
        - Status: "DISABLED"
          Name: "EC2_AGENT_MANAGEMENT"
        Name: "RUNTIME_MONITORING"
      Tags: []

IaC ジェネレーターの出力を参考にして作成したテンプレート ※注意!動きません

Amazon GuardDuty は機能ごとに有効/無効を設定できるものがあるので、私が必要な機能だけ有効にするように設定したつもりでした。

AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that enables GuardDuty per region.

Parameters:
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
  TagValue:
    Type: String
    Description: Tag value for Cost key.
    Default: GuardDuty
    MaxLength: 30
    MinLength: 1

Resources:
# ------------------------------------------------------------#
# GuardDuty
# ------------------------------------------------------------#
  GuardDutyDetector:
    Type: AWS::GuardDuty::Detector
    Properties:
      FindingPublishingFrequency: SIX_HOURS
      Enable: true
      DataSources:
        MalwareProtection:
          ScanEc2InstanceWithFindings:
            EbsVolumes: true
        S3Logs:
          Enable: true
        Kubernetes:
          AuditLogs:
            Enable: false
      Features:
        - Status: ENABLED
          Name: CLOUD_TRAIL
        - Status: ENABLED
          Name: DNS_LOGS
        - Status: ENABLED
          Name: FLOW_LOGS
        - Status: ENABLED
          Name: S3_DATA_EVENTS
        - Status: DISABLED
          Name: EKS_AUDIT_LOGS
        - Status: ENABLED
          Name: EBS_MALWARE_PROTECTION
        - Status: DISABLED
          Name: RDS_LOGIN_EVENTS
        - Status: DISABLED
          AdditionalConfiguration:
            - Status: DISABLED
              Name: EKS_ADDON_MANAGEMENT
          Name: EKS_RUNTIME_MONITORING
        - Status: ENABLED
          Name: LAMBDA_NETWORK_LOGS
        - Status: DISABLED
          AdditionalConfiguration:
            - Status: DISABLED
              Name: EKS_ADDON_MANAGEMENT
            - Status: DISABLED
              Name: ECS_FARGATE_AGENT_MANAGEMENT
            - Status: DISABLED
              Name: EC2_AGENT_MANAGEMENT
          Name: RUNTIME_MONITORING
      Tags:
        - Key: Cost
          Value: !Ref TagValue

ハマり その1 DataSources と Features の設定を両方入れるとエラーになる

IaC ジェネレーターが出力したテンプレートを全面的に信じてテンプレートを作成したわけですが、実際にテンプレートを流すと以下のエラーメッセージでスタック作成が失敗しました。

Resource handler returned message: “Invalid request provided: AWS::GuardDuty::Detector”

まず最初に気付いたのは以下のドキュメントでした。

どうも、GuardDuty の機能ごとに有効/無効を設定するには DataSources ではなく Features の設定を使用することを推奨していました。そして、両方記述するとエラーになるようです。

解決: DataSources の設定は削除しました。

ハマリ その2 EKS_RUNTIME_MONITORING と RUNTIME_MONITORING の設定も

その1 の修正をしただけでは状況が変わりませんでした。エラーメッセージも その1 と同じです。テンプレートのどこに問題があるかわからず、AWS CloudTrail の API ログを確認したところ、以下のメッセージを発見しました。

The request was rejected because EKS_RUNTIME_MONITORING and RUNTIME_MONITORING cannot be provided in the same request. 

EKS_RUNTIME_MONITORING と RUNTIME_MONITORING の設定を両方記述するとエラーになるようです。

これについては、以下のドキュメントの冒頭に書いてありました。後から気付きました。

解決: EKS_RUNTIME_MONITORING の設定は RUNTIME_MONITORING に含まれるようなので、EKS_RUNTIME_MONITORING の方を削除しました。

ハマり その3 指定した機能の名前が正しくない

その2 の修正をしても状況は変わりませんでした。エラーメッセージも その1 と同じです。テンプレートのどこに問題があるかわからず、AWS CloudTrail の API ログを確認したところ、以下のメッセージを発見しました。

The request failed because the provided feature names are invalid: [FLOW_LOGS, DNS_LOGS, CLOUD_TRAIL].

テンプレートの中に記述している、これら 3つの機能の名前が正しくないと言っています。

後から気が付いたのですが、設定変更可能な機能としてこれらは含まれていませんでした。その2 で紹介した公式ドキュメントにしっかり書いてありました。

解決: これら 3つの機能の設定は削除しました。

完成した AWS CloudFormation テンプレート ※動きます

いろいろとハマりましたが、動作したテンプレートはこれです。有効にしたい機能は ENABLED にする必要があります。
IaC ジェネレーターを使用せずに最初から公式リファレンス読んで作成した方が早かったかも・・・。
AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that enables GuardDuty per region.

Parameters:
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
  TagValue:
    Type: String
    Description: Tag value for Cost key.
    Default: GuardDuty
    MaxLength: 30
    MinLength: 1

Resources:
# ------------------------------------------------------------#
# GuardDuty
# ------------------------------------------------------------#
  GuardDutyDetector:
    Type: AWS::GuardDuty::Detector
    Properties:
      FindingPublishingFrequency: SIX_HOURS
      Enable: true
      Features:
        - Status: ENABLED
          Name: S3_DATA_EVENTS
        - Status: DISABLED
          Name: EKS_AUDIT_LOGS
        - Status: ENABLED
          Name: EBS_MALWARE_PROTECTION
        - Status: DISABLED
          Name: RDS_LOGIN_EVENTS
        - Status: ENABLED
          Name: LAMBDA_NETWORK_LOGS
        - Status: DISABLED
          AdditionalConfiguration:
            - Status: DISABLED
              Name: EKS_ADDON_MANAGEMENT
            - Status: DISABLED
              Name: ECS_FARGATE_AGENT_MANAGEMENT
            - Status: DISABLED
              Name: EC2_AGENT_MANAGEMENT
          Name: RUNTIME_MONITORING
      Tags:
        - Key: Cost
          Value: !Ref TagValue

AWS CloudTrail のログが有用だった

AWS CloudFormation テンプレートのスタック作成時エラーはメッセージから原因がわかることが多いのですが、GuardDuty に関しては

Resource handler returned message: “Invalid request provided: AWS::GuardDuty::Detector”

このメッセージ一辺倒だったので困りました。以下のドキュメントにあるように、AWS CloudTrail のイベント履歴から AWS CloudFormation のエラーメッセージを探すことで、原因を突き止められました。

まとめ

いかがでしたでしょうか?

AWS CloudFormation テンプレートを IaC ジェネレーターで作成し始めたことからハマってしまいましたが、これに懲りずに他のリソースのテンプレート作成も引き続き試してみたいと思います。きちんと検証することの重要さや、AWS CloudTrail の有用性にも改めて気づかされました。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもフロントエンド開発の方が好きでして、バックエンド構築を簡単にしてくれたAWSには感謝の気持ちの方が強いです。
取得資格:AWS 認定は13資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2024 Japan AWS Top Engineer 受賞
2022 - 2024 AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする
クラウドに強いによるエンジニアブログです。
SCSKは専門性と豊富な実績を活かしたクラウドサービス USiZE(ユーサイズ)を提供しています。
USiZEサービスサイトでは、お客様のDX推進をワンストップで支援するサービスの詳細や導入事例を紹介しています。
AWSクラウドクラウドセキュリティソリューション
シェアする
タイトルとURLをコピーしました