Amazon Route 53 Resolver DNS Firewall 検証

　こんにちは。弁護士ドットコム SRE 室のテイです。
　今年（2021年）3 月にリリースされた Amazon Route 53 Resolver DNS Firewall を検証してみました。　

# DNS Firewall とは
　DNS Firewall は VPC からのアウトバウンド DNS リクエストを保護するサービスです。保護方法は以下のとおりです。

- 特定のドメイン名以外の名前解決をさせない
- 不良と判別されているドメイン名の名前解決をさせない

# 作成手順
　Route 53 Resolver DNS Firewall という名前ですが、作成は **Route53** ではなく、**VPC** のコンソールからです。

　VPC コンソール画面で「DNS FIREWALL」→「ルールグループ」→「ルールグループを作成」の順でクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/fe5a5d7f-13e2-9b1c-92d7-942a32f04493.png)

　ルールグループの名前を記入して、「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/b3dbcde5-6241-e1d7-1b9e-5e01f266ad4e.png)

　「ルールを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/ed740fa9-b7a4-0cd2-d008-fbe1a880ba7f.png)

　ルール追加画面でルールの名前を記入します。

　ドメインリストで「独自のドメインリストを追加」と「AWS マネージドドメインリストを追加」を選択できます。
　今回は検証するため、「独自のドメインリストを追加」を選択します。
　「新しいドメインリストを作成」を選択して、ドメイン名を記入して、ブロックしたいドメイン名を記入します。検証のため、www.google.co.jp をリストに入れました。
　今回は対象ドメインをブロックするため、Action では BLOCK を選択します。

- ALLOW：ドメインリストにあるドメインへのアクセスを許可する
- BLOCK：ドメインリストにあるドメインに対する名前解決できないようブロックする
- ALERT：アクセスを許可するけれど、DNS クエリログではアラートとして記録される

　ルールを追加した後、**「Next」ではなく、「ルールを追加」ボタンをクリックします**。間違って「Next」をクリックすると、設定したルールが追加されず、次の画面に行ってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/86812c00-2278-a730-cf18-6786f36ae524.png)

　ちなみに、以下の2つが AWS からマネージドドメインリストとして提供されています。

- AWSManagedDomainsMalwareDomainList（既知のマルウェアの通信先ドメインのリスト）
- AWSManagedDomainsBotnetCommandandControl（既知のボットネットの Command & Control サーバのドメインのリスト）

　どのようなドメインがこれらに含まれているか公表されてはいませんが、本番運用の時にマネージドドメインリストを利用するのが良いでしょう。

　上記の画面で「ルールを追加」ボタンをクリックして、設定されたルールが追加されました。この画面で「Next」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/1f657d6a-d3fa-e0f0-d88a-6388e7c0f92e.png)

　複数ルールがある場合、優先度を設定し、「Next」をクリックします。
　最後、タグの設定画面と確認画面がありますが、省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/aeda874a-7217-3429-4978-ac7823b1b0ac.png)

　ルールグループを作成した後、VPC と関連付けます。
　対象ルールグループを選択して、下にある「関連付けられた VPC」をクリックして、「VPC を関連付け」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/aa55937a-e33a-98b3-4591-e91af4728c50.png)

　対象 VPC と関連付けた後、しばらくすると、ステータスが「完了」になりまして、DNS Firewall が動作し始めます。
![スクリーンショット 2021-06-08 14.32.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/bcc19b7f-de69-3b20-c582-740923860d67.png)

# 動作確認
　ルールグループと関連付けられた VPC 内で EC2 インスタンスを起動して、www.google.co.jp へアクセスしてみます。今回は `curl`と`nslookup`コマンドでテストしてみました。

　「ルールを追加」画面で、BLOCK アクションを選択すると、NODATA、NXDOMAIN、OVERRIDE 3つからどのように応答するかが設定できます。それぞれをテストしてみます。

## NODATA
　NODATA はクエリは成功したが、当該クエリについて利用可能な応答がないという結果になります。
　NODATA に設定すると、 curl によるアクセスは対象ドメイン名の名前解決ができず、ちゃんとブロックされました。また、`nslookup` では `No answer` が表示されました。

``` bash
$ curl -v www.google.co.jp
* Rebuilt URL to: www.google.co.jp/
* Could not resolve host: www.google.co.jp
* Closing connection 0
curl: (6) Could not resolve host: www.google.co.jp

$ nslookup www.google.co.jp
Server:         10.50.0.2
Address:        10.50.0.2#53

Non-authoritative answer:
*** Can't find www.google.co.jp: No answer
```

## NXDOMAIN
　NXDOMAIN はクエリ内のドメイン名が存在しないという結果になります。
　NXDOMAIN にする場合、curl の結果は同じになるのですが、`nslookup` を実行すると、`NXDOMAIN` が表示されることが分かります。

```bash
$ nslookup www.google.co.jp
Server:         10.50.0.2
Address:        10.50.0.2#53

** server can't find www.google.co.jp: NXDOMAIN
```

## OVERRIDE
　OVERRIDE はクエリに対するカスタムオーバーライドの応答を提供します。
　ルールの編集画面で、「OVERRIDE」を選択して、当社が利用している情報共有サービス [esa.io](http://esa.io/) のドメインをオーバーライド用ドメインとして記入し、レコードタイプは CNAME を選択します。（CNAME しか選択できません）
![スクリーンショット 2021-06-08 16.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260895/c02a0edc-8bcc-394d-2c3a-56de064185de.png)

　`curl` を実行して、301 になりまして、リダイレクトされたことが分かります。

```bash
$ curl -v www.google.co.jp
* Rebuilt URL to: www.google.co.jp/
*   Trying 54.199.**.**...
* TCP_NODELAY set
* Connected to www.google.co.jp (54.199.**.**) port 80 (#0)
> GET / HTTP/1.1
> Host: www.google.co.jp
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Server: awselb/2.0
< Date: Tue, 08 Jun 2021 07:18:49 GMT
< Content-Type: text/html
< Content-Length: 134
< Connection: keep-alive
< Location: https://www.google.co.jp:443/
<
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>
* Connection #0 to host www.google.co.jp left intact
```

　`nslookup` コマンドでも確認してみます。 www.google.co.jp に対するクエリには [team 名].[esa.io](http://esa.io/) の Public IP が返ってきています。

```bash
$ nslookup www.google.co.jp
Server:         10.50.0.2
Address:        10.50.0.2#53

Non-authoritative answer:
www.google.co.jp        canonical name = [team 名].esa.io.
Name:   [team 名].esa.io
Address: 52.194.**.**
Name:   [team 名].esa.io
Address: 54.199.**.**
```

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