LoginSignup
0
0

More than 1 year has passed since last update.

TwistedとDNS SEC

Last updated at Posted at 2021-12-12

DNS by Twisted もうちょっと調べとく

別記事で記載したとおり、TwistedをDNSで使う場合微妙な実装があり、どうなのかなぁ、、という感想を書きました。
その時脳内にあった懸案の1つの、DNSSECについてもうちょっと深堀しておきます。

DNSSECとは

端的に言うと、DNSにHTTPのSSL証明書のような「改ざん防止」の機能をもたせようという仕組みですね。
https://www.nic.ad.jp/ja/newsletter/No43/0800.html

記事自体も2009年であるものからわかるように、かなり古くからある技術ですが、浸透してるかというと、、、
https://blog.nic.ad.jp/2020/4513/

以下、DNSは「どのDNS」の話をしているのがこんがらがるので、極力以下の表現に揃えます。
https://atmarkit.itmedia.co.jp/ait/articles/1706/23/news042.html
さておき。

理解を間違えてたら恥ずかしいのですが、、上記で言う「検証」というのはフルリゾルバやキャッシュサーバとしてのDNSの話で、Googleの8.8.8.8みたいなユーザの名前解決要求を代行するひとが、DNSコンテンツサーバ(権威サーバ)に聞きに行く際にDNSSECを使うかどうかだと思います。
一方「署名」というのは、フルリゾルバから問い合わせを受けたDNSコンテンツサーバ側がDNSSECを使っているかどうかなのかなと。

  • リゾルバがDNSSECを使おうとしなけれれば、コンテンツサーバがDNSSEC対応をしていようがいまいが、以前通りの処理を行う。
  • リゾルバがDNSSECを使おうとして、コンテンツサーバがDNSSEC対応していれば、晴れてDNSSECでの処理が行われる。
  • リゾルバがDNS SECを使おうとしているが、コンテンツサーバがDNSSEC対応していなければ、以前通りの処理。

「検証」については、結局はソフトやオープンリゾルバが対応するかどうかの話で、有名どころは対応が済んでいるような気がします。
今回の関係でリゾルバとして使っていたunboundも、以下のように、「当然実装してるし、無効化も完全にはさせない」というような仕様になってます。
↑モジュール外せば無効化できますね。。お恥ずかしい。
https://unbound.jp/unbound/howto_turnoff_dnssec/

一方「署名」についてですが、google.co.jpがどうしているのかなと見てみると、、

$ dig +dnssec -t A google.co.jp @ns1.google.com

; <<>> DiG 9.16.1-Ubuntu <<>> +dnssec -t A google.co.jp @ns1.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29846
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 512
;; QUESTION SECTION:
;google.co.jp.          IN  A

;; ANSWER SECTION:
google.co.jp.       300 IN  A   172.217.175.35

;; Query time: 92 msec
;; SERVER: 216.239.32.10#53(216.239.32.10)
;; WHEN: Sat Dec 11 12:26:13 UTC 2021
;; MSG SIZE  rcvd: 57

RRSIGなどのDNS SECを使っている際のレコードの応答がありません。

一方、普及が進んでいるというスウェーデンのサイトということで、Wikiで見つけたスウェーデン王国政府サイトはというと、こんな感じ。
Aレコードに対してRRSIGがついて返ってきます。

$ dig +dnssec -t A regeringen.se @sto.excedodns.se
; <<>> DiG 9.16.1-Ubuntu <<>> +dnssec -t A regeringen.se @sto.excedodns.se
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38504
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 6, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;regeringen.se.         IN  A

;; ANSWER SECTION:
regeringen.se.      3600    IN  A   185.195.92.41
regeringen.se.      3600    IN  RRSIG   A 8 2 3600 20211223000000 20211202000000 46143 regeringen.se. AA3/tSQ1Yi7d+UvhKiN9h3ibL+QWvLunvhbFB1q6q3gEcP3u4RHTCwnI neLyBiQTTCDGFJkwQ0SWgnNE4uL+wkIQSxVgQBxAJyfKyh3Nt6z1tDMW vAfno435OidxIXde4Q5Kxhcjqi7LvViHexVHJdpIxrgqb6jSnLhpxXgl 5TydKvdk7HbBapyYjZYTkc0LWjTvtjRRzFXK3YO3Ei43rrmw3mK1/A6g t/u2nKSasdlxELVllV3mVnaNL4CfKEHsbLEaxQiTQ9JpyHAmD6doLPfQ hjre4TIzVNPxe73Vi12TZvHB6rCduhbuR3PLyCzQVkJLXkdbSWnwPTmN bTIbjA==

