まえがき

cloudpack 木村(富)です。

Amazon GuardDutyの検出結果をAmazon S3バケットにエクスポートする手順を紹介させていただきます。
この手順では以下のAWSサービスを利用することになります。

・Amazon GuardDuty
・Amazon S3
・AWS Key Management Service

複数のサービスを利用するのでどのように設定したらよいか分かりずらかったので実際に試してみました。

■Amazon GuardDutyの設定について

本記事はAmazon GuardDutyが有効化されている状態として記載致します。

Amazon GuardDutyの有効化の詳細については下記記事をご参照ください。
有効化、無効化、一時停止、注意事項などが記載されております。
本記事では割愛させていただきます。

Amazon GuardDutyを有効化する前に知っていただきたいこと

本文

■Amazon GuardDutyの検出結果をAmazon S3バケットにエクスポートするための設定手順

以下の手順で作成、設定できましたので参考にしてみてください。
AWSサービスをまたぐのでそれぞれ順番通りに設定されますとよろしいかと思われます。

注記
KMS キーと Amazon S3 バケットのAWS リージョンは同じである必要があります。

Exporting generated GuardDuty findings to Amazon S3 buckets

今回は3種サービスとも同じ東京リージョンを利用しています。

【手順】
① Amazon GuardDuty用のAmazon S3バケットを作成してください。
S3バケット名は任意に設定してください。
その他設定についてはデフォルトでも構いません。用途に合わせて設定してください。

本例ではS3バケット名を guardduty-s3-ap-northeast-1  としております。

② Amazon GuardDuty用のAWS Key Management Serviceを作成してください。 

  1. ステップ1 <キーを設定>
    こちらはデフォルトでも構いません。用途に合わせて設定してください。
  2. ステップ2 <ラベルを追加>
    エイリアス(キーの表示名)は任意に設定してください。
    本例では kms-GuardDuty-S3 としています。
  3. ステップ3 <キーの管理アクセス許可を定義>
    [キーの管理アクセス許可を定義] こちらはこのタイミングでは設定しないでください。
    AWS Key Management Service のキーIDを先に取得した方が楽なので後ほど設定します。
    [キーの削除] は任意に設定してください。
  4. ステップ4 <キーの使用法アクセス許可を定義>
    [キーの使用法アクセス許可を定義] こちらはこのタイミングでは設定しないでください。
    ※こちらも同様に後ほど設定します。
  5. ステップ5 <確認>
    一旦ここまでで問題なければ[完了]でカスタマーキーを作成してください。

Amazon S3バケットのARNをコピーして控えてください。

AWS Key Management Service のARNをコピーして控えてください。

⑤ 上記③、④で控えたARNをAmazon GuardDutyの[設定]にある[検出結果のエクスポート設定を編集]に貼り付けてください。
すると[ポリシーをアタッチ]にある[S3バケットのポリシーを表示]と[KMSキーのポリシーを表示]の2つがグレーアウト状態からボタン押下できるようになります。

⑥ [S3バケットのポリシーを表示]を押下してください。
S3バケットポリシーが表示されるのでこちらを全てコピーしてください。

⑦ 上記⑥でコピーしたバケットポリシーをAmazon S3の[バケットポリシーを編集]でそのまま設定してください。

Amazon GuardDuty の[検出結果のエクスポート設定を編集]画面に戻り、次は[KMSキーのポリシーを表示] を押下してください。
こちらは残念ながらS3のバケットポリシーのようにコピー&ペーストのみでは設定できません。
このKMSキーのポリシーが最もややこしい部分になります。

  1. まず手順通り、[KMSキーのポリシーを表示]で表示されたKMSキーポリシーをコピーしてください。
  2. そしてAWS Key Management Service の作成したカスタマーキーのキーポリシーとくっつけてください。

言葉のみで記載すると上記の通りとなりますが分かりにくいので参考ポリシーを記載します。
AWSアカウントIDGuardDutyのディテクター IDは置き換えてください。

[KMSキーのポリシーを表示]

{
  "Sid": "Allow GuardDuty to encrypt findings",
  "Effect": "Allow",
  "Principal": {
    "Service": "guardduty.amazonaws.com"
  },
  "Action": "kms:GenerateDataKey",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:SourceAccount": "AWSアカウントID",
      "aws:SourceArn": "arn:aws:guardduty:ap-northeast-1:AWSアカウントID:detector/GuardDutyのディテクター ID"
    }
  }
}

[AWS Key Management Service で上記手順②で作成した際のデフォルトポリシー]

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AWSアカウントID:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }
    ]
}

この2つのポリシーを足してください。
すると以下のようなポリシーになります。

{
    "Version": "2012-10-17",
    "Id": "key-consolepolicy-3",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AWSアカウントID:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow GuardDuty to encrypt findings",
            "Effect": "Allow",
            "Principal": {
                "Service": "guardduty.amazonaws.com"
            },
            "Action": "kms:GenerateDatakey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "AWSアカウントID",
                    "aws:SourceArn": "arn:aws:guardduty:ap-northeast-1:AWSアカウントID:detector/GuardDutyのディテクター ID"
                }
            }
        }
    ]
}

