[アップデート] Amazon GuardDuty Investigation (Preview) で、調査が結論に至るまでの過程をレコードとして取得できるようになりました

[アップデート] Amazon GuardDuty Investigation (Preview) で、調査が結論に至るまでの過程をレコードとして取得できるようになりました

GuardDuty Investigation (Preview) に追加された「調査レコード」の一覧取得機能を試してみました。
2026.11.13

はじめに

アップデートで GuardDuty Investigation (Preview) に「調査レコード」の一覧取得が追加されていました。

https://docs.aws.amazon.com/guardduty/latest/ug/doc-history.html

GuardDuty Investigation は、検出結果やアカウントを AI が調査して、リスクレベルや推奨アクションを返してくれる機能です。機能そのものについては、以前の記事で紹介しています。

https://dev.classmethod.jp/articles/guardduty-investigation-preview-trial/

これまでは調査の結論しか見えず、AI が何を調べてその結論に至ったのかは分かりませんでした。
今回のアップデートで、結論に至るまでの過程を 1 ステップずつ取得できるようになりました。実際に試してみたのでまとめます。

アップデートの概要

2026 年 11 月 11 日付のドキュメント更新で、このレコードを一覧取得する ListInvestigationRecords API が追加されました。コンソールでは、調査の詳細ページの「Investigation timeline」タブで見られます。

既存の GetInvestigation との役割の違いは次のとおりです。

API 返すもの
GetInvestigation 調査の結論。ステータス、リスクレベル、信頼度、サマリー
ListInvestigationRecords 結論に至るまでの過程。取得したデータ、環境についての観察、実施した分析

レコードには 5 つの種別があります。

種別 内容
UPDATE 進捗の区切り。調査を開始したリクエストや GuardDuty からの応答
FETCH 調査のために取得したデータ。何を要求して何を受け取ったか
OBSERVATION 環境について確認した事実。影響を受けたリソース、検知カバレッジなど
ANALYSIS データから導いた評価。脅威の評価など
METADATA 調査そのものの情報。所要時間など

各レコードはタイトル(Title)を持ちます。ステップを説明する文章(Narrative)と構造化データ(SupportingData)は、付く場合と付かない場合があります。
レコードは作成された順、つまり古い順に返ります。

やってみた

前提条件

  • GuardDuty の detector で AI_ANALYST(コンソールでは「AI powered investigations - Preview」)を有効にすること
  • AWS CLI を使う場合は、バージョン 2.40.2 以降を使うこと

調査を作成する

レコードを見るには、完了した調査が必要です。
今回は、以前に生成していたサンプルの検出結果を調査の対象にしました。
検出結果タイプは UnauthorizedAccess:IAMUser/InstanceCredentialExfiltration.InsideAWS です。

detector で AI_ANALYST を有効にしたうえで、調査を作成します。

> aws guardduty update-detector \
    --detector-id $DETECTOR_ID \
    --features '[{"Name": "AI_ANALYST", "Status": "ENABLED"}]'

> aws guardduty create-investigation \
    --detector-id $DETECTOR_ID \
    --trigger-prompt "Investigate finding $FINDING_ID in account $ACCOUNT_ID"

{
    "InvestigationId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
}

調査の作り方やプロンプトの書き方は、以前の記事にまとめています。

https://dev.classmethod.jp/articles/guardduty-investigation-trigger-prompt-cli/

調査は非同期で進みます。今回は開始から完了まで約 6 分半かかりました。

> aws guardduty get-investigation \
    --detector-id $DETECTOR_ID \
    --investigation-id $INVESTIGATION_ID \
    --query 'Investigation.{Status:Status,RiskLevel:RiskLevel,Confidence:Confidence,StartTime:StartTime,EndTime:EndTime}'

{
    "Status": "COMPLETED",
    "RiskLevel": "Info",
    "Confidence": "High",
    "StartTime": "2026-11-13T09:13:52.859000+09:00",
    "EndTime": "2026-11-13T09:20:17.908000+09:00"
}

