GuardDutyからのイベント通知をちょっと見やすくして通知する

2021.02.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサルティング部の鈴木(純)です。

SNSからのメールでGuardDutyのイベントを通知させることって結構あると思うのですが、デフォルトだと生のJSONが出力されるのでかなり見辛いです。サンプルイベントを発行してみるとこんな感じでメールが通知されます。ちょっと情報量が多くて整形しないと見るのがしんどい…

それをちょっと見やすくしたいな〜と思った時は以下で紹介されている方法を使うと、いい感じにしてくれます。

どんな感じになるの?

ちょっと見辛いですが、こんな感じになります。

かなり文章量が減って、見やすくなったかと思います。

※サンプルイベントの適当な通知を拾っているので、先ほどの検知内容とは違います。

主に取得している内容は、severityAccount_IDFinding_IDFinding_TyperegionFinding_descriptionの項目です。

この情報からある程度の検知した内容や、リージョン、重要度を把握することができます。

URLをクリックすると、こんな感じに検知したイベントがフィルタされた状態で表示されるので、詳細をすぐに確認することができたりするので結構便利。

実装方法

実装は非常に簡単です。前提としてGuardDuty→EventBridge→SNSの経路でメール通知ができている環境を想定しています。

EventBridgeに入力トランスフォーマーを設定する

GuardDutyのイベントを取得するEventBridgeのルールを編集して以下のような設定を行います。

上段(入力パス)

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

下段(入力テンプレート)

"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://<region>.console.aws.amazon.com/guardduty/home?region=<region>#/findings?search=id%3D<Finding_ID>&macros=current"

上記のように入力して保存すれば、設定は完了です。これで先ほどと同じメールの内容で通知をすることができます。とっても簡単。

ほとんど公式で例になっている入力テンプレートを使用していますが、一部URL部分だけフィルタリングした状態で遷移するように書き換えてます。

先ほどの整形後のメール通知をしたい場合にはこれで完了です。

通知内容を変更したい場合

もう少し元のイベントの情報から欲しい情報を追加したい場合ですが、入力パスに欲しい情報を取得するように書き換えてあげましょう。

例えば、「何のリソースに関する検知内容なのか」をもう少し知りたい場合を例にしてみます。

GuardDutyイベントが以下のような時、検知したresourceTypeAccessKeyであるという情報も追加で通知させたいとします。

{
    "version": "0",
    "id": "79f014d7-8395-9b40-caae-776d9891ccfb",
    "detail-type": "GuardDuty Finding",
    "source": "aws.guardduty",
    "account": "11111111111",
    "time": "2021-02-05T01:40:04Z",
    "region": "ap-southeast-2",
    "resources": [],
    "detail": {
        "schemaVersion": "2.0",
        "accountId": "11111111111",
        "region": "ap-southeast-2",
        "partition": "aws",
        "id": "b8bbb598e95e06589b69826ba5b10dd1",
        "arn": "arn:aws:guardduty:ap-southeast-2:914661484899:detector/3ebb2345d24f5445a5a5b689a55da95a/finding/b8bbb598e95e06589b69826ba5b10dd1",
        "type": "PenTest:IAMUser/ParrotLinux",
        "resource": {
            "resourceType": "AccessKey",
            "accessKeyDetails": {
                "accessKeyId": "GeneratedFindingAccessKeyId",
                "principalId": "GeneratedFindingPrincipalId",
                "userType": "IAMUser",
                "userName": "GeneratedFindingUserName"
            },

その場合は入力パスにResource_Type追加してあげましょう。形式としてはValueに$.から下の階層を指定していくだけです。

{
    "severity": "$.detail.severity",
    "Account_ID": "$.detail.accountId",
    "Finding_ID": "$.detail.id",
    "Finding_Type": "$.detail.type",
    "Resource_Type": "$.detail.resource.resourceType",
    "region": "$.region",
    "Finding_description": "$.detail.description"
}

注意点として入力パスで指定できるのは10個までと制限があるため、それ以上細かい情報の編集がしたい場合はLambdaを使う必要があります。

GuardDutyではないですが、SecurityHubの検知内容をLambdaで整形して通知させている記事があったので、こちらをみるとイメージしやすいと思います。

これで元のイベントから必要なResource_Typeの値を取得することができたので、メール通知させる本文(入力テンプレート)に情報を追加します。

"AWS <Account_ID> has a severity <severity> GuardDuty finding type <Finding_Type> in the <region> region."
"Resource_Type:<Resource_Type>"
"Finding Description:"
"<Finding_description>. "
"For more details open the GuardDuty console at https://<region>.console.aws.amazon.com/guardduty/home?region=<region>#/findings?search=id%3D<Finding_ID>&macros=current"

<>の中に先ほど入力パスで指定したResource_Typeを指定することで、値を展開することができます。

実際にメール通知させてみると、問題なくResource_Type:AccessKeyが表示されました。

そこまで手間をかけずに見やすい形に整形することができるので、是非GuardDutyイベントをメールで通知している方は試してみて下さい。

ご参考