上記ポリシーをAWS Key Management Service の[キーポリシーの編集] に設定して[変更の保存]を押下してください。
するとキーポリシータブが以下のような表示になります。

Amazon S3バケットポリシーとAWS Key Management Service のカスタムキーポリシーを設定した状態でAmazon GuardDutyの[検出結果のエクスポート設定を編集]にある[保存]を押下してください。

⑩ この時点でAmazon S3の対象バケット内に[AWSLogs]が作成されていたら成功です。

設定手順は以上のようになります。
参考になりましたら幸いです。

それでは次は実際に検出結果を出力してみましょう。

■ Amazon GuardDutyで実際に検出結果をエクスポートして中身を確認する方法

実際にどのように検出されるかサンプルを生成する機能がAmazon GuardDutyにあります。
その機能を使用して実際にどのように検出し、ログが生成されるか確認します。

Amazon GuardDuty の[設定]にある[検出結果のサンプル]の[検出結果サンプルの生成]を押下します。
※こちらのボタンを押下した直後にサンプルが生成されます。ポップアップ画面はありません。

Amazon GuardDuty の[検出結果]を表示してください。
以下のようにタイトルに[例]と記載されているものが多数表示されています。

③ Amazon S3バケットを確認してください。
以下のように設定した S3バケット名>AWSLogs/>AWSアカウントID>GuardDuty/>リージョン>検知年>検知月>検知日 のフォルダが作成され、中にファイルが作成されます。

新しい S3 バケットを作成するか、アカウントの既存のバケットを選択するときに、オプションのプレフィックスを追加できます。
検出結果のエクスポートを設定すると、GuardDuty は検出結果の S3 バケットに新しいフォルダを作成します。
プレフィックスは、GuardDuty が作成したデフォルトのフォルダ構造に追加されます。
例えば、オプションのプレフィックスの形式は /AWSLogs/123456789012/GuardDuty/Region です。

S3 オブジェクトのパス全体は amzn-s3-demo-bucket/prefix-name/UUID.jsonl.gz になります。
UUID はランダムに生成され、ディテクター ID または検出結果 ID を表すものではありません。

ステップ 4 – 結果を S3 バケットにエクスポートする (コンソール)

確認方法は以上になります。

ですが、このAmazon GuardDuty の[検出結果]は90日間保持されます。今の所この90日間の保持期間を変更することはできません。
そのため実際に運用しようとする場合、今度は邪魔になると思います。その場合、以下の方法にて直ぐに削除できます。
S3 に生成されたファイルは残りますので不要でしたら削除してください。

Amazon GuardDuty の[検出結果] をリセットする方法

ただし、この方法はAmazon GuardDutyの使用状況や設定についてもリセットされます。
そのため、Amazon GuardDutyの[設定]にある[検出結果のエクスポート設定を編集]画面の再設定と、ディテクターIDが変更されるのでAmazon S3とAWS Key Management Service のポリシー修正が必要になります。

Amazon GuardDutyの有効化、無効化については Amazon GuardDutyを有効化する前に知っていただきたいこと に記載しておりますので詳細はそちらをご覧ください。

Amazon GuardDuty を無効にしてください。

Amazon GuardDuty を再度有効にしてください。

Amazon GuardDuty の[検出結果] が消えています。

④ Amazon GuardDuty の[設定]より[検出結果のエクスポート設定を編集]画面にてS3バケットARNとKMSキーARNを入力します。そして[保存]を押下すると以下のようなエラーが表示されます。

The request failed because the GuardDuty service principal does not have permission to the KMS key or the resource specified by the destinationArn parameter. Refer to https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html
(訳)
GuardDuty サービスプリンシパルに、destinationArn パラメータで指定された KMS キーまたはリソースへのアクセス許可がないため、リクエストは失敗しました。https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_exportfindings.html を参照してください。

このエラーの理由はAmazon GuardDutyを無効化から有効化するとディテクターIDが変更されることが原因になります。
ディテクターIDを再設定するため、引き続き以下の手順を行なってください。

Amazon GuardDuty の[設定]にあるディテクターIDをコピーしてください。

Amazon S3バケットの[アクセス許可]にある[バケットポリシー]のディテクターIDを編集画面にて更新してください。本手順では2ヶ所あります。

⑦ AWS Key Management Service のキーポリシー内にあるディテクターIDを編集画面にて更新してください。本手順では1ヶ所あります。

Amazon GuardDuty の[設定]より[検出結果のエクスポート設定を編集]画面に戻り、保存を押下してください。

以下が表示されれば成功です。

まとめ

本件の手順はAWSドキュメントにも記述されています。
しかしながら、画面などが無いためかなり読み込まないとわかりにくいと思います。
一旦作成した後にAWSドキュメントを読み返してみると内容がよくわかるようになりました。
もしも、まず一度試してみたいと思われましたら実際に利用されないリージョンでお試しいただくと30日の無料トライアル期間を無駄に使用せず確認できるかと思います。
本記事が参考になりましたら幸いです。

<参考ドキュメント>
生成された GuardDuty 検出結果を Amazon S3 バケットにエクスポートする