Amazon CloudWatch Events を使用した GuardDuty の検出結果に対するカスタムレスポンスの作成 - Amazon GuardDuty

Amazon CloudWatch Events を使用した GuardDuty の検出結果に対するカスタムレスポンスの作成

検出結果が変更されると、GuardDuty は、Amazon CloudWatch Eventsのイベントを作成します。CloudWatch イベントを作成する変更の検出結果には、新しく生成された検出結果または新しく集計された検出結果が含まれます。イベントは、ベストエフォートベースで出力されます。

GuardDuty の検出結果には、それぞれ検出結果 ID が割り当てられます。GuardDuty によって、一意の検出結果 ID を持つ各検出結果に対して CloudWatch イベントが作成されます。その後に発生した既存の検出結果は、すべて元の検出結果に集約されます。

注記

アカウントが GuardDuty の委任された管理者である場合、CloudWatch Events は元のメンバーアカウントに加えて、アカウントに公開されます。

GuardDuty で CloudWatch events を使用することにより、タスクを自動化し、GuardDuty の検出結果によって明らかになったセキュリティ上の問題に対応できるようになります。

CloudWatch Events に基づいて GuardDuty の検出結果に関する通知を受け取るには、CloudWatch Events ルールおよび GuardDuty のターゲットを作成する必要があります。このルールでは、CloudWatch は GuardDuty が生成する検出結果の通知を、ルールで指定されたターゲットに送信できます。詳細については、「GuardDuty (CLI) の CloudWatch Events とターゲットの作成」を参照してください。

GuardDuty の CloudWatch Events 通知頻度

[Notifications for newly generated findings with a unique finding ID] (一意の結果 ID を持つ新しく生成された結果の通知) - GuardDuty は CloudWatch イベントに基づいて検出結果の 5 分以内に通知を送信します。このイベント (およびこの通知) には、この検出結果が一意の ID を伴って生成されてから最初の 5 分に発生したこの検出結果のそれ以降のすべての発生も含まれています。

重要

新しく生成される検出結果に関して送信される通知のデフォルトの頻度 (5 分) をカスタマイズすることはできません。

[Notifications for subsequent finding occurrences] (以後の結果の発生に関する通知) - デフォルトでは、ユニークな検出結果 ID を用いての検出結果のために、GuardDuty は、6 時間間隔で行われる特定の検出結果のその後の発生を単一のイベントに集約します。その後、GuardDuty はこのイベントに基づいて、これらの後続の発生に関する通知を送信します。つまり、デフォルトでは、既存の検出結果の後続の発生については、GuardDuty は CloudWatch Events に基づいて 6 時間ごとに通知を送信します。

重要

その後の検出結果の発生に関する通知のデフォルトの頻度はカスタマイズできます。有効な値は、15 分、1 時間、またはデフォルトの 6 時間です。この値は、CreateDetector または UpdateDetector API オペレーションを使用して更新できます。GuardDuty コンソールからこの値を更新することもできます - [Settings] (設定) を選択し、[CloudWatch Events] で、[Updated findings] (更新された結果) プルダウンメニューから利用できる値の一つを選択します。

監督者アカウントのユーザーのみが、以降の検出結果について CloudWatch Events に送信される通知のデフォルトの頻度をカスタマイズできます。メンバーアカウントのユーザーはこの頻度値をカスタマイズできません。自分のアカウントで管理者アカウントにより設定された頻度値は、そのすべてのメンバーアカウント中の GuardDuty 機能に適用されます。つまり、管理者アカウントのユーザーがこの頻度値を 1 時間に設定すると、すべてのメンバーアカウントでも、以降の検出結果について CloudWatch Events に送信される通知の頻度が 1 時間になります。詳細については、「Amazon GuardDuty での複数のアカウントの管理 GuardDuty との AWS のサービス統合」を参照してください。

CloudWatch Eventsを用いてアーカイブされた GuardDuty の検出結果のモニタリング

手動でアーカイブされた検出結果の場合、最初の検出結果と、それ以降に発生したすべての検出結果 (アーカイブ完了後に生成された検出結果) は、前述のとおり頻度ごとに CloudWatch Events に送信されます。

自動でアーカイブされた検出結果の場合、最初の検出結果と、それ以降に発生したすべての検出結果 (アーカイブ完了後に生成された検出結果) は、CloudWatch Events に送信されません

GuardDuty の CloudWatch イベント形式

GuardDuty の CloudWatch イベントには次の形式があります。

{ "version": "0", "id": "cd2d702e-ab31-411b-9344-793ce56b1bc7", "detail-type": "GuardDuty Finding", "source": "aws.guardduty", "account": "111122223333", "time": "1970-01-01T00:00:00Z", "region": "us-east-1", "resources": [], "detail": {GUARDDUTY_FINDING_JSON_OBJECT} }
注記

