AWS CDK で Amazon GuardDuty を有効化してみた

AWS CDK で Amazon GuardDuty を有効化してみた

Clock Icon2025.03.16

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

今回は、AWS CDK を使って Amazon GuardDuty を有効化する方法を確認してみました。

本記事で扱わないこと

やってみた

有効化前の状態

まず GuardDuty が有効化されていないことを確認します。

マネジメントコンソールでは、GuardDuty のコンソールにアクセスすると、以下のように GuardDuty の有効化メニューのみが表示されており、有効化されていないことが確認できます。

AWS CLI でも GuardDuty の Detector が存在しないことを確認します。

$ aws guardduty list-detectors
{
    "DetectorIds": []
}

ここで Detector とは、GuardDuty の監視設定の基本単位で、データソース(VPC フローログ、CloudTrail ログ、DNS logs 等)の分析設定や機能の有効化設定を保持するリソースとなります。これを作成することで GuardDuty が有効化されます。

CDK で有効化する

AWS CDK で GuardDuty を有効化するためには、CfnDetector コンストラクトクラス を使って Detector を作成します。L2 コンストラクトは未提供のため、L1 コンストラクトを使用します。

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_guardduty.CfnDetector.html

lib/constructs/guard-duty/index.ts
import * as guardDuty from 'aws-cdk-lib/aws-guardduty';
import { Construct } from 'constructs';

export class GuardDutyConstruct extends Construct {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // GuardDuty を有効化
    new guardDuty.CfnDetector(this, 'Default', {
      enable: true,
    });
  }
}

上記のコンストラクトを CDK デプロイします。

デプロイ後にマネジメントコンソールで GuardDuty のコンソールにアクセスすると、以下のように GuardDuty の有効化メニュー以外にもメニューが表示され、有効化されていることが確認できます。

また、AWS CLI でも GuardDuty の Detector が作成されていることを確認します。まず Detector の ID を取得します。

$ aws guardduty list-detectors
{
    "DetectorIds": [
        "f0cacef1499171af60c0b999321b9514"
    ]
}

次に Detector の詳細情報を取得します。

$ aws guardduty get-detector --detector-id f0cacef1499171af60c0b999321b9514
{
    "CreatedAt": "2025-03-16T07:37:07.015Z",
    "FindingPublishingFrequency": "SIX_HOURS",
    "ServiceRole": "arn:aws:iam::XXXXXXXXXXXX:role/aws-service-role/guardduty.amazonaws.com/AWSServiceRoleForAmazonGuardDuty",
    "Status": "ENABLED",
    "UpdatedAt": "2025-03-16T07:37:07.015Z",
    "DataSources": {
        "CloudTrail": {
            "Status": "ENABLED"
        },
        "DNSLogs": {
            "Status": "ENABLED"
        },
        "FlowLogs": {
            "Status": "ENABLED"
        },
        "S3Logs": {
            "Status": "ENABLED"
        },
        "Kubernetes": {
            "AuditLogs": {
                "Status": "ENABLED"
            }
        },
        "MalwareProtection": {
            "ScanEc2InstanceWithFindings": {
                "EbsVolumes": {
                    "Status": "ENABLED"
                }
            },
            "ServiceRole": "arn:aws:iam::XXXXXXXXXXXX:role/aws-service-role/malware-protection.guardduty.amazonaws.com/AWSServiceRoleForAmazonGuardDutyMalwareProtection"
        }
    },
    "Tags": {},
    "Features": [
        {
            "Name": "CLOUD_TRAIL",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:41:45+09:00"
        },
        {
            "Name": "DNS_LOGS",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:41:45+09:00"
        },
        {
            "Name": "FLOW_LOGS",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:41:45+09:00"
        },
        {
            "Name": "S3_DATA_EVENTS",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00"
        },
        {
            "Name": "EKS_AUDIT_LOGS",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00"
        },
        {
            "Name": "EBS_MALWARE_PROTECTION",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00"
        },
        {
            "Name": "RDS_LOGIN_EVENTS",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00"
        },
        {
            "Name": "EKS_RUNTIME_MONITORING",
            "Status": "DISABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00",
            "AdditionalConfiguration": [
                {
                    "Name": "EKS_ADDON_MANAGEMENT",
                    "Status": "DISABLED",
                    "UpdatedAt": "2025-03-16T16:37:07+09:00"
                }
            ]
        },
        {
            "Name": "LAMBDA_NETWORK_LOGS",
            "Status": "ENABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00"
        },
        {
            "Name": "RUNTIME_MONITORING",
            "Status": "DISABLED",
            "UpdatedAt": "2025-03-16T16:37:07+09:00",
            "AdditionalConfiguration": [
                {
                    "Name": "EKS_ADDON_MANAGEMENT",
                    "Status": "DISABLED",
                    "UpdatedAt": "2025-03-16T16:37:07+09:00"
                },
                {
                    "Name": "ECS_FARGATE_AGENT_MANAGEMENT",
                    "Status": "DISABLED",
                    "UpdatedAt": "2025-03-16T16:37:07+09:00"
                },
                {
                    "Name": "EC2_AGENT_MANAGEMENT",
                    "Status": "DISABLED",
                    "UpdatedAt": "2025-03-16T16:37:07+09:00"
                }
            ]
        }
    ]
}

