
【初心者向け】 Amazon GuardDuty をマネジメントコンソールから導入してみた
はじめに
こんにちは、ほりぐちです。
みなさん、AWS のセキュリティ対策を始めたいけれど、何から手をつければよいか迷っていませんか?
そんな方に、まず知っていただきたいサービスの一つが AWS 環境での不審なアクティビティを自動で検出する Amazon GuardDuty です。
今回は、こちらの公式ドキュメント (GuardDuty の開始方法) に則り、GuardDuty を有効化するところから、サンプルの検出結果の確認、S3 へのエクスポート、メール通知の設定までをマネジメントコンソールで実際にやってみます。
AWS のセキュリティ対策を何から始めればよいか迷っている方や、GuardDuty の導入手順を一通り確認したい方はご覧ください。
注意
- この記事の情報は 2026 年 10 月時点のものです。
- 実施される際には実際に監視をしたいリージョンを選択してください。
- GuardDuty は有効化から 30 日間は無料トライアルの対象ですが、その後は利用量に応じて課金される点にご留意ください。
ステップ 1. GuardDuty を有効化する
まずは GuardDuty を有効にして、監視を始められる状態にします。
GuardDuty はリージョナルサービスです。使うリージョンごとに有効化をする必要があります。
マネジメントコンソールから GuardDuty のページに遷移し、「Enable all GuardDuty features」のオプションを選択して「今すぐ始める」を選択します。
「GuardDuty にようこそ」と書かれたページでサービス条件を確認し、「GuardDuty を有効にする」をクリックします。(自分のアカウントがそのリージョンで無料トライアルに含まれるかもここで確認できます)


これで、現在のリージョンですぐに監視が始まります。

ステップ 2. サンプルの検出結果を生成して確認する
当然ですが、 GuardDuty を有効にした直後は検出結果がありません。しかし、実際に不審な動作が起こるまで待つのも避けたいところです。そこで、サンプルの検出結果を生成して、画面の見方を確認します。
左のメニューから「設定」を選択し、設定ページの「結果のサンプル」にある「結果サンプルの生成」をクリックします。
これによって、様々なタイプの検出結果サンプルが生成されて実際に GuardDuty で検出されます。

生成できたら、左側メニューの「要約」でダッシュボードを見てみます。
サンプルの生成がうまくいっている場合、数百件の検出結果があると表示されます。

続いて「検出結果」を開くと、サンプルの検出結果が一覧表示されます。(生成されたサンプルには「例」というプレフィックスが付いているので簡単に見分けることができます)

特定の検出結果を選択すると、詳細が表示されます。たとえば、上部の「検出結果 ID」を選択すると、検出結果の詳細が書かれた JSON が開きます。


「影響を受けるリソース」セクションで、対象のリソースを確認できます。実際の検出結果では、ここからコンソールのリソースにリンクされます。

虫眼鏡の + / - アイコンで、その値を含める(inclusive)フィルターや除外する(exclusive)フィルターを作れます。たとえば Lambda という項目で + フィルターを作成することで AWS Lambda 関連の検出結果のみを表示できます。

サンプルをアーカイブする
見終わったサンプルの検出結果をアーカイブして片付けてみましょう。
チェックボックスでアーカイブしたい検出結果を選択し、アクションメニューから「アーカイブ」を選択します。

アーカイブした検出結果は、「ステータス」から「アーカイブ済み」を選ぶと、表示を切り替えて確認できます。

ステップ 3. 検出結果を S3 バケットにエクスポートする
GuardDuty は検出結果を 90 日間保持します。それ以上保存しておきたい場合は、S3 バケットにエクスポートします。
GuardDuty は、エクスポートする検出結果を KMS キーで暗号化します。このときに、キーポリシーを編集する必要があるため、AWS マネージドキーではなくカスタマーマネージドキーを使います。
そこで、今から次の 3 つを順番に設定していきます。
- (a) KMS キーのキーポリシー
- (b) S3 バケットのバケットポリシー
- (c) GuardDuty 側のエクスポート設定
(a) KMS キーを準備する
まずは、GuardDuty が検出結果の暗号化に使う KMS キーを用意し、キーポリシーに GuardDuty の許可を追加します。
このあと使うポリシーは、公式ドキュメント(生成された GuardDuty の検出結果を Amazon S3 バケットにエクスポートする)のポリシー例をもとにしています。
KMS のコンソール画面左のメニューから「カスタマー管理型のキー」を選択し、「キーの作成」から対称暗号化キーを新しく作成します。
※ このとき KMS キーと S3 バケットは、同じリージョンにある必要があります。




