全リージョンにおけるGuardDutyの検出結果を通知する設定について

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は、全リージョンのGuardDutyの検出を通知する設定をご紹介いたします。

概要図

今回は東京リージョンのEventBirdgeにGuardDutyの検出を集約し、そこからセキュリティレベルがHIGHのものだけを通知する構成となります。

やること

今回実施することは以下の通りです。

  • ①SNSの作成(東京リージョン)
  • ②カスタムイベントバスの作成(東京リージョン)
  • ③IAMロールの作成(東京リージョン)
  • ④②に作成したイベントバスにGuardDutyのイベントを集約するルールの作成(全リージョン)
  • ⑤セキュリティレベルがHIGHの検出だけを通知するルールの作成(東京リージョン)
  • ⑥動作確認

①SNSの作成(東京リージョン)

以下のドキュメントを参照し、SNSの作成を実施いたします。

https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-getting-started.html

◆備考
Slackなどに通知したい場合は、ChatBotの設定を行います。
設定方法は、以下の「AWS Chatbotの設定」を参考にしていただけますと幸いです。

blog.serverworks.co.jp

②カスタムイベントバスの作成(東京リージョン)

以下にアクセスします。

https://ap-northeast-1.console.aws.amazon.com/events/home?region=ap-northeast-1#/eventbuses

イベントバスの作成を押下します。

任意の名前を入力し、作成を押下します。

今回、名前は、GuardDuty-EventBus にしました。

③IAMロールの作成(東京リージョン)

IAMポリシーの作成

②で作成したイベントバスへアクセスできるIAMポリシーを作成します。
[アカウントID]には対象のAWSアカウントIDを入力します。
※カスタムイベントバス名を変えている場合は、GuardDuty-EventBusを変えた名前に変更します。

IAMポリシー(Amazon_EventBridge_Invoke_GuardDuty-EventBus)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "events:PutEvents"
            ],
            "Resource": [
                "arn:aws:events:ap-northeast-1:[アカウントID]:event-bus/GuardDuty-EventBus"
            ]
        }
    ]
}

IAMロールの作成

信頼関係に以下を定義し、作成したIAMポリシーをアタッチします。

IAMロール(Amazon_EventBridge_Invoke_GuardDuty-EventBus)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "events.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

④②に作成したイベントバスにGuardDutyのイベントを集約するルールの作成(全リージョン)

◆ポイント

  • マネジメントコンソールからは、ルールの作成と同時にターゲットも指定しますが、CLIではコマンド(put-rule,put-targets)が分かれています。
  • 定義したルールに応じて、イベントをターゲットに転送します。

ルールの作成

aws events put-rule --name "GuardDuty-Event-ap-northeast-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ap-northeast-1
aws events put-rule --name "GuardDuty-Event-ap-northeast-2" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ap-northeast-2
aws events put-rule --name "GuardDuty-Event-ap-northeast-3" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ap-northeast-3
aws events put-rule --name "GuardDuty-Event-ap-south-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ap-south-1
aws events put-rule --name "GuardDuty-Event-ap-southeast-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ap-southeast-1
aws events put-rule --name "GuardDuty-Event-ap-southeast-2" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ap-southeast-2
aws events put-rule --name "GuardDuty-Event-ca-central-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region ca-central-1
aws events put-rule --name "GuardDuty-Event-eu-central-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region eu-central-1
aws events put-rule --name "GuardDuty-Event-eu-north-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region eu-north-1
aws events put-rule --name "GuardDuty-Event-eu-west-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region eu-west-1
aws events put-rule --name "GuardDuty-Event-eu-west-2" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region eu-west-2
aws events put-rule --name "GuardDuty-Event-eu-west-3" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region eu-west-3
aws events put-rule --name "GuardDuty-Event-sa-east-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region sa-east-1
aws events put-rule --name "GuardDuty-Event-us-east-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region us-east-1
aws events put-rule --name "GuardDuty-Event-us-east-2" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region us-east-2
aws events put-rule --name "GuardDuty-Event-us-west-1" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region us-west-1
aws events put-rule --name "GuardDuty-Event-us-west-2" --event-pattern "{  \"source\": [\"aws.guardduty\"],  \"detail-type\": [\"GuardDuty Finding\"]}" --region us-west-2

