CNAME レコードを DNS クエリした際の Route 53 Resolver DNS Firewall 挙動を調べてみた

2022.09.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アノテーション、テクニカルサポートチームの村上です。

みなさん、Route 53 Resolver DNS Firewall 使っていますか?
DNS クエリをフィルタすることでセキュリティアップが見込める渋くて素敵なサービスなのですが、以前からとても気になっていたことがありました。
今回は、そのとても気になっていたことを検証により明らかにしてみたいと思います!

なお、Route 53 Resolver DNS Firewall については、下記ブログに分かりやすくまとまっています。

知りたいこと

CNAME の名前解決に関しては、下図にあるようにホストから 2 度(またはそれ以上)の DNS クエリが実行されます。

Route 53 Resolver DNS Firewall では、ドメインリストに登録したドメイン名に対して、許可、BLOCK、ALERT というルールを設定できます。
ドメインリストへ 1 度目の DNS クエリの問い合わせ先となるドメイン名 www.example01.com を許可ルールで登録しておけば、2 度目の DNS クエリ(上図の www.example02.com )に関しては、フリーパスで許可ルールが適用されるのかが気になっていました。

CNAME レコードの名前解決の場合、下図のどっちのパターンになるのか?

結論

パターン 2 のように、別名の名前解決もフィルタの対象となります。

Route 53 Resolver DNS Firewall のドメインリストに CNAME レコードを持つドメイン名を登録してアクション ALLOW を適用する場合は、ドメインリストに CNAME の値として登録されているドメイン名も登録する必要があります。
エイリアスレコードを利用している場合は、ドメインリストに許可したいドメイン名のみ登録するだけでアクション ALLOW の適用が可能です。

下準備

検証をするにあたって作成したリソース設定に関しては、ざっくりとしたご案内となります。
「あぁ、こんな感じで試してみたのね」、ぐらいで読んでいただければ。

1.EC2インスタンス:t2.micro を起動
特に特別な設定は必要無く、ご自身の PC から EC2 に SSH 接続できれば OK。

2.ALB を EC2 とは別の VPC で作成

3.Route 53 Resolver DNS Firewall のドメインリスト AllowList を作成
 ドメイン名(www.〇〇〇.work)を登録。

4.ドメインリスト BlockList を作成。 *(全てのドメイン)を登録

5.ルールグループ Test01 を作成
ルールの優先度 1 にドメインリスト AllowList をアクション ALLOW で適用し、ルールの優先度 2 にドメインリスト BlockList をアクション BLOCK で適用しました。

アクション BLOCK については、Route 53 Resolver からどのような応答を返すのか以下の 3 つから選ぶことができます。

NODATA - クエリが成功したことを示す応答がありますが、それに対して利用可能になったという応答はありません。

NXDOMAIN— クエリのドメイン名が存在しないことを示す応答。

OVERRIDE — レスポンスにカスタムオーバーライドを指定します。このオプションには、次の設定が必要です。

今回は、アクション BLOCK が適用された際に DNS クエリしたドメイン名が存在しないという応答が Route 53 Resolver から返ってくる "NXDOMAIN" で設定をしました。

上記のドメインリストとルールにより実施できること

3 ~ 5 の設定によって、ドメインリスト AllowList に登録されているドメイン名 www.〇〇〇.work は、優先度 1 のアクション ALLOW により DNS クエリが許可され、その後の優先度 2 以降のルールが適用されることはありません。

次に、優先度 1 のアクション ALLOW が適用されない他ドメインは、ドメインリスト BlockList に含まれる(* で全てのドメインを指定)こととなるので、DNS クエリが実施されると優先度 2 のアクション BLOCK が適用され DNS クエリの結果が得られません。

6.ルールグループ Test01 を、1.で作成した EC2 が起動している VPC へ関連付ける
ルールグループを適用したい VPC と関連付けることで、その VPC 内で Route 53 Resolver に対して行われた DNS クエリをフィルタすることができます。

やってみた

www.〇〇〇.work の A レコードに ALB の グローバル IP アドレスの一つを直接指定した場合

CNAME レコードについての検証をする前に、ドメイン名 www.〇〇〇.work のレコードタイプを A レコードで指定して、Route 53 Resolver DNS Firewall が想定通りの動作をするのか確認してみます。