詳細値は、配列内で複数の検出結果をサポートできる「検出結果」値を返すのとは対照的に、単一の検出結果の JSON の詳細をオブジェクトとして返します。

GUARDDUTY_FINDING_JSON_OBJECT に含まれているすべてのパラメータの完全なリストについては、「GetFindings」を参照してください。GUARDDUTY_FINDING_JSON_OBJECT に表示される id パラメータは、上記で説明した検出結果 ID です。

GuardDuty の検出結果を通知する CloudWatch Events ルールの作成 (コンソール)

GuardDuty で CloudWatch Events を使用すると、GuardDuty の検出結果イベントをメッセージングハブに送信して GuardDuty の検出結果の可視性を高めることで、自動検出結果アラートを設定できます。このトピックでは、SNS トピックを設定し、そのトピックを CloudWatch Events ルールに接続して、E メール、Slack、または Amazon Chime に検出結果アラートを送信する方法を説明します。

Amazon SNS トピックおよびエンドポイントの設定

まず、Amazon Simple Notification Service でトピックを設定し、エンドポイントを追加する必要があります。詳細については、「SNS ガイド」を参照してください。

この手順では、GuardDuty の検出結果データを送信したい場所を設定します。SNS トピックは、イベントルールの作成中または作成後に CloudWatch Events ルールに追加できます。

Email setup

SNS トピックの作成

  1. https://console.aws.amazon.com/sns/v3/home で Amazon SNS コンソール にサインインします。

  2. ナビゲーションペインから [Topics] (トピック) を選択し、[Create Topic] (トピックの作成) を選択します。

  3. [Create topic] (トピックの作成) セクションで [Standard] (スタンダード) を選択します。次に、トピックの名前を入力します (例: GuardDuty_to_Email)。その他の詳細はオプションです。

  4. [Create Topic] (トピックの作成) を選択します。新しいトピックのトピック詳細が開きます。

  5. [Subscriptions] (サブスクリプション) セクションで、[Create Subscription] (サブスクリプションの作成) を選択します。

    1. [Protocol] (プロトコル) メニューから [Email] (E メール) を選択します。

    2. [Endpoint] (エンドポイント) フィールドに、通知を受信する E メールアドレスを追加します。

      注記

      作成後、E メールクライアントを通じてサブスクリプションを確認する必要があります。

    3. [Create subscription] (サブスクリプションの作成) を選択します。

  6. 受信トレイでサブスクリプションのメッセージを確認し、[Confirm Subscription] (サブスクリプションの確認) を選択します。

Slack setup

SNS トピックの作成

  1. https://console.aws.amazon.com/sns/v3/home で Amazon SNS コンソール にサインインします。

  2. ナビゲーションペインから [Topics] (トピック) を選択し、[Create Topic] (トピックの作成) を選択します。

  3. [Create topic] (トピックの作成) セクションで [Standard] (スタンダード) を選択します。次に、トピックの名前を入力します (例: GuardDuty_to_Slack)。その他の詳細はオプションです。[Create topic] (トピックの作成)を選択し、確定します。

AWS Chatbot クライアントの設定

  1. AWS Chatbot コンソールに移動します。

  2. [Configured clients] (設定されたクライアント) パネルから [Configure new client] (新しいクライアントを設定) を選択します。

  3. Slack を選択し、[Configure] (設定) で確認します。

    注記

    Slack を選択するときは、[allow] (許可) を選択してチャンネルにアクセスするために、AWS Chatbot のための許可を確認する必要があります。

  4. [Configure new channel] (新しいチャンネルを設定)を選択し、設定の詳細ペインを開きます。

    1. チャンネルの名前を入力します。

    2. [Slack channel] (Slack チャンネル) で、使用したいチャネルを選択します。AWS Chatbot を用いてプライベート Slack チャンネルを使用するには、[Private channel] (プライベートチャンネル) を選択します。

    3. Slack で、チャンネル名を右クリックして [Copy Link] (リンクのコピー) を選択して、コピーのリンクを選択することでプライベートチャンネルのチャンネル ID をコピーします。

    4. AWS Chatbot ウインドウの AWS マネジメントコンソールで、Slack からコピーした ID を [Private channel ID] (プライベートチャンネル ID) フィールドに貼り付けます。

    5. [Permissions] (許可)で、まだロールを持っていない場合は、テンプレートを使用して IAM ロールを作成することを選択します。

    6. [Policy] (ポリシー) テンプレートで、[Notification permissions] (通知の許可) を選択します。これは AWS Chatbot のためのIAM ポリシーテンプレートです。CloudWatch アラーム、イベント、ログ、および Amazon SNS トピックに必要な読み取りおよびリスト許可を提供します。

    7. 以前に SNS トピックを作成したリージョンを選択し、Slack チャンネルに通知を送信するために作成した Amazon SNS トピックを選択します。

  5. [Configure] (設定) を選択します。