◆補足
以下のコマンドでルールが作成できたか確認することができます。

aws ec2 describe-regions --query "Regions[].RegionName" --output text | tr "\t" "\n" | sort | while read line
do 
   echo $line
   aws events list-rules --query "Rules[].[Arn]"  --output text --region $line
done

実行イメージ

ap-northeast-1
arn:aws:events:ap-northeast-1:xxxxxxxxxxxx:rule/GuardDuty-Event-ap-northeast-1
ap-northeast-2
arn:aws:events:ap-northeast-2:xxxxxxxxxxxx:rule/GuardDuty-Event-ap-northeast-2
ap-northeast-3
arn:aws:events:ap-northeast-3:xxxxxxxxxxxx:rule:rule/GuardDuty-Event-ap-northeast-3
ap-south-1
arn:aws:events:ap-south-1:xxxxxxxxxxxx:rule:rule/GuardDuty-Event-ap-south-1
ap-southeast-1
arn:aws:events:ap-southeast-1:xxxxxxxxxxxx:rule:rule/GuardDuty-Event-ap-southeast-1
 : 

ターゲットの作成

ターゲットを作成するためには、アカウントIDが必要になるため、アカウントIDを定義します。

account_id="アカウントID"

先ほど作成したルールにターゲットを指定します。
今回のターゲットは、東京リージョンのカスタムイベントバスになります。
また合わせて、IAMロールも定義する必要があるため、③で作成したIAMロールを定義します。
※リソース名をブログに沿って付与している場合、以下のコマンドをそのまま実行可能です。

aws events put-targets    --rule GuardDuty-Event-ap-northeast-1    --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ap-northeast-1
aws events put-targets    --rule GuardDuty-Event-ap-northeast-2    --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ap-northeast-2
aws events put-targets    --rule GuardDuty-Event-ap-northeast-3    --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ap-northeast-3
aws events put-targets    --rule GuardDuty-Event-ap-south-1        --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ap-south-1
aws events put-targets    --rule GuardDuty-Event-ap-southeast-1    --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ap-southeast-1
aws events put-targets    --rule GuardDuty-Event-ap-southeast-2    --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ap-southeast-2
aws events put-targets    --rule GuardDuty-Event-ca-central-1      --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region ca-central-1
aws events put-targets    --rule GuardDuty-Event-eu-central-1      --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region eu-central-1
aws events put-targets    --rule GuardDuty-Event-eu-north-1        --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region eu-north-1
aws events put-targets    --rule GuardDuty-Event-eu-west-1         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region eu-west-1
aws events put-targets    --rule GuardDuty-Event-eu-west-2         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region eu-west-2
aws events put-targets    --rule GuardDuty-Event-eu-west-3         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region eu-west-3
aws events put-targets    --rule GuardDuty-Event-sa-east-1         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region sa-east-1
aws events put-targets    --rule GuardDuty-Event-us-east-1         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region us-east-1
aws events put-targets    --rule GuardDuty-Event-us-east-2         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region us-east-2
aws events put-targets    --rule GuardDuty-Event-us-west-1         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region us-west-1
aws events put-targets    --rule GuardDuty-Event-us-west-2         --targets Id=Target1,Arn=arn:aws:events:ap-northeast-1:${account_id}:event-bus/GuardDuty-EventBus,RoleArn=arn:aws:iam::${account_id}:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus    --region us-west-2

◆補足
以下のコマンドでルールが作成できたかを確認することができます。