ドメイン名www.〇〇〇.work の A レコードに登録する IP アドレスには、ALB に 2 つ割り当てられる グローバル IP アドレスのうちの 1 つを指定しました。
※運用上では ALB の IP アドレスは動的に変化する為、ドメイン名 によって指定してください。

SSH 接続した EC2 で、ドメイン名 www.〇〇〇.work を指定して dig コマンドにより名前解決をしてみます。

ドメイン名 www.〇〇〇.work の名前解決ができ、グローバル IP アドレスの取得ができました。

次にドメイン名 www.〇〇〇.work 以外のドメイン名(www.google.com)の名前解決をしてみて、設定どおりに名前解決に失敗するかを確認してみます。

他ドメイン名を指定して、dig コマンドを実行してみましたが、名前解決ができず IP アドレスは得られませんでした。

ドメイン名 www.〇〇〇.work と他ドメイン名の両方で、Route 53 Resolver DNS Firewall へ設定したルールどおりに DNS クエリがフィルタされることを確認できました。

www.〇〇〇.work の CNAME に ALB のドメイン名を指定した場合

次に、ドメイン名 www.〇〇〇.work のレコードタイプを CNAME レコードへ変更し、値に ALB のドメイン名を指定した場合に、どのように DNS クエリがフィルタされるか確認してみます。

Route53 のホストゾーンで、ドメイン名 www.〇〇〇.work の CNAME として ALB のドメイン名を指定しました。

SSH 接続した EC2 で、ドメイン名 www.〇〇〇.work を指定して dig コマンドにより名前解決をしてみます。

上記のコマンド結果を見る限りでは、ドメイン名 www.〇〇〇.work の CNAME として ALB のドメイン名まで取得できたが、取得した ALB のドメイン名の名前解決は失敗しているように見えます。

ということは、下図の DNS クエリ 2 回目問い合わせで、再度ルールグループ Test01 が適用されて名前解決が失敗している可能性が高いと考えられます。

上記の仮説が正しいなら、AllowList に ALB のドメイン名を登録すれば、DNS クエリ 2 回目問い合わせも許可されて名前解決の結果 IP アドレスが得られるはずです。

AllowList に ALB のドメイン名を追加して、CNAME の名前解決が成功するか試してみます。

ドメイン名 www.〇〇〇.work を指定して dig コマンドにより名前解決をしてみます。

ドメイン名 www.〇〇〇.work の名前解決ができ、ALB のグローバル IP アドレス 2 つを取得ができました。(ALB が AZ ごとに冗長化されているので 2 つの IP アドレスが名前解決の結果得られます。)

検証結果より、ドメインリストに CNAME レコードを持つドメイン名を登録してアクション ALLOW を適用したい場合は、ドメインリストに CNAME の値として登録されているドメイン名も登録する必要があることが分かりました。

www.〇〇〇.work のエイリアスレコードに ALB のドメイン名を指定した場合

次に、ドメイン名 www.〇〇〇.work のレコードタイプをエイリアスレコードへ変更し、値に ALB のドメイン名を指定した場合に、どのように DNS クエリがフィルタされるか確認してみます。

Route53 のホストゾーンで、ドメイン名 www.〇〇〇.work のエイリアスレコードとして ALB のドメイン名を指定しました。

ドメインリスト AllowList についても、ドメイン名 www.〇〇〇.work のみが登録された状態に変更しました。

ドメイン名 www.〇〇〇.work を指定して dig コマンドにより名前解決をしてみます。

ドメイン名 www.〇〇〇.work のエイリアスレコードとして ALB のドメイン名が登録されている場合は、EC2 と Route 53 Resolver との間の DNS クエリが 1 回のみなので、ドメインリスト AllowList にドメイン名 www.〇〇〇.work のみが登録されている状態でも名前解決ができました!

凄いぞ、エイリアスレコード!!!

まとめ

CDN(Content Delivery Network)は、CNAME 経由でサービスが提供されている為、CDN サービスと紐づいたドメイン名が Route 53 Resolver DNS Firewall のアクション Allow の対象の場合、CDN サービスから提供されたドメイン名もドメインリストに登録することをお忘れなく。
この記事がどなたかのお役に立てば幸いです。

参考資料