重大度 High の検出結果ですが、リスクレベルは Info になりました。
サンプルの検出結果だと AI が見抜いたようです。なぜそう判断したのかを、レコードで確認してみます。

AWS CLI でレコードを一覧する

list-investigation-records に detector ID と調査 ID を渡します。
そのままだと出力が長いので、jq で作成日時、種別、タイトルだけを並べてみます。

> aws guardduty list-investigation-records \
    --detector-id $DETECTOR_ID \
    --investigation-id $INVESTIGATION_ID \
  | jq -r '.Records[] | "\(.CreatedAt)\t\(.Type)\t\(.Title)"'

2026-11-13T09:14:16.120000+09:00	UPDATE	User Request
2026-11-13T09:14:16.121000+09:00	UPDATE	Assistant Response
2026-11-13T09:14:23.883000+09:00	FETCH	Fetching Finding
2026-11-13T09:14:24.396000+09:00	FETCH	Fetching Detector details
2026-11-13T09:14:28.676000+09:00	FETCH	Fetching Finding Type Documentation
2026-11-13T09:14:31.749000+09:00	OBSERVATION	EC2 Instance Details
2026-11-13T09:15:11.322000+09:00	OBSERVATION	No Related Findings Correlated to Instance Credential Exfiltration
2026-11-13T09:15:11.323000+09:00	ANALYSIS	Threat Assessment: Instance Credential Exfiltration Outside the Instance
2026-11-13T09:18:42.590000+09:00	ANALYSIS	Credential Exfiltration Vector Analysis (InsideAWS)
2026-11-13T09:18:54.780000+09:00	ANALYSIS	Post-Exfiltration Activity Pattern
2026-11-13T09:19:27.582000+09:00	OBSERVATION	CloudTrail Session Activity
2026-11-13T09:19:27.583000+09:00	ANALYSIS	API Activity and Persistence Analysis
2026-11-13T09:19:27.584000+09:00	OBSERVATION	Impacted Resources
2026-11-13T09:19:43.036000+09:00	OBSERVATION	EC2 instance credentials used from an unaffiliated AWS account (sample finding)
2026-11-13T09:19:43.036000+09:00	OBSERVATION	Detection coverage for account 123456789012
2026-11-13T09:20:34.364000+09:00	METADATA	Investigation Metadata

16 件のレコードが返ってきました。
検出結果と detector の設定、検出結果タイプのドキュメントを取得し、リソースと関連する検出結果を確認してから分析に進む、という流れが読み取れます。

種別を絞り込む

--record-types に種別をスペース区切りで渡すと、その種別だけが返ります。
観察と分析だけに絞ってみます。

> aws guardduty list-investigation-records \
    --detector-id $DETECTOR_ID \
    --investigation-id $INVESTIGATION_ID \
    --record-types OBSERVATION ANALYSIS \
  | jq '.Records | length'

10

16 件が 10 件になりました。この中から、Info と判定した根拠になっていそうなレコードを見てみます。

まず、関連する検出結果を探した OBSERVATION のレコードです。Narrative を抜粋します。

