DNSSECの基礎を理解して、実際のレコードを確認してみた

DNSSECの基礎を理解して、実際のレコードを確認してみた

本記事はAsiaQuest Advent Calendarの16日目です。

目次

    はじめに

    クラウドインテグレーション部の渡邊です。
    今回は、DNSSECついて説明します。

    偽のDNS情報をキャッシュさせる、DNSキャッシュポイズニングに対する根本的な解決策として、DNSSECがあります。
    DNSSECにより、偽装や改ざんをキャッシュサーバで確認することで、キャッシュポイズニング攻撃を防ぐことができます。
    今回は、そのDNSSECの仕組みを説明するとともに、実際のDNSSECのレコードを確認します。
    また、仕組みを説明するにあたって、DNSSECで利用される公開鍵暗号技術を用いた、電子署名についても説明します。
    DNSSECはセキュアなイメージがありますが、通信内容の暗号化は対象範囲としていないため、誤認しないように注意してください。

    対象としていないもの
    – 通信内容の暗号化
    通信内容を暗号化し、問い合わせ内容を秘匿すること

    引用元:DNSSECの基礎概要 , JPNIC , p 12

    DNSSECの仕組み

    DNSSECは受け取ったDNSレコードの出自・完全性を検証する仕組みです。
    検証を実現するために、電子署名の仕組みを使います。
    そのため、まずは電子署名の仕組みを部分的に説明します。


    受信者側視点の電子署名の仕組み

    電子署名によって、正しい送信者から、改ざんされていないメッセージを受信したことを確かめることができます。
    その過程を、受信者側の立場から説明します。

    1. 受信者側が①、②を受け取る。
    • ①電子署名
    • ②メッセージ ※電子署名は送信者の秘密鍵によって、ハッシュ化したメッセージを暗号化したものです。
    1. それぞれをハッシュ化されたメッセージにした際に、同一であることを受信者側で比較する。
    • 送信者の公開鍵で復号化した① = ハッシュ化したメッセージ
    • ②をハッシュ化させたもの = ハッシュ化させたメッセージ

    この過程で、以下2つのことがわかります。

    • 公開鍵で復号できたことで、正しい送信者が暗号化した。(出自の検証)
    • ハッシュ化したメッセージが一致したことで、改ざんがされていない。(完全性の検証)

    ※出自の検証に関しては、公開鍵が不正ではない前提です。


    DNSSECの仕組み

    本仕組みを説明するにあたり、複数のレコードが登場するため、下表にまとめます。 混乱しそうになったら、こちらをご参照ください。

    本記事で登場するレコード一覧 説明
    DNSKEY 公開鍵の情報(ZSK・KSK)
    RRSIG 各RRsetへの署名
    DS KSK公開鍵のハッシュ値を含む情報
    KSK ゾーン内の公開鍵情報に署名するための鍵
    ZSK ゾーンに署名するための鍵


    DNS応答の出自および完全性を検証する

    DNS応答に含まれるレコードを検証するために、電子署名の仕組みで登場した①、②を以下に置き換えて考えてみましょう。

    • ①電子署名=RRSIGレコード
    • ②メッセージ=Aレコード

    電子署名と同様に、メッセージ(Aレコード)をハッシュ化したものを電子署名と比較することで、出自および完全性を検証できることがわかるかと思います。

    • ゾーンの管理者の公開鍵(DNSKEY)で復号した① = ハッシュ化したメッセージ
    • ②をハッシュ化させたもの = ハッシュ化させたメッセージ

    DNSKEYの出自および完全性を検証する(信頼の連鎖)

    しかし、前項で説明した仕組みのみでは、検証として不十分です。 なぜなら、検証に使用した公開鍵が、偽装される可能性があるためです。 以下の場合においても、DNS応答の検証が成立してしまいます。

    1. 受信者側が①、②を受け取る。
    • ①電子署名
    • ②メッセージ ※電子署名は偽のゾーンの管理者の秘密鍵によって、ハッシュ化したメッセージを暗号化したものです。
    1. それぞれが、ハッシュ化されたメッセージとして同一であることを受信者側で比較する。
    • 偽のゾーンの管理者の公開鍵で復号化した① = ハッシュ化したメッセージ
    • ②をハッシュ化させたもの = ハッシュ化させたメッセージ

    よって、公開鍵が改ざんされていない(正規のものである)ことを確認するために、電子署名の仕組みで登場した①、②を以下に置き換えて考えてみましょう。

    • ①電子署名 = DSレコード
    • ②メッセージ = ゾーンの管理者の公開鍵(DNSKEYKSK))

    電子署名の仕組みに習い、電子署名(DS)を復号したものと、公開鍵(KSK)をハッシュ化したものが一致することを検証します。
    このような公開鍵の出自の検証が、信頼するゾーンまで行われることで、安心して所定のゾーンに対して連鎖的に検証を行うことができます。

    参考:DNSSECチュートリアル~実践編~ p48など

    このように、DNS応答の検証や信頼の連鎖は、電子署名の仕組みを利用していることがわかりますね。

    環境情報

    • iTerm2
    • macOS 13.4

    実際のDNSSECのレコードを確認してみた

    ここではexample.comを対象に、各レコードの役割を確認してみます。


    RRSIGレコード

    まずは、RRSIGレコードを確認します。

    $ dig example.com rrsig +dnssec

    ; <<>> DiG 9.10.6 <<>> example.com rrsig +dnssec
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21090
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags: do; udp: 1232
    ;; QUESTION SECTION:
    ;example.com. IN RRSIG

    ;; ANSWER SECTION:
    example.com. 86393 IN RRSIG DS 8 2 86400 20231101062027 20231025051027 63246 com. TByGwUQGI7RzOULRGS3+oygUH9NoEhRC6yvb5wj7S/DQ+IKqmeWFYc1/ 9KhI4ms5TLJ/tqBiY1t3U2ANBIzSiyA9J4+CjsVWz8ChRNB+QVowYtjp A+f93RoQMlojFED0eUVgtgqtq0hrH5NM33th6buYpaopaZcQsf7NyWir sI/glveUxxP66RxjvXMg6xn2sPgwkhObvHwCtWxjAT+oIw==
    example.com. 3578 IN RRSIG DNSKEY 13 2 3600 20231109195516 20231019095303 370 example.com. hhp9JzDjRhwFfkcS86h9udm3uv1QQRTmpWuvSQUeK+yzqqxMMxvN4Nbk khv+EPifYJDzF3TPyfvr+S2uyk9wKQ==
    example.com. 84860 IN RRSIG NS 13 2 86400 20231109002917 20231019095303 2182 example.com. LhezD+LGEtT667lJ7RfRsi0sRB7Z0Ph4zHP7vGozUSHC/5o0melNv++W NAfI5A2nlPmX7VnMNPWNK4VhF70y2g==
    example.com. 80913 IN RRSIG A 13 2 86400 20231108232841 20231019095303 2182 example.com. 3YtLrbIPwD2IeeWBtZcASMoBgDkU36y33Nah06DVt2R3WEFDkRrxHj7Z uNO5WNYD58XkBFgH92PTldXDgja5Yg==
    example.com. 61475 IN RRSIG AAAA 13 2 86400 20231109083640 20231019095303 2182 example.com. +gTOtrAUavFeGe/u+Wfhc7Nw8AZu2W6ciZLxBgbjXjEwpZgroWGrg2P5 YK665A1BrDWLpOLQBYOuaaa1Xh36pg==

    ;; Query time: 9 msec
    ;; SERVER: 118.238.201.33#53(118.238.201.33)
    ;; WHEN: Fri Oct 27 16:29:41 JST 2023
    ;; MSG SIZE rcvd: 663

    その中の、以下のレコードに注目します。

    example.com.            80913   IN      RRSIG   A 13 2 86400 20231108232841 20231019095303 2182 example.com. 3YtLrbIPwD2IeeWBtZcASMoBgDkU36y33Nah06DVt2R3WEFDkRrxHj7Z uNO5WNYD58XkBFgH92PTldXDgja5Yg== → AレコードをZSKで電子署名したもの

    RRSIGレコードの説明前に、言及するフィールドを表に示します。

    フィールド名 フィールド値 説明
    鍵タグ(Key Tag) 2182 署名検証するDNSKEYレコードの鍵のID
    署名(signature) 3YtL(中略)5Yg== Base64で符号化した電子署名

    RRSIGには、リソースレコードに対する電子署名が格納されています。
    以上で示したレコードの場合は、DNSKEYZSK)による、Aレコードの電子署名です。
    また、署名検証で使用する公開鍵を特定するために、鍵タグ(Key Tag)を指定します。

    以下を比較することでDNS応答を検証します。

    • AレコードをZSKで電子署名したもの(3YtL(中略)5Yg==)を復号したもの
    • Aレコードのハッシュ値

    (②に関しては、正確にはRRSIGの署名以外の部分 + 署名対象のAレコードのデータ から得られるハッシュ値で比較します)
    ZSKは次の項で確認します。


    DNSKEYレコード

    公開鍵が含まれるDNSKEYZSKKSK)を確認します。

    $ dig example.com dnskey +dnssec

    ; <<>> DiG 9.10.6 <<>> example.com dnskey +dnssec
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13224
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags: do; udp: 1232
    ;; QUESTION SECTION:
    ;example.com. IN DNSKEY

    ;; ANSWER SECTION:
    example.com. 3600 IN DNSKEY 256 3 13 /nRLBtx2AgW9shSZR4QVW6N3r0+tHCjiHc4gnlmY1VXggS0fiSfjsrkF OCZFGHrQWFlG839iIV7ToSFk0wRvOw==
    example.com. 3600 IN DNSKEY 256 3 13 PAwmimrmweQdmio2mmVkbWI8HWyLv9ddPbUPuulE2Jf+Pc3DNTP0xwKm eSCgAeinSLZb8MKIMhcxL6Qt20L4Dg==
    example.com. 3600 IN DNSKEY 257 3 13 kXKkvWU3vGYfTJGl3qBd4qhiWp5aRs7YtkCJxD2d+t7KXqwahww5IgJt xJT2yFItlggazyfXqJEVOmMJ3qT0tQ==
    example.com. 3600 IN RRSIG DNSKEY 13 2 3600 20231109195516 20231019095303 370 example.com. hhp9JzDjRhwFfkcS86h9udm3uv1QQRTmpWuvSQUeK+yzqqxMMxvN4Nbk khv+EPifYJDzF3TPyfvr+S2uyk9wKQ==

    ;; Query time: 206 msec
    ;; SERVER: 118.238.201.33#53(118.238.201.33)
    ;; WHEN: Fri Oct 27 16:29:19 JST 2023
    ;; MSG SIZE rcvd: 387

    レコードに注目すると複数のZSK、単一のKSKRRSIGがあります。
    複数ZSKがありますが、各鍵タグの値を求めることで、一致するものが1つに決まるため、複数あっても問題ありません。
    こちらのZSKを使用して、Aレコードの検証を行います。
    また、KSKを検証することで、署名されたZSKは信頼できるものであることがわかります。
    こちらの検証を実現するために、親レコードに登録しているDSKSKのハッシュ値)を利用します。
    DSレコードは次の項で確認します。
    なお、公開鍵フィールドはRFC3110を確認すると、指数長、指数、モジュラスで構成されております。
    公開鍵フィールドを使用して、そのまま暗号化したデータを復号することができない点に注意してください。

    example.com.            3600    IN      DNSKEY  256 3 13 /nRLBtx2AgW9shSZR4QVW6N3r0+tHCjiHc4gnlmY1VXggS0fiSfjsrkF OCZFGHrQWFlG839iIV7ToSFk0wRvOw== → ZSK
    example.com. 3600 IN DNSKEY 256 3 13 PAwmimrmweQdmio2mmVkbWI8HWyLv9ddPbUPuulE2Jf+Pc3DNTP0xwKm eSCgAeinSLZb8MKIMhcxL6Qt20L4Dg== → ZSK
    example.com. 3600 IN DNSKEY 257 3 13 kXKkvWU3vGYfTJGl3qBd4qhiWp5aRs7YtkCJxD2d+t7KXqwahww5IgJt xJT2yFItlggazyfXqJEVOmMJ3qT0tQ== → KSK
    example.com. 3600 IN RRSIG DNSKEY 13 2 3600 20231109195516 20231019095303 370 example.com. hhp9JzDjRhwFfkcS86h9udm3uv1QQRTmpWuvSQUeK+yzqqxMMxvN4Nbk khv+EPifYJDzF3TPyfvr+S2uyk9wKQ== → KSKによって署名されたZSK


    DSレコード

    最後にDSレコードを確認します。

    $ dig example.com ds +dnssec

    ; <<>> DiG 9.10.6 <<>> example.com ds +dnssec
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3151
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags: do; udp: 1232
    ;; QUESTION SECTION:
    ;example.com. IN DS

    ;; ANSWER SECTION:
    example.com. 86400 IN DS 370 13 2 BE74359954660069D5C63D200C39F5603827D7DD02B56F120EE9F3A8 6764247C
    example.com. 86400 IN RRSIG DS 8 2 86400 20231101062027 20231025051027 63246 com. TByGwUQGI7RzOULRGS3+oygUH9NoEhRC6yvb5wj7S/DQ+IKqmeWFYc1/ 9KhI4ms5TLJ/tqBiY1t3U2ANBIzSiyA9J4+CjsVWz8ChRNB+QVowYtjp A+f93RoQMlojFED0eUVgtgqtq0hrH5NM33th6buYpaopaZcQsf7NyWir sI/glveUxxP66RxjvXMg6xn2sPgwkhObvHwCtWxjAT+oIw==

    ;; Query time: 8 msec
    ;; SERVER: 118.238.201.33#53(118.238.201.33)
    ;; WHEN: Fri Oct 27 16:29:34 JST 2023
    ;; MSG SIZE rcvd: 283

    信頼の連鎖は、以下を比較することで検証します。

    • 親管理のDSレコード
    • 子が管理しているKSKレコードのハッシュ値

    これらを比較することで、子が管理しているKSKの出自の証明ができます。

    example.com.            86400   IN      DS      370 13 2 BE74359954660069D5C63D200C39F5603827D7DD02B56F120EE9F3A8 6764247C → KSKのハッシュ値

    まとめ

    • DNS応答の検証や信頼の連鎖は、電子署名の仕組みを利用しています。
    • DNSSECによって以下を検証できます。
      • 完全性の検証
      • 出自の検証
    • ただし、上の検証で使用する公開鍵は子ゾーンが管理しているものであることを確認するために、信頼の連鎖を形成します。

    【参考】

    DNSSECにおけるZSKの役割

    初歩から解説!BINDでシンプルDNSサーバー構築【構築編】

    DNSSEC

    手を動かしてDNSSECの検証をやってみよう

    DNSSECチュートリアル ~実践編~

    アジアクエスト株式会社では一緒に働いていただける方を募集しています。
    興味のある方は以下のURLを御覧ください。