DNSSECはDNSを保護します。 この資料では、DNS解決に影響するDNSSECの問題を検出する方法について説明します。
digを使用してDNSSECをテストする
Digは、DNSレコードのネームサーバーにクエリを実行するためのコマンドラインツールです。たとえば、dig はDNSリゾルバーにwww.cloudflare.com のIPアドレスを問い合わせることが できます+shortオプションは結果のみを出力します):
$ dig www.cloudflare.com +short 198.41.215.162 198.41.214.162
digを使用してDNSSECレコードを検証します。 以下の例では、出力の最後の行がRRSIGレコードです。RRSIGは、レコードに添付されているDNSSEC署名です。RRSIGを使用して、DNSリゾルバーはDNSレスポンスが信頼できるものかどうかを判断します。
$ dig www.cloudflare.com +dnssec +short 198.41.214.162 198.41.215.162 A 13 3 300 20180927180434 20180925160434 35273 cloudflare.com. DYYZ/bhHSAIlpvu/HEUsxlzkC9NsswbCQ7dcfcuiNBrbhYV7k3AI8t46 QMnOlfhwT6jqsfN7ePV6Fwpym3B0pg==
また、digは、DNSレコードの検証に使用される公開鍵を取得します。 ドメインのDNSレコードはすべて、同じ公開鍵で署名されます。 したがって、サブドメインの公開鍵ではなく、ルートドメインの公開鍵にクエリを実行します:
$ dig DNSKEY cloudflare.com +short 257 3 13 mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+ KkxLbxILfDLUT0rAK9iUzy1L53eKGQ== 256 3 13 koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z 1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==
DNSレスポンスには、次の2つのレコードが含まれます:
- DNSKEYレコード256は、ゾーン署名鍵(zone-signing key)と呼ばれる公開鍵であり、A、MX、CNAME、SRVなどのDNSレコードの署名を検証するのに使用されます。
- DNSKEYレコード257は、鍵署名鍵(key-signing key)と呼ばれ、DNSKEY、CDS、およびCDNSKEY レコードの署名を検証するのに使用されます。
+shortオプションをdigと使用しない場合に、レスポンスヘッダーにadフラグが表示されると、DNSレスポンスはDNSSEC認証されます:
$ dig www.cloudflare.com [...] ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65326
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 [...] ;; QUESTION SECTION: ;www.cloudflare.com. IN A [...] ;; ANSWER SECTION: www.cloudflare.com. 15 IN A 198.41.215.162 www.cloudflare.com. 15 IN A 198.41.214.162
digを使用してDNSSECの信頼の連鎖(Chain of Trust)を表示する
ドメイン署名の完全検証(例:cloudflare.com)は最上位のドメインでの鍵署名鍵を検証する必要があります(例:.com)。 続いて、同様の検証が ルートサーバーレベルにてcomのkey-signing keyによって実行されます。DNSSECのルート鍵は、信頼の連鎖を完成させるためにDNSクライアントに配布されます。
DNSSECが有効になっている場合、レジストラーのDNSでDSレコードが必要になります。 DSレコードには、公開鍵署名鍵のハッシュと鍵に関するメタデータが含まれます。
digを使用して、DSレコードを検索します:
$ dig +short DS cloudflare.com 2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9
+traceオプションを使用すると、digは答えがcloudflare.comのネームサーバーによって返されたのか、.comのネームサーバーのよって返されたのかを確認します。この例では、 cloudflare.comのDSレコードはe.gtld-servers.netによって返されています:
$ dig DS cloudflare.com +trace [...] cloudflare.com。86400 IN DS 2371 13 2 32996839A6D808AFE3EB4A795A0E6A7A39A76FC52FF228B22B76F6D6 3826F2B9 [...] com. 172800 IN NS e.gtld-servers.net. [...] ;; Received 1213 bytes from 2001:502:1ca1::30#53(e.gtld-servers.net) in 37 ms
上記のすべての手順を手動で実行する簡単な方法は、DNSVizオンラインツールを使用することです。詳細については、DNSVizを使用したDNSSEC検証のトラブルシューティング またはDNSVizを介したcloudflare.comのDNSSEC結果の例を参照してください。
digを使用してDNSSEC検証のトラブルシューティングを行う
レジストラーで古いDNSSECレコードを更新または削除せずに、権威DNSプロバイダーを変更すると問題が発生します:
$ dig A brokendnssec.net @1.0.0.1 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 10663
digと+cdオプションを実行して、SERVFAILレスポンスがDNSSECに関連付けられているかどうかを確認します。+cdオプションは、DNSSEC検証なしにDNS結果を提供します。
$ dig A brokendnssec.net @1.0.0.1 +dnssec +cd +short 104.20.49.61 104.20.48.61
上記の例では、+cd オプションを使用しているときに正しいDNSレスポンスを受信した場合はDNSSECの誤設定が行われますが、DNSSECを使用したクエリは SERVFAILレスポンスを返します。 この問題は、権威ネームサーバーは変更されるが、DSレコード が更新されない場合に発生することが多いです。 この問題は、攻撃者がクエリに対するレスポンスを偽造しようとした場合にも発生することがあります。
DNSVizを使用してDNSSEC検証のトラブルシューティングを行う
- http://dnsviz.net/に移動します。
- 表示されるテキストフィールドにドメイン名を入力します。
- DNSVizが過去に一度もサイトを分析したことがない場合は、表示される「分析(Analizye)」ボタンをクリックします。
- DNSVizが過去にサイトを分析したことがある場合は、表示される「今すぐ更新する(Update Now)」ボタンをクリックします。
DNSSECなしの例
以下は、dnsviz.netによって表示されるDNSSECなしのワーキングドメインの例です:
正しいDNSSECを含む例
以下は、TLDネームサーバーとcloudflare.comの権威ネームサーバーの間に機能しているDNSSECレコードがあるドメインの例です:
権威ネームサーバーにRRSIGレコードがない、または正しくないRRSIGレコードがある例
以下は、TLD ネームサーバーによって発行されたDSレコードと一致する有効なDNSKEYレコードが権威ネームサーバーによって提供されていない場合に、dnsviz.netが誤った権限委任を表示する例です。
次のステップ
DNSSEC実装で問題が検出された場合は、ドメインのレジストラーに連絡して、DSレコードが権威DNSプロバイダーが指定したものと一致することを確認します。 Cloudflareが権威DNS プロバイダーである場合は、「Cloudflareを使用してDNSSECを設定する」に記載されている手順を行います。