Chime setup

SNS トピックの作成

  1. https://console.aws.amazon.com/sns/v3/home で Amazon SNS コンソール にサインインします。

  2. ナビゲーションペインから [Topics] (トピック) を選択し、[Create Topic] (トピックの作成) を選択します。

  3. [Create topic] (トピックの作成) セクションで [Standard] (スタンダード) を選択します。次に、トピックの名前を入力します (例: GuardDuty_to_Chime)。その他の詳細はオプションです。[Create topic] (トピックの作成)を選択し、確定します。

AWS Chatbot クライアントの設定

  1. AWS Chatbot コンソールに移動します。

  2. [Configured clients] (設定されたクライアント) パネルから [Configure new client] (新しいクライアントを設定) を選択します。

  3. Chime を選択し、[Configure] (設定) で確認します。

  4. [Configuration details] (設定の詳細) ペインから、チャンネルの名前を入力します。

  5. Chime で目的のチャットルームを開きます。

    1. 右上の歯車アイコンを選択してから、[Manage webhooks and bots] (ウェブフックとボットの管理) を選択します。

    2. [Copy URL] (URL をコピー)を選択し、Webhook URL をクリップボードにコピーします。

  6. AWS Chatbot ウィンドウのリポジトリの AWS マネジメントコンソール上で、コピーした URL を [Webhook URL] (ウェブフック URL) フィールドに貼り付けてください。

  7. [Permissions] (許可)で、まだロールを持っていない場合は、テンプレートを使用して IAM ロールを作成することを選択します。

  8. [Policy] (ポリシー) テンプレートで、[Notification permissions] (通知の許可) を選択します。これは AWS Chatbot のためのIAM ポリシーテンプレートです。CloudWatch アラーム、イベント、ログ、および Amazon SNS トピックに必要な読み取りおよびリスト許可を提供します。

  9. 以前に SNS トピックを作成したリージョンを選択し、Chime ルームに通知を送信するために作成した Amazon SNS トピックを選択します。

  10. [Configure] (設定) を選択します。

GuardDuty の検出結果の CloudWatch イベントを設定します。

  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. ナビゲーションペインから [Rules] (ルール) を選択し、[Create Rule] (ルールの作成) を選択します。

  3. [Service Name] (サービス名) メニューから [GuardDuty] を選択します。

  4. [Event Type] (イベントタイプ) メニューから [GuardDuty Finding] (GuardDuty の検出結果) を選択します。

  5. [Event Pattern Preview] (イベントパターンのプレビュー) の [Edit] (編集) を選択します。

  6. 以下の JSON コードを [Event Pattern Preview] (イベントパターンプレビュー) に貼り付け、[Save] (保存) を選択します。

    { "source": [ "aws.guardduty" ], "detail-type": [ "GuardDuty Finding" ], "detail": { "severity": [ 4, 4.0, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6, 6.0, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7, 7.0, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9 ] } }
    注記

    上記のコードでは、[Medium] (中)〜[High] (高) の検出結果が警告されます。

  7. [Targets] (ターゲット) セクションで、[Add Target] (ターゲットの追加) をクリックします。

  8. [Select Targets] (ターゲットの選択) メニューから、[SNS Topic] (SNS トピック) を選択します。

  9. [Select Topic] (トピックの選択) で、ステップ 1 で作成した SNS トピックの名前を選択します。

  10. イベントの入力を設定します。

    • Chime または Slack の通知をステップ 11 にスキップするように設定している場合、タイプデフォルトを [Matched event] (一致したイベント) に入力します。

    • SNS 経由でメールの通知を設定する場合は、次のステップで示されるとおりに、以下のステップに従って受信トレイに送信されるメッセージをカスタマイズします。

    1. [Configure input] (入力の設定) を展開して、[Input Transformer] (インプットトランスフォーマー) を閉じます。

    2. 次のコードをコピーして、[Input Path] (入力パス) フィールドに貼り付けます。

      { "severity": "$.detail.severity", "Account_ID": "$.detail.accountId", "Finding_ID": "$.detail.id", "Finding_Type": "$.detail.type", "region": "$.region", "Finding_description": "$.detail.description" }
    3. 次のコードをコピーして [Input Template] (入力テンプレート) フィールドに貼り付け、E メールをフォーマットします。

      "AWS <Account_ID> has 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=<Finding_ID>"
  11. [Configure Details] (詳細の設定) をクリックします。

  12. [Configure rule details] (ルール詳細の設定) ページでルールの [Name] (名前) と [Description] (説明) を入力してから、[Create Rule] (ルールの作成) を選択してルールを有効化します。