キーの「キーポリシー」セクションで「編集」を選択します(「ポリシービューへの切り替え」と表示される場合は、それを選んでから「編集」を選択します)。


既存のポリシーを以下のポリシーに置き換えます。
次の値を、自分の環境のものに置き換えて入力します。
| 項目 | 入れる値 |
|---|---|
| アカウント ID | GuardDuty を有効にしている AWS アカウント ID(12 桁) |
| リージョン | GuardDuty を有効にしているリージョン(本記事では eu-north-1) |
| ディテクター ID | GuardDuty のディテクター ID |
| KMS キー ARN | 用意した KMS キーの ARN(キーの詳細ページでコピーできます) |
{
"Version": "2012-10-17",
"Id": "key-consolepolicy-3",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウント ID>:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AllowGuardDutyKey",
"Effect": "Allow",
"Principal": {
"Service": "guardduty.amazonaws.com"
},
"Action": "kms:GenerateDataKey",
"Resource": "<KMS キー ARN>",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<アカウント ID>",
"aws:SourceArn": "arn:aws:guardduty:<リージョン>:<アカウント ID>:detector/<ディテクター ID>"
}
}
}
]
}
ディテクター ID は、GuardDuty コンソールの「設定」ページから確認できます。

(b) S3 バケットのバケットポリシーを設定する
次に、GuardDuty がバケットにオブジェクトをアップロードできるように、バケットポリシーを設定します。エクスポート先のバケットがなければ、先に作成しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow GetBucketLocation",
"Effect": "Allow",
"Principal": {
"Service": "guardduty.amazonaws.com"
},
"Action": "s3:GetBucketLocation",
"Resource": "arn:aws:s3:::<バケット名>",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<アカウント ID>",
"aws:SourceArn": "arn:aws:guardduty:<リージョン>:<アカウント ID>:detector/<ディテクター ID>"
}
}
},
{
"Sid": "Allow PutObject",
"Effect": "Allow",
"Principal": {
"Service": "guardduty.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<バケット名>/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<アカウント ID>",
"aws:SourceArn": "arn:aws:guardduty:<リージョン>:<アカウント ID>:detector/<ディテクター ID>"
}
}
},
{
"Sid": "Deny unencrypted object uploads",
"Effect": "Deny",
"Principal": {
"Service": "guardduty.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<バケット名>/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
}
},
{
"Sid": "Deny incorrect encryption header",
"Effect": "Deny",
"Principal": {
"Service": "guardduty.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<バケット名>/*",
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption-aws-kms-key-id": "<KMS キー ARN>"
}
}
},
{
"Sid": "Deny non-HTTPS access",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::<バケット名>/*",
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
}
]
}
置き換える値は次のとおりです。
| 項目 | 入れる値 |
|---|---|
| バケット名 | エクスポート先の S3 バケット名(バケット ARN は「バケットポリシーを編集」ページで確認できます) |
| アカウント ID | GuardDuty を有効にしている AWS アカウント ID(12 桁) |
| リージョン | GuardDuty を有効にしているリージョン |
| ディテクター ID | GuardDuty のディテクター ID(GuardDuty コンソールの「設定」ページか、ListDetectors API で確認できます) |
| KMS キー ARN | KMS キーの ARN |
フォルダ(プレフィックス)を指定してエクスポートする場合は、/* の前にフォルダ名を入れて arn:aws:s3:::<バケット名>/<フォルダ名>/* のようにします。
フォルダを指定しない場合は、バケットを作っておくだけで構いません。筆者の環境では、バケットの直下に AWSLogs/アカウント ID/GuardDuty/リージョン/年/月/日/ のフォルダが自動で作成され、その中に検出結果が出力されました。
(c) GuardDuty でエクスポートを設定する
最後に、GuardDuty 側でエクスポート先を設定します。
GuardDuty コンソールの左側メニューから「設定」を選択し、「検出結果のエクスポートオプション」にある「S3 バケット」で「今すぐ設定」を選択します。

「S3 バケット ARN」にエクスポート先のバケット ARN を、「KMS キー ARN」に KMS キーの ARN を入力して保存します。

S3 へのエクスポートが設定されているかを確認するために再度サンプルの検出結果を生成します。

無事検出結果がエクスポートされていることを確認できました。

ステップ 4. 検出結果をメールで受け取る(SNS + EventBridge)
検出結果が出たときに気づけるよう、メールで通知する仕組みを作ります。EventBridge のルールで GuardDuty の検出結果を拾い、SNS トピック経由でメールを送ります。
SNS トピックを作成する
まずは、通知の送信先になる SNS トピックを作成し、メールアドレスをサブスクライブします。
SNS のコンソールを開き、メニューから「トピック」を選択して、「トピックの作成」を選択します。

タイプは「スタンダード」、名前は好きな名前に設定して「トピックの作成」を選択します。

作成したトピックの詳細画面で「サブスクリプションの作成」を選択します。

プロトコルは「E メール」、エンドポイントは通知を受け取るメールアドレスを入力して「サブスクリプションの作成」をクリックします。

届いた確認メールのリンクをクリックして「Confirm Subscription」を選択します。

SNS コンソールの「サブスクリプション」でステータスが「確認済み」になっていることを確認します。

EventBridge ルールを作成する
次に、GuardDuty の検出結果を SNS トピックに送る EventBridge ルールを作成します。
EventBridge のコンソールを開き、左側のメニューから「ルール」を選択して、「ルールを作成」を選択します。

「アドバンストビルダー」を選択します。ルールの詳細では、次のように設定して「次へ」を選択します。
| 項目 | 設定 |
|---|---|
| 名前 | 任意の名前 |
| イベントバス | default |

イベントパターンの構築の項目で、イベントソースとして「AWS イベントまたは EventBridge パートナーイベント」を選択します。

イベントパターンは、次のように設定します。
| 項目 | 設定 |
|---|---|
| 作成のメソッド | パターンフォームを使用する |
| イベントソース | AWS のサービス |
| AWS のサービス | GuardDuty |
| イベントタイプ | GuardDuty Finding |

「次へ」を選択します。
ターゲットは次のように設定します。
| 項目 | 設定 |
|---|---|
| ターゲットタイプ | AWS のサービス |
| ターゲットの選択 | SNS トピック |
| トピック | 先ほど作成した SNS トピック |

「追加設定」セクションの「ターゲット入力を設定」で「入力トランスフォーマー」を選択して、「入力トランスフォーマーを設定」を選択します。

入力トランスフォーマーを使うと、GuardDuty から送られる JSON の検出結果データを人が読みやすいメッセージに整形できます。「ターゲット入力トランスフォーマー」セクションの「入力パス」に、次を貼り付けます。
{
"severity": "$.detail.severity",
"Finding_ID": "$.detail.id",
"Finding_Type": "$.detail.type",
"region": "$.region",
"Finding_Description": "$.detail.description"
}
「テンプレート」には次を貼り付けます。
"You have a severity <severity> GuardDuty finding type <Finding_Type> in the <region> region."
"Finding Description:"
"<Finding_Description>."
"For more details open the GuardDuty console at https://console.aws.amazon.com/guardduty/home?region=<region>#/findings?search=id%3D<Finding_ID>"
「確認」を選択して、「次へ」を選択します。タグは任意で、そのまま「次へ」を選択します。確認画面でルールの詳細を確認して、「ルールを作成」を選択します。
動作確認
もう一度サンプルの検出結果を生成して、通知を確認します。
コンソールの「結果サンプルの生成」は、すべての検出結果タイプのサンプルを一度に生成します。ルールを作った後に実行すると、数百件のメールが届いてしまいます。そのため、テストするときは AWS CLI から検出結果タイプを 1 つだけ指定して生成することをおすすめします。
参考:Amazon GuardDutyで1つのサンプルイベントのみ発生させる方法 | DevelopersIO
コマンドは、AWS CloudShell から実行するのが手軽です。ローカルの AWS CLI でも同じコマンドで実行できます。
コンソール上部のナビゲーションバーにある「CloudShell」アイコンを選択すると、CloudShell が開きます。コマンドプロンプトが表示されたら、コマンドを入力できます。
CloudShell は、コンソールで選択しているリージョンで起動します。
create-sample-findings で、検出結果タイプを 1 つだけ指定してサンプルを生成します。<ディテクター ID> には、GuardDuty のディテクター ID を、<リージョン> には GuardDuty を有効化したリージョンを入れます。
aws guardduty create-sample-findings \
--detector-id <ディテクター ID> \
--finding-types "Recon:EC2/PortProbeUnprotectedPort" \
--region <リージョン>
生成できたかどうかは、GuardDuty コンソールの検出結果の一覧で確認できます。名前に 「例」 が付いた検出結果が 1 件追加されます。
別の検出結果タイプを試したいときは、--finding-types の値を変えます。指定できるタイプは、GuardDuty の検出結果タイプで確認できます。--finding-types を省略すると、サポートされているすべての検出結果タイプのサンプルが生成されます。(CreateSampleFindings)
少し待つと、サブスクライブしたメールアドレスに通知が届きます。本文が入力トランスフォーマーのテンプレートどおりに整形されていることを確認します。

コンソールの「設定」→「結果サンプルの生成」から生成することもできますが、前述のとおり大量のメールが届きますのでご注意ください。
ステップ 5. 後片付け
検証が終わったら、GuardDuty を停止または無効化します。左側のメニューで「設定」を選択し、「GuardDuty の停止」セクションで「GuardDuty の停止」または「GuardDuty の無効化」を選択して、「確認」を選択します。
停止と無効化の違いは次のとおりです。(GuardDuty の停止または無効化)
| 項目 | 停止 | 無効化 |
|---|---|---|
| モニタリングと新しい検出結果の生成 | 止まる | 止まる |
| GuardDuty の使用料金 | 課金されない | 課金されない |
| 既存の検出結果 | 変更されず、そのまま残る | 失われ、復旧できない |
| GuardDuty の設定 | そのまま残る | 失われ、復旧できない |
| 再度使うとき | 設定 で GuardDuty の再有効化 を選択する | 最初から有効化し直す |
無効化すると検出結果は復旧できないので、残したい場合は、先に S3 へエクスポートしてから無効化してください。
また、停止と無効化のどちらでも、次の点に注意してください。
- すべてのメンバーアカウントの関連付けを解除するか、削除してから行う必要があります。
- Malware Protection for S3 を有効にしている場合、GuardDuty を停止または無効化しても、保護されたバケットの状態には影響しません。使用コストも引き続き発生するので、Malware Protection for S3 を使った場合は別途無効化してください。
また、無効化は現在選択しているリージョンでのみ行われます。
検証用に作ったリソースを削除する
GuardDuty を停止または無効化しても、手順 3 と 4 で作ったリソースは残ります。とくにカスタマーマネージドキーは、使っていなくても月額料金がかかります。
今日作ったリソースが不要であれば、次の順で削除します。
- EventBridge のコンソールで、手順 4 で作ったルールを削除します。
- SNS のコンソールで、サブスクリプションとトピックを削除します。
- S3 のコンソールで、エクスポート先のバケットを空にしてから削除します。
- KMS のコンソールで、手順 3 で作ったキーを選び、「キーの削除をスケジュール」を選択します。
KMS キーはすぐには削除されず、7〜30 日(デフォルトは 30 日)の待機期間の後に削除されます。削除されたキーで暗号化したデータは復号できなくなるので、エクスポートした検出結果を残しておきたい場合は、キーを削除しないように気をつけてください。(KMS キーの削除)
おわりに
おつかれさまでした!
今回は、Amazon GuardDuty を有効化し、サンプルの検出結果の確認、S3 へのエクスポート、メール通知の設定までを試してみました。
GuardDuty は、ログの設定をしなくても数クリックで有効化でき、すぐに脅威の検出が始まります。まずは有効化して、サンプルの検出結果で画面に慣れるところから始めてみることをおすすめします。
この記事が GuardDuty を導入する際の参考になれば幸いです。