DataSources では、GuardDuty が監視するデータソースが有効化されており、また Features でも対応するデータソースに対応する機能が有効化されていることが確認できます。

また FeaturesEKS_RUNTIME_MONITORING および RUNTIME_MONITORING では、EKS、Fargate および EC2 の各種ワークロードをエージェントで監視するランタイムモニタリング機能が既定で無効となっていることが確認できます。

ランタイムモニタリングを有効化するためには CDK 上で追加の設定が必要ですが、こちらは別記事で紹介したいと思います。

その他

Detector を重複して作成できない

GuardDuty がすでに有効化されているリージョンで、CDK で GuardDuty を有効化しようとした場合はどうなるでしょうか。

次のように CDK で CfnDetector を複数定義してデプロイしてみます。

lib/constructs/guard-duty/index.ts
import * as guardDuty from 'aws-cdk-lib/aws-guardduty';
import { Construct } from 'constructs';

export class GuardDutyConstruct extends Construct {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // GuardDuty を有効化
    new guardDuty.CfnDetector(this, 'Default', {
      enable: true,
    });

    // GuardDuty の有効化を重複して行ってみる
    new guardDuty.CfnDetector(this, 'Duplicate', {
      enable: true,
    });
  }
}

すると、以下のようにデプロイ時にエラーが発生します。Detector がすでに存在しており、重複して作成することができないためです。

Security |   0 | 4:54:40 PM | UPDATE_IN_PROGRESS   | AWS::CloudFormation::Stack          | Security User Initiated
Security |   0 | 4:54:44 PM | CREATE_IN_PROGRESS   | AWS::GuardDuty::Detector            | GuardDuty/Duplicate (GuardDutyDuplicateC9ADC46F)
Security |   0 | 4:54:47 PM | CREATE_FAILED        | AWS::GuardDuty::Detector            | GuardDuty/Duplicate (GuardDutyDuplicateC9ADC46F) Resource handler returned message: "The request is rejected because a detector already exists for the current account. (Service: GuardDuty, Status Code: 400, Request ID: 82221fd3-a8f5-49c8-bf10-6669ac859e28)" (RequestToken: 15c699a2-466e-428f-dc22-386973187060, HandlerErrorCode: AlreadyExists)

GuardDuty の設定を IaC 化する場合は、既存の有効化設定を無効化してから CDK などで改めて有効化するようにしましょう。

Detector を一時停止する

下記のように CfnDetectorenablefalse とすることで、Detector を削除することなく監視を一時停止 (Suspend) することができます。

lib/constructs/guard-duty/index.ts
import * as guardDuty from "aws-cdk-lib/aws-guardduty";
import { Construct } from "constructs";

export class GuardDutyConstruct extends Construct {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    // GuardDuty を有効化
    new guardDuty.CfnDetector(this, "Default", {
      enable: false, // 一時停止
    });
  }
}

上記をデプロイすると、マネジメントコンソール上でも Detector が一時停止したことが確認できます。

https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_suspend-disable.html

おわりに

今回は、AWS CDK を使って GuardDuty を有効化する方法を確認しました。

当初 GuardDuty の有効化方法を調査するにあたり Detector という概念を知らなかったため少しだけ理解に時間を要しましたが、実装方法自体はシンプルでした。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.