GuardDuty (CLI) の CloudWatch Events とターゲットの作成

次の手順は、AWS CLI コマンドを使用して、CloudWatch Events のルールおよび GuardDuty ターゲットを作成する方法を示します。具体的には、CloudWatch を可能にするルールを作成して、GuardDuty が生成するすべての検出結果のイベントを送信し、ルールのターゲットとして AWS Lambda 関数を追加する方法について説明します。

注記

Lambda 関数に加えて、GuardDuty および CloudWatch は次のターゲットタイプをサポートします: Amazon EC2 インスタンス、Amazon Kinesis streams、Amazon ECSタスク、AWS Step Functions ステートマシン、run のコマンド、および組み込みターゲット。

CloudWatch Events コンソールから、GuardDuty の CloudWatch Events ルールおよびターゲットを作成することもできます。より多くの情報と詳細なステップについては、「イベントでトリガーする CloudWatch Events のルールの作成」を参照してください。[Event Source] (イベントソース) セクションで、[Service name] (サービス名) のための GuardDuty[Event Type] (イベントタイプ) のための GuardDuty Finding を選択します。

ルールおよびターゲットを作成するには

  1. GuardDutyが生成するすべての検出結果のイベントを CloudWatch から送信するルールを作成するには、次の CloudWatch CLI コマンドを実行します。

    AWS events put-rule --name Test --event-pattern "{\"source\":[\"aws.guardduty\"]}"

    重要

    GuardDuty で生成された検出結果のサブセットにのみイベントを送信するよう CloudWatch に指示できるように、ルールをさらにカスタマイズできます。このサブセットは、ルールで指定されている検出結果の属性に基づきます。例えば、次の CLI コマンドを使用して、CloudWatch で重要度が 5 または 8 の GuardDuty の検出結果でイベントのみ送信できるようにルールを作成します。

    AWS events put-rule --name Test --event-pattern "{\"source\":[\"aws.guardduty\"],\"detail-type\":[\"GuardDuty Finding\"],\"detail\":{\"severity\":[5,8]}}"

    この目的のために、GuardDuty の検出結果のための JSON で利用可能な任意のプロパティ値を使用できます。

  2. ステップ 1 で作成したルールのターゲットとして Lambda 関数をアタッチするには、次の CloudWatch CLI コマンドを実行します。

    AWS events put-targets --rule Test --targets Id=1,Arn=arn:aws:lambda:us-east-1:111122223333:function:<your_function>

    注記

    上記コマンド内の <your_function> を GuardDuty イベントの実際の Lambda 関数に置き換えてください。

  3. ターゲットを呼び出す上で必要な許可を追加するには、次の Lambda CLI コマンドを実行します。

    AWS lambda add-permission --function-name <your_function> --statement-id 1 --action 'lambda:InvokeFunction' --principal events.amazonaws.com

    注記

    上記コマンド内の <your_function> を GuardDuty イベントの実際の Lambda 関数に置き換えてください。

    注記

    上記の手順では、CloudWatch Events をトリガーするルールのターゲットとして Lambda 関数を使用しています。他の AWS リソースをターゲットと設定して、CloudWatch Events をトリガーすることもできます。詳細については、「PutTargets」を参照してください。

GuardDuty マルチアカウント環境の CloudWatch Events

GuardDuty 管理者として、アカウント内の CloudWatch イベントルールは、メンバーアカウントからの該当する検出結果に基づいてトリガーします。つまり、前のセクションで説明したように、管理者アカウントで CloudWatch Events を通じて検出結果通知を設定すると、独自のメンバーアカウントに加えてメンバーアカウントによって生成された重要度の高い、中程度の検出結果も通知されます。

GuardDuty の検出結果元となったメンバーアカウントは、検出結果のJSON 詳細の accountId フィールドによって特定することができます。。

コンソールで環境内の特定のメンバーアカウントのカスタムイベントルールの作成を開始するには、新しいルールを作成し、イベントパターンプレビューに次のテンプレートを貼り付け、イベントをトリガーしたいメンバーアカウントのアカウント ID を追加します。

{ "source": [ "aws.guardduty" ], "detail-type": [ "GuardDuty Finding" ], "detail": { "accountId": [ "123456789012" ] } }
注記

この例では、リストされたアカウント ID のすべての検出結果に対してトリガーします。複数の ID を JSON 構文の後にカンマで区切って追加できます。