GuardDutyとDatadogを連携してみた!
こんにちは。最近髪色がピンクになったhiropyです。
さて今回は、「GuardDutyとDatadogを連携してみた!」ということで、Amazon GuardDutyとDatadogを連携し、Datadog上で、GuardDutyが検知した異常のモニタリングを行う手順について記載していこうと思います。
他リソースについてDatadogを使用して監視している場合は、この方法を用いることで監視基盤を統一することができます!
前提
AWSアカウントとDatadogの連携が済んでいること。
未実施の場合はこちらを参考にAWSアカウントとDatadogの連携を実施してください。
手順
1. LogForwarderのデプロイ
すでにLogForwarderを作成済みの場合はスキップしてください。
こちらの手順を参考に、AWSからDatadogにログを送信するためのLambdaをデプロイすします。
Datadogの APIキーが必要になるので、事前に手元に用意しておいてください。
GuardDutyが適用されているAWSアカウントを開いた状態で、先ほどのページの「Launch Stack」ボタンをクリックします。
するとCloudFormationのスタックデプロイ画面に遷移するので、DdApiKey
にDatadogのAPIキーを入力し、他は特に変更せず「スタックの作成」を実施します。(数分で終わります)
2. EventBridgeルールの作成
GuardDutyで異常を検知した際にLambdaを呼び出すためのルールを作成します。
まずは、EventBridgeコンソールを開いてルールの作成に進んでください。
- ルール名は任意のものにします。
- Event sourceセクションで、
AWS events or EventBridge partner events
を選択してください。 - Event patternでは、以下のように選択してください。
- ソース:
AWS services
- サービス:
GuardDuty
- タイプ:
GuardDuty Finding
- ソース:
ターゲットで、先ほど作成したLogForwarderを指定します。
任意でタグをつけて、ルールの作成を実施します。
3. Lambdaのトリガーを追加する
Lambda関数のトリガーに先ほど作成したルールを追加していきます。
Lambdaコンソールで1. で作成したLogForwarder関数を開き、トリガーを追加ボタンをクリックします。
2.で作成したEventBridgeイベントを選択し、トリガーを追加します。
ここまでで事前準備は完了です。次の章で、実際にDatadog上でモニタリングするための準備をしていきましょう。
4. GuardDutyのイベントを発生させる
ここからは、実際にGuardDutyのイベントを発生させて、Datadog上でモニタリングできるようにしていきます。
サンプルイベントを発生させる
お客様の環境で実施する場合や、実際のイベントを発生させたくない場合は、GuardDutyのサンプルイベントを発生させることができます。
この手順ではAWS CLIを使用します。
まず、GuardDutyの操作が可能な権限を持つIAMユーザをAWS CLIで使用するユーザとして設定し、以下のコマンドを実行してください。
aws guardduty create-sample-findings \
--detector-id $(aws guardduty list-detectors --query 'DetectorIds' --output text) \
--finding-types Impact:EC2/PortSweep
なお、上記コマンドのImpact:EC2/PortSweep
がGuardDutyのイベント名ですので、ここを任意のイベントに変更することで別のサンプルイベントを発生させることができます。
イベント名についてはこちらを参照してください。
実際のイベントを発生させる
お客様環境で実施する場合は、GuardDutyのレベル高のイベントとして検知されるので十分注意してください。
guardduty-tester.template (28.1 kB)
まずは上記ファイルをダウンロードしてください。このファイルで、GuardDutyの実際のイベントを発生させるためのCloudFormationスタックを作成します。
続いてEC2のキーペアを作成します。スタックを作成するときにこれが必要になりますので、事前に作成しておきます。
作成が完了した後、手元にpemファイルをダウンロードしますが、その際pemファイルの権限を修正しておきましょう。
chmod 600 guardduty-tester-key.pem
ここまで完了しましたら、先ほどダウンロードしたテンプレートファイルからCloudFormationスタックを作成します。
この時入力値でキーペアを選択する箇所があるので、先ほど作成したキーペアを選択します。
このスタックのデプロイが完了すると、EC2インスタンスが複数デプロイされます。
デプロイが完了したら、手元の.ssh/configに変更を加えます。
config内に、以下の行を追加してください。
Host bastion
StrictHostKeyChecking no
HostName xx.xx.xx.xx # ここにLinuxBastionのIPアドレスを書く
User ec2-user
IdentityFile ~/.ssh/test-key-hiropy.pem # ここに生成したキーペアファイルのパスを書く
Host tester
StrictHostKeyChecking no
ForwardAgent yes
HostName 172.16.0.30 # ここにRedTeamのPrivateIPを書く
User ec2-user
IdentityFile ~/.ssh/test-key-hiropy.pem # ここに生成したキーペアファイルのパスを書く
ProxyCommand ssh bastion nc %h %p
ServerAliveInterval 240
ファイル内でLinuxBastion
と書かれているのは、先ほどテンプレートファイルでデプロイしたCloudFormationスタックによって作成されたEC2インスタンスです。
EC2コンソール上で上記名前で検索するとインスタンスが表示されますので、Public IPアドレスをconfig内に記載してください。
RedTeam
も同様にEC2インスタンス名ですが、こちらはPriivate IPを記載してください。
ファイルを修正したら、テスト対象のインスタンスにssh接続します。
ssh tester
テスト用のインスタンス内にあるguardduty_tester.sh
の内容が一部間違っているので修正します。
viでファイルを開き、以下の箇所を、
source localIps.sh
以下の通り修正してください。
source ./localIps.sh
修正が完了しましたら、以下のコマンドを実行してGuardDutyに異常を検知させます。
sh guardduty_tester.sh
6つのテストケースが実行されます。
テストイベント、実際のイベント、どちらを発生させた場合でも、実施後にDatadogの「Logs」でイベントが検出されていることを確認してください。
5. Datadogのモニターを作成する
Logsの画面でログが検出されていることが確認できましたら、モニターの作成に移ります。
Datadogコンソールを開き、左メニューから「Monitors」を選択、「New monitor」をクリックします。
モニタータイプの選択画面では、「Logs」を選択します。
クエリの入力箇所でsource:guardduty
、by(グループ化する単位の選択)のところでevent
と入力し、Event Name
を選択します。
これで、発生するイベントごとにグループ化したGuardDutyのモニターが作成できます。
生成されるクエリは以下のようになります。
logs("source:guardduty").index("*").rollup("count").by("@evt.name").last("5m") >= 1
通知メッセージなどは任意のものを入力して、モニターを作成してください。
なお、メッセージを以下のようにすることで、メッセージ内に検知したイベント名を含めることができます。
GuardDuty で異常を検知しました。イベント名は{{[@evt.name].name}} です。 @Slackの通知先
イベントを検知するのに5分ほど時間がかかるため、しばらく待ちます。
モニター上で、以下のように発生したイベントを検知していればOKです!
おわりに
いかがでしたでしょうか?
意外と簡単に実現できますので、ぜひ本記事をご活用いただけますと幸いです。