;; AUTHORITY SECTION:
regeringen.se.      86400   IN  NS  sto.excedodns.se.
regeringen.se.      86400   IN  NS  emea.excedodns.eu.
regeringen.se.      86400   IN  NS  world.excedodns.org.
regeringen.se.      86400   IN  NS  global.excedodns.com.
regeringen.se.      86400   IN  NS  nordic.excedodns.net.
regeringen.se.      86400   IN  RRSIG   NS 8 2 86400 20211223000000 20211202000000 46143 regeringen.se. QJP6hhA5JOMkYutUmqwZU3Yqk/U8JGykk9R96ynXnF1dNv+wO92lkmw8 78NfLIpw3UUkz+b+akD0xjdAz1oDaEaqYlg3PO5/WQ2UBUX1dxU1nI9S +C9a7tKPjIKmFMltyPkCe5jHMVbUsp/xOMSBb6IupZGUW5sLADCkr3Yz U6QX6dClkByKECWX9qBMZJ7sA6QLyXUaqQS7+6Uw42+0G32VN3HuWm2X 0QbYHfH9dSXA6maA3ru0xnkdsrhOyt1VCvtC02C7ucXN8o75jc4Fxw3Z J1HXVHRYqSMN8sqSAdQKlKWmTzdqvNRSEFHILsYsuUPrblk5/Mlc5Uoi U4XqsQ==

ミーハーな考え方ですが、グーグルさんが使ってないところからしても、やはり署名は確かに進んでない感じなのですかね。

脱線 試して見るときの注意

今回は手元のubuntuで試しているのですが、systemd-resolveに聞くとRRSIGの値が返って来ませんでした。
上記で、直に権威サーバに聞きに行っているのはそういう理由です。
ちなみにブロードバンドルータや8.8.8.8に聞きに行く場合でもRRSIGちゃんと取れます。

どうやらsystemd-resolveはDNSSECを使わないのがディフォ設定になっているからのようなのですが、、単純にDNSSEC=trueにすると名前解決できなくなります。
というか、パケットを眺めている限り、リクエスト時にDNSSE用のDD bitを立てて無いような、、
https://wiki.archlinux.jp/index.php/Systemd-resolved

まぁリゾルバによって結果がフィルタされてているかもしれない、というのは念頭に置いとく必要があるということで。

TwistedのDNSSEC対応

Twistedのnamedライブラリも、スタブリゾルバとしての振る舞い(多分DNSSEC Clientという表現)や、権威サーバ、キャッシュ、フォワーダとしての振る舞いができるので、混ぜないように注意しないといけないのですが、ざっと上記と現時点で最新のコード(21.7.0)を見た感じ、どれとしてもDNSSECには対応してないように見受けられます。

DNSSEC Clientとしてのロードマップは以下にも示されているのですが、随分前に提示されて進んでない感じです。。
https://twistedmatrix.com/trac/milestone/DNSSEC_Client
そもそもソースでリクエストを受け取ったときの処理を眺めているとdnssecokという名前でDNSSEC利用有無のフラグのデータを読み取って格納しているようなのですが、これを他の処理で使っている様子が無い、、、
https://github.com/twisted/twisted/blob/twisted-21.7.0/src/twisted/names/dns.py

権威サーバの方ですが、こっちもそもそもDNSSECで使用されるレコードタイプであるRRSIGやDS,DNSKEYなどのデータを扱えるクラスや変数が実装されていないです。
最初の記事だと、一部の実装をしてくれたひとがいるそうなのですが、実際のコードへの取り込みはされてないようですね。。
https://github.com/twisted/twisted/blob/twisted-21.7.0/src/twisted/names/dns.py

と、いうことで、道は遠い。

まとめ

静的な偽レコードを配るくらいならBindやUnboundで実装できるのですが、リクエストに合わせて動的に応答を変えようとすると、自由度高く実装できるTwistedのようなライブラリが必要です。

でもTwistedでDNSを実装する場合、DNSSECが実装できません。
現状世の中でもDNSSEC対応をしないコンテンツサーバも多くあるのは事実ですが、将来的にどうなるか。。
少なくとも、rootコンテンツサーバやjpなどの上位のドメインはDNSSEC対応してますので、こいつらを詐称するDNSサーバを作ろうとするときは考慮せにゃならんかなと。
(まぁそんな特殊用途で使うときに几帳面にDNSSECまで実装するか、、?という話ではありますが)

そして、、、ここらへんも視野に入れないといけません。
https://support.mozilla.org/ja/kb/firefox-dns-over-https
https://www.isc.org/blogs/doh-talkdns/

。。。bindやubnoundのプラグインとしてねじ込む方法が正しいのかもしれません。
腰を据えて勉強するかぁ、、、

とりあえずこんなところで。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0