Sumo LogicにGuardDutyのログをS3から取り込む方法

通常Sumo LogicにGuardDutyのログを取り込む場合には、CloudWatch Logsからログを送信するためのAWS Lambdaを建てないとなりません。ですがS3バケットからログを収集させる方法もあります。これについて手順をご説明します。
2020.06.04

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

Sumo LogicはAmazon GuardDutyのログを取り込んでダッシュボード表示させる機能があります。
しかし公式には、CloudWatch Logsから収集する方法しか書かれていません。

sumologic-guardduty-events-processor 公式より

このやり方を使うためには、Sumo GuardDuty events processor というAWS Lambda関数をデプロイして、CloudWatch Events経由でSumo Logicに送信する必要があります。
AWS Serverless Application Repository からデプロイできるので手軽ではありますが、管理するリソースも増えますし、導入にハードルを感じる方もいらっしゃるんじゃないでしょうか。

一方で皆さんご存じのように、GuardDutyにはログをS3に記録する設定が可能です。
この仕組みを使って、S3バケットに保存されたGuardDutyのログをSumo Logicに取り込むことももちろん可能です。以下、その手順をご説明します。

前提

以下の手順は完了しているものとします:

  • GuardDutyのログをS3に保存する設定

もしまだだという場合は、下記ブログに手順が説明されていますので参考にしてください。

なお、GuardDutyのログがS3バケットにエクスポートする間隔は、デフォルトだと 6h です。これは 15min 間隔に変更できますので、可能なら変更しておくとよいでしょう。

手順

大きく、下記の流れになります:

  1. Sumo Logic上に、HTTPコレクタを追加する
  2. Sumo Logicから該当S3バケットにアクセス出来るようIAMロールを設定する
  3. GuardDuty保存時に使用しているKMSの権限を編集しSumo Logicからアクセス出来るようにする
  4. 上で作成したHTTPコレクタ内に、GuardDuty用に設定あれたHTTPソースを追加する

1. Sumo Logic上に、HTTPコレクタを追加

ここはSumo Logicの基本的な使い方になりますので大丈夫でしょうか。
特に気にする必要のある項目もないため、普通にHTTPコレクタを作成して下さい。既存のものをそのまま使っても構いません。

  • サイドバーのManage Data / Collection > Add Collector
  • Hosted Collectorをクリック
  • 必須フィールド Name を指定

作成する場合は以下のドキュメントを参考にして下さい。

2. IAMロールを設定

こちらも基本的なところと変わりません。次の「HTTPソースを設定」する手順のなかでCFnテンプレートが提示されるので、そちらのテンプレートを使って作成してもよいでしょう。
すでに該当AWSアカウント上に既存のIAMロールがあるのであれば、そちらに許可リソースとしてS3バケットを追加してください。

IAMロールのARNはKMSのポリシーやHTTPソースに設定するので、控えておくようにしましょう。

3. KMSの権限変更

GuardDutyのログは、保存する際に暗号化されます。
そのためのキーはKMSで管理されているため、そちらにSumo Logicの利用権限(kms:Decrypt)を与えます。

使われているキーは、GuardDutyの設定を確認すればわかりますね。そこからKMSのコンソールを開くことも可能です。

追加した部分は以下です。

        ,{
            "Sid": "SumoLogic",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<Sumo Logic用IAMロールのARN>"
            },
            "Action": "kms:Decrypt",
            "Resource": "*"
        }

4. HTTPソースを設定

HTTPソースを追加します。Collection画面の該当HTTPコレクタのところにある「Add Source」をクリックします。

そしてソースタイプとして、Amazon S3 をクリックして下さい(S3 Auditではありません)。

必要な箇所を埋めていきます。
ここに記載していない項目はデフォルトのままとします。

  • Name ... 必須です。128文字以内でわかりやすい名前を付けて下さい。
  • Description ... 任意です。
  • S3 Region ... 対象のS3バケットが存在するリージョンを指定します。
  • Bucket Name ... GuardDutyのログを出力しているバケット名を記述します。
  • Path Expression ... ログファイルを指定します。該当S3バケット内にある全てが対象であれば * とか、あるいは AWSLogs/*.jsonl.gz のような指定で問題ないと思います。
    • Collection shud begin ... 初回はいつからのログを収集するかを指定します。
  • Source Category ... ソースカテゴリを指定します。prod/aws/guarddutyとか適切なものを付けて下さい。

AWS Access :

  • Access Method ... Role-based access を選択します。
    • Generate role-based access template をクリックすると、IAMロール作成のためのCFnテンプレートが生成されます。上の 2. の手順の参考にして下さい。
  • Role ARN ... 2. で作成・修正したIAMロールのARNを指定します。CFnテンプレートで作った場合 arn:aws:iam::(AWSアカウント名):role/SumoRole-SumoRole-XXXXXXXX みたいな感じになると思われます。

Log File Discovery :

  • Scan Interval ... 通常は Automatic のまま使います。

SNSサブスクリプションの部分は任意です。
S3バケットの更新をCloudWatch Eventsで受け取る場合に使いますが、今回の場合、そうするくらいだったら最初からS3じゃなくてCloudWatch Logsで受信すれば?って思えてくるので、Recommendedと書いてありますがここはぐっとこらえることにします。

Advanced Options for Logs :

  • Timestamp Format ... 下記ドキュメントの Step 1 にあるように、Specify a format を選択肢、FormatTimestamp locator を下記のように指定します。これをしておかないと、収集されたログのタイムスタンプが全部「収集された時刻」となってしまいますので、忘れずに指定しましょう。
    記号含めドキュメントからそのままコピペしてください(前後の空白はお気を付け下さい)。
項目 内容
Format yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
Timestamp locator .*"updatedAt":"(.*)".*
  • Enable Multiline Processing ... 特に記載はないですが、 Detect messages spanning multiple lines のチェックは外してもいいでしょう。気になるようであれば残しておいて問題ありません。

問題がなければ Save をクリックして下さい。 例えば権限問題などでログが収集できない場合は、上部にエラーメッセージが表示されるので、いまいちど確認してみて下さい。

確認とApp適用

該当のログが取り込まれているか、Log Searchで確認できます。
検索可能になるまでに時間がかかる場合もあるので、出力されないというときはしばらく待ってみたり、HTTPコレクタの取り込み量グラフが反応しているかどうか確認するなどしてみてください。

「そもそもGuardDutyのログがないよ!」

という場合には、結果サンプルの生成を実行するのがもっともお手軽です。試してみるとよいでしょう(既に通知する仕組みを整えている場合は、通知先が驚かないようにご注意下さい)。

ログが取得できたら、あとはAppを被せるだけ(?)です。
以下のようなAppがありますので、いろいろとお試し下さい(GI for GuardDutyはEnterpriseプランのみ)

まとめ

AWS Lambdaを建てることなくAmazon GuardDutyのログをSumo Logicに取り込む方法をまとめました。

一番ラグのないよい方法は公式にあるように、CloudWatch LogsからEvent経由で取り込むことですが、GuardDutyのログはSumo Logicでみたい、でもAWS Lambdaは建てたくない、そんな時にご活用下さい。