Route 53 Resolver DNS Firewall を利用してみる
はじめに
忙しい事にかまけて、記事を全然書いていないことを反省したので、また記事を書き始めたいと思います。
今回は、タイトルにも記載した「Route 53 Resolver DNS Firewall」の機能紹介をしたいと思います。
公式ホームページは、以下を参照してください。
本記事の目標
Route 53 Resolver DNS Firewall の機能を理解する。
課題感
EC2 や WorkSpaces を構築する際、セキュリティグループでアウトバウンド通信をフルオープンされている方が多いのではないでしょうか。あるいは、ポート制限くらいはしているかもしれません。ただ、フルオープンにしていると例えば以下のような課題も出てきます。
- サーバや端末が不正アクセスで乗っ取られた場合、C&Cサーバなど不正なサーバとの通信を遮断できない
- WorkSpacesを利用している場合、ユーザーが内部不正を働いて外部ストレージを利用できてしまう
上記の解決策としては、以下が考えられるかもしれません。
No. | 解決策 | 問題点 |
---|---|---|
1 | 社内とVPNを接続して、社内のFirewall経由でインターネットに出るようにルーティング設定をし、Firewallで接続先制限を行う | VPNの費用が発生する |
2 | プロキシサーバをEC2で構築する | EC2の管理が面倒くさい |
3 | いっそのことアウトバウンド通信を全拒否する | 必要な通信まで制限してしまう(例えばWindowsUpdateとか) |
今回は、極力お金と手間をかけずに課題を解決する方法を考えた結果、Route 53 Resolver DNS Firewall が使えるのではと思い、紹介します。
Route 53 Resolver DNS Firewall とは何ぞや
以下は、公式サイトから抜粋。
DNS Firewall では、VPC からのアウトバウンド DNS リクエストを保護できます。これらのリクエストは、ドメイン名の解決用に Resolver を介してルーティングされます。DNS Firewall による保護の主な用途は、データの DNS 漏洩を防ぐことです。
VPCからインターネットに出る際に、デフォルトでは、AWSが用意しているDNSサーバで名前解決がされますが、そのDNSサーバで名前解決の制限をかけます。
なので、手動でDNSサーバ変えたり、hostsファイルで無理矢理名前解決されると対処できないかも。
早速試してみる
Route 53 という名前はついてますが、設定自体は「VPC」から行います。
1. ドメインリストを追加する
まずはじめに、名前解決を許可する(拒否する)ドメインのリストを作成します。
- 設定は、「VPC」-「DNSファイアウォール」の「ドメインリスト」をクリックします。
- 「ドメインリストを追加」をクリックして、リスト名や登録するドメイン情報を入力して保存します。
これでドメインリストの作成は完了です。必要に応じて、複数作成します。
2. ルールグループを作成する
- 左メニューの「DNSファイアウォール」から「ルールグループ」をクリックします。
- 「ルールグループを作成」をクリックして、必要情報を記入していきます。
- ルール追加の設定画面で、先ほど作成したドメインリストを設定していきます。
オプションでどのレコードクエリに対して許可(拒否)するかも設定が可能です。
今回は、「すべてのAレコードを拒否する設定」と「googleへのアクセスを許可する設定」を作成しました。
拒否設定する場合は、応答の指定NODATA
,NXDOMAIN
,OVERRIDE
もすることが可能です。
- ルールの優先度を設定します。
3. VPC への関連付け
作成したルールグループをVPCに関連付けしてあげる必要があります。
作成したルールグループを選択し、画面下の「関連付けられたVPC」より関連付けを行います。
関連付けが完了するまで少し時間(数分)がかかります。
※AWS Firewall Managerのポリシーも関連付けすることができますが、今回はしません。
4. 検証してみる
EC2でdigコマンドを実行して結果を確認します。
yahoo.co.jpの名前解決ができないことを確認
status
が「NXDOMAIN」になっていることが確認できます。
$ dig yahoo.co.jp
; <<>> DiG 9.16.42-RH <<>> yahoo.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 63704
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;yahoo.co.jp. IN A
;; Query time: 10 msec
;; SERVER: 192.168.0.2#53(192.168.0.2)
;; WHEN: Thu Feb 29 13:47:51 UTC 2024
;; MSG SIZE rcvd: 40
www.google.co.jpの名前解決ができることを確認
status
が「NOERROR」になっていることが確認できます。
$ dig www.google.co.jp
; <<>> DiG 9.16.42-RH <<>> www.google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7954
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.co.jp. IN A
;; ANSWER SECTION:
www.google.co.jp. 126 IN A 142.250.196.99
;; Query time: 40 msec
;; SERVER: 192.168.0.2#53(192.168.0.2)
;; WHEN: Thu Feb 29 13:50:01 UTC 2024
;; MSG SIZE rcvd: 61
まとめ
設定自体は簡単にできました。
今まで意識したことがなかったサービスだったので、今後また使えそうな用途が見つかれば使ってみたいと思います。
Discussion