Three correlation queries were run over the wide window of 2026-09-21T23:27:52Z to 2026-10-05T23:27:52Z
(±7 days around the primary's updatedAt): (1) same_behavior on remote IP 198.51.100.0 ...,
(2) same_resource on EC2 instance i-99999999 ..., and (3) same_resource on IAM access key
GeneratedFindingAccessKeyId .... All three queries returned zero results.

検出結果の更新日時の前後 7 日間を対象に、3 つの条件で関連する検出結果を検索しています。
条件は、同じ送信元 IP アドレス、同じ EC2 インスタンス、同じアクセスキーです。いずれも 0 件と記録されています。
サマリーにも検索の結果は書かれていますが、レコードでは検索に使ったフィールドまで確認できます。

次に、検知カバレッジのレコードです。こちらは SupportingData が付いています。

{
    "RecordId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "Type": "OBSERVATION",
    "Title": "Detection coverage for account 123456789012",
    "Narrative": "CloudTrail management events, S3 data events, VPC Flow Logs, DNS logs, EKS Audit Logs, Lambda network logs, RDS login events, EBS Malware Protection and Runtime Monitoring are enabled. Automated agent management for EC2 and ECS Fargate is disabled, and EKS Runtime Monitoring is disabled.",
    "CreatedAt": "2026-11-13T09:19:43.036000+09:00",
    "SupportingData": {
        "Observation": {
            "ObservationType": "DETECTION_COVERAGE",
            "DetectionCoverage": {
                "ProtectionPlans": [
                    {
                        "Name": "CLOUD_TRAIL",
                        "Status": "ENABLED"
                    },
                    {
                        "Name": "EC2_AGENT_MANAGEMENT",
                        "Status": "DISABLED"
                    },
                    {
                        "Name": "RUNTIME_MONITORING",
                        "Status": "ENABLED"
                    }
                ],
                "FoundationalDataSources": [
                    "CLOUD_TRAIL",
                    "DNS_LOGS",
                    "FLOW_LOGS"
                ],
                "KeyObservation": "This finding comes from CloudTrail management events, which are enabled, so the core detection for credential misuse is in place. Runtime Monitoring is enabled, but EC2 automated agent management is disabled. Unless the GuardDuty agent was installed by hand on instance i-99999999, there may be no host-level view of how the credentials were pulled from the instance, such as a process calling the instance metadata service. VPC Flow Logs and DNS logs are enabled and give network context for the instance."
            }
        }
    }
}

ProtectionPlans は実際には 13 項目ありましたが、3 項目に省略しています。

KeyObservation には、この検出結果タイプに対して今の設定で何が見えて何が見えないのかが書かれています。
Runtime Monitoring は有効でも EC2 のエージェント自動管理が無効なので、エージェントを手動で入れていなければホスト上の挙動は見えていない可能性がある、という指摘です。
こうした前提を押さえておくと、調査の結論を読むときに見えていない範囲を把握しやすくなります。

コンソールで確認する

GuardDuty コンソールの「Investigations」を開くと、調査の一覧が表示されます。

GuardDuty コンソールの Investigations ページ。完了した調査が1件表示されている

調査のタイトルを選択して詳細ページを開き、「Investigation timeline」タブを選択します。

調査の詳細ページの Investigation timeline タブ。16件のレコードが番号つきで時系列に並んでいる

CLI で取得した 16 件のレコードが、番号つきで時系列に並んでいます。種別はバッジで表示され、タイトルと Narrative がそのまま読めます。

SupportingData を持つレコードには「Details」があり、開くと構造化データを確認できます。先ほどの検知カバレッジのレコードを開いてみます。

検知カバレッジのレコードの Details を開いた状態。Key observation と Foundational data sources が表示されている

読むだけならコンソールのほうが楽でした。レコードを保存しておきたい場合や、他のツールに渡したい場合は CLI が向いていそうです。

注意点

調査が完了するまでレコードは返らない

レコードが返るのは、調査のステータスが COMPLETED のときだけです。
実行中に呼んでもエラーにはならず、空のリストとステータスが返ってきました。

> aws guardduty list-investigation-records \
    --detector-id $DETECTOR_ID \
    --investigation-id $INVESTIGATION_ID

{
    "Records": [],
    "Status": "RUNNING",
    "InvestigationId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
}

コンソールでも、実行中は「Available once the investigation completes.」と表示されます。
ドキュメントによると、調査が失敗した場合(FAILED)も空のリストになります。

まとめ

GuardDuty Investigation (Preview) で、調査が結論に至るまでの過程をレコードとして取得できるようになりました。
今回試した調査では、関連する検出結果を探した条件と期間や、調査の時点での検知カバレッジまで残っていました。

今回のように重大度 High の検出結果がリスクレベル Info と判定されたときなど、結論が妥当かをレコードから確認したい場面で使えそうです。
コンソールのタイムラインなら追加の準備なしで見られるので、調査を試すときは一緒に開いてみてください。

以上、鈴木純がお送りしました。

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事