Route53 クエリログの監視

　こんにちは。弁護士ドットコム SRE 室のテイです。

　前回は、[Amazon Route 53 Resolver DNS Firewall の検証](https://qiita.com/et_tei/items/2b8c86ebfff23efe3063)を紹介しましたが、今回はブロック対象のドメインへアクセスすることが検知され、Slack へ通知する監視設定を紹介させていただきます。


# Route53 クエリログの設定
　まず、クエリログを有効するよう設定します。
　Route53 のコンソール画面で、「クエリのログ記録」→「クエリログ記録の設定」の順でクリックして、設定名を記入します。
![スクリーンショット 2021-06-11 15.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/5cf7b2b3-e2c0-05f4-4fd3-b7e124295bf7.png)

　次はクエリログの転送先を設定します。今回は Lambda 関数を利用して、Cloudwatch Logs のログを datadog へ転送するため、クエリログの転送先を Cloudwatch Logs を選択します。「Create log group」を選択して、グループの名前を記入します。
![スクリーンショット 2021-06-11 15.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/75b0c2b4-a92b-3501-3e7a-4adb9c686509.png)

　次は「VPC を追加」ボタンをクリックして、記録したい VPC を追加します。
![スクリーンショット 2021-06-11 15.02.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/138f4880-bc84-3043-9293-bc42a4be7e3f.png)

　最後、「クエリログの設定」ボタンをクリックして、設定を反映します。反映した後、JSON 形式のクエリログが記録されました。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/d8c99a6c-c838-c1c2-76f6-80b15dafd934.png)

# Lambda でログ転送
　クエリログの記録設定が完了した後、[Lambda 関数](https://github.com/DataDog/datadog-serverless-functions/blob/master/aws/logs_monitoring/lambda_function.py)で Datadog への転送設定を実施します。
　本記事は Lambda 関数が作成済の前提として紹介しますので、作成方法や IAM ロールの作成などを割愛させていただきます。

　作成済の Lambda 関数に下記のように、クエリログの Cloudwatch Log group を選択して、トリガーを設定します。
![スクリーンショット 2021-06-23 12.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/59d86448-587b-18cf-b002-e5e5da6ea137.png)

　すべてのクエリログを Datadog へ転送するのは無駄なので、DNS FireWall のアラートモードやブロックモードで検知されたログのみ、Datadog へ転送するようフォルターをかけます。
　前回 [DNS FireWall を動作確認](https://qiita.com/et_tei/items/2b8c86ebfff23efe3063#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)した時のログは以下の JSON 形式となるため、フォルターパターンは `{ $.firewall_rule_action = "ALERT" || $.firewall_rule_action = "BLOCK" }` となります。

``` json
{
    "version": "1.100000",
    "account_id": "54**********",
    "region": "ap-northeast-1",
    "vpc_id": "vpc-0172***********",
    "query_timestamp": "2021-06-11T06:17:16Z",
    "query_name": "www.google.co.jp.",
    "query_type": "A",
    "query_class": "IN",
    "rcode": "NOERROR",
    "answers": [],
    "srcaddr": "10.50.**.**",
    "srcport": "51923",
    "transport": "UDP",
    "srcids": {
        "instance": "i-012b2************"
    },
    "firewall_rule_action": "BLOCK",
    "firewall_rule_group_id": "rslvr-frg-d78************",
    "firewall_domain_list_id": "rslvr-fdl-de2e************"
}
```

# 監視設定
　Datadog で route53 のクエリログを収集するため、AWS インテグレーションで、`route53` をチェックする必要があります。収集されたログを Log Explorer で確認できます。
　また、監視や閲覧がわかりやすくするため、「QUESTION NAME」と「FIREWALL_RULE_ACTION」を `facet` として、登録しました。
![スクリーンショット 2021-06-23 14.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/346a0b82-fc4e-8dcc-1cbc-58d7feb022f0.png)

　ログを監視するため、`Logs` タイプの Monitor を選択します。
![スクリーンショット 2021-06-23 16.37.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/5607a5c8-47b7-7351-79ab-c7fa260b9549.png)

　検索クエリでは `service:route53` と `@firewall_rule_action:ALERT` を入れます。当社は**アラートモード**で運用しているため、`ALERT`のアクションのみ条件として設定されています。
　また、通知メッセージには検知されたドメイン名も表示させるため、`Question Name` でグループ化します。
![スクリーンショット 2021-06-23 16.28.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/60f91af2-5c11-1518-7959-be9925a3a53a.png)

　次はアラート条件を設定します。
![スクリーンショット 2021-06-23 16.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/c247a1bc-2476-d907-7b07-1ee6f6374e2a.png)

　最後、メッセージの文言と通知する Slack のチャンネルを設定します。
　ログもメッセージと一緒に Slack へ送らせるため、`Include a table of the top 10 breaching values` をチェックします。
![スクリーンショット 2021-06-23 16.30.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/f878edc5-e88a-db2f-1ecb-911f6f0abcb9.png)

　実際にアラートモードで対象ドメインへアクセスして、検知された時の通知結果はこちらです。
![スクリーンショット 2021-06-23 16.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/b486f5d7-e406-f560-bb68-8840c646d038.png)

　以上、DNS Firewall のクエリログの監視設定を紹介させていただきました。