aws ec2 describe-regions --query "Regions[].RegionName" --output text | tr "\t" "\n" | sort | while read line
do   
   echo GuardDuty-Event-$line
   aws events list-targets-by-rule --rule GuardDuty-Event-$line --region $line --query "Targets[].[Id,Arn,RoleArn]" --output text
done

実行イメージ

GuardDuty-Event-ap-northeast-1
Target1 arn:aws:events:ap-northeast-1:xxxxxxxxxxxx:event-bus/GuardDuty-EventBus arn:aws:iam::xxxxxxxxxxxx:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus
GuardDuty-Event-ap-northeast-2
Target1 arn:aws:events:ap-northeast-1:xxxxxxxxxxxx:event-bus/GuardDuty-EventBus arn:aws:iam::xxxxxxxxxxxx:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus
GuardDuty-Event-ap-northeast-3
Target1 arn:aws:events:ap-northeast-1:xxxxxxxxxxxx:event-bus/GuardDuty-EventBus arn:aws:iam::xxxxxxxxxxxx:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus
GuardDuty-Event-ap-south-1
Target1 arn:aws:events:ap-northeast-1:xxxxxxxxxxxx:event-bus/GuardDuty-EventBus arn:aws:iam::xxxxxxxxxxxx:role/service-role/Amazon_EventBridge_Invoke_GuardDuty-EventBus
 :

⑤セキュリティレベルがHIGHの検出だけを通知するルールの作成(東京リージョン)

作成したイベントバスを指定し、ルールの作成を押下します。

任意でルールの名前を設定し、次へを押下します。

今回は、GuardDuty-Severity-Notifications にしました。

カスタムパターンを選択し、以下のJSONを貼り付け、次へを押下します。

{
  "source": ["aws.guardduty"],
  "detail-type": ["GuardDuty Finding"],
  "detail": {
    "severity": [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]
  }
}

SNSのトピック設定し、次へを押下します。

◆補足
GuardDutyの検出結果をメールで受け取る場合、そのままでは見づらいため、以下の設定をお勧めいたします。
(ChatBotに連携する場合、特に対応不要です。)

入力トランスフォーマーの設定を押下します。

入力パスを設定します。

{ 
  "severity": "$.detail.severity", 
  "Account_ID": "$.detail.accountId",
  "region": "$.region",
  "Finding_ID": "$.detail.id", 
  "Finding_Type": "$.detail.type", 
  "Finding_description": "$.detail.description" ,
  "eventFirstSeen": "$.detail.service.eventFirstSeen", 
  "eventLastSeen": "$.detail.service.eventLastSeen", 
  "count": "$.detail.service.count"
}

テンプレートの設定を行い、確認を押下します。

"重要度 <severity> のGuardDuty結果が発生しました。"
"アカウントID: <Account_ID>"
"リージョン: <region>"
"ID: <Finding_ID>"
"タイプ: <Finding_Type>"
"説明: <Finding_description>"
"初回発生日時: <eventFirstSeen>" 
"最新発生日時: <eventLastSeen>"
"発生数: <count>"
"詳細: https://<region>.console.aws.amazon.com/guardduty/home?region=<region>#/findings?macros=current&search=id%3<Finding_ID>"

タグ設定も次へを押下し、レビューと作成を確認後、ルールの作成を押下します。

⑥動作確認

GuardDutyの画面に移動し、検出結果サンプルの生成を押下します。

以下のようにサンプルの検出結果が生成されます。

設定した通知先に通知が届いていることを確認します。

メールの場合

Slackの場合

終わりに

今回は、全リージョンのGuardDutyの検出結果を通知する設定をブログに記載いたしました。 実際に運用しており、GuardDutyの非常に役に立つと感じているため、是非有効化と通知設定をしていない方がいましたら、ご検討いただくと良いかと存じます。

福島 和弥 (記事一覧)

SRE3課

2019/10 入社

AWS CLIが好きです。