DNS温泉番外編2016
March 26, 2016 @IIJ
鈴木常彦 @E-ONTAP.COM
プログラム
- 12:10 DNS 基礎講座 ~ 浸透いうな ~
- 13:00 「RFC2181」講座
- 13:50 休憩
- 14:00 「幽霊ドメイン名脆弱性」と NS 移転講座
- 15:30 休憩
- 15:40 「委任/移転インジェクション」対策講座
- 17:00 ライトニングトーク
- 18:00 終了
DNS 基礎講座 ~ 浸透いうな ~
キーワード (ホワイトボードで図解)
- RFC1034
- RFC1035
- スタブリゾルバ、フルリゾルバ
- キャッシュサーバ、コンテンツサーバ(権威サーバ、ゾーンサーバ)
- ゾーン
- 委譲 (委任 / delegation)
- グルー
- 再帰.. (recursive) 、反復.. (iterative)
- 浸透...いうな
ゾーンとは
- 管理境界で区切られた (zone cuts) 隣接空間
- 権限のあるデータだけ置いてよい (may)
- 特殊な例外として "glue records" (他は must not)
- ラベルの区切りといちいち対応するものではない (よくある誤解)
権威とは何か
- 権威はルートから順に委譲される
- 木構造の一部について完全な情報を持つ
- 権威ある情報はゾーンとして管理される
ゾーン分割
- 隣接するノード間で(ゾーン)カットができる
- 接続されている名前空間が(区画された)ゾーン
- ゾーンはその名前空間に権威があるという
- ルートに近い最上位のノードがゾーン名となる
- ドメイン名、ノードは単一のゾーンに区画できる
- 区画されたゾーンは一組織が自由に制御できる
- データを変更し、木を継ぎ足し、ノードを削除し、サブゾーンの委譲ができる
ゾーンデータ
ゾーンの主たる4つの構成物
- ゾーン内のすべてのノードに権威あるデータ
- ゾーン頂点のノードを定義するデータ(権威あるデータの一部)
- 委譲したサブゾーンを示すデータ (ゾーン下部でのゾーンカット)
- サブゾーンにアクセスするためのデータ (グルーと呼ばれる)
NS, SOA
- ゾーンの頂点ノードを示す管理上重要なデータは
- ゾーンサーバすべてをリストアップする name server RRs
- ゾーン管理パラメータを記述する一つの SOA RR
- ゾーン下部切断点 (cut) を示す RRs はサブゾーンの NS RRs
- それら NS RRs は権威あるデータではない
- サブゾーンの頂点を示す RRs と正確に一致しているべき (SHOULD)
- NS RRs は頂点と下部切断点にのみ現れ決して中間には現れない
グルー
- もしネームサーバの名前がサブゾーン内部にあったら、ネームサーバのアドレスを知るためには知りたいアドレスに問い合わせないといけないという状況になる
- 解決のために、権威のないサーバのアドレス RRs である "glue" RRs をゾーンに持たせる
- glue RRs はネームサーバの名前がゾーンカットの下にあるときに限り必要であり、referral 応答の一部としてのみ使われる
再帰
- 分散DBにおいて自力で名前解決できないサーバもある。このため2つの方法を用意する
- Iterative: クライアントに他のサーバを紹介し、問い合わせを追跡させる
- Recursive: 一つ目のサーバがクライアントである他のサーバからの問い合わせを追跡する
- サーバにとって一番シンプルなモードは non-recursive
- ローカルな情報だけを用いて問い合わせに応答できる
- 応答はエラー、回答 (answer)、最も近い他のサーバへの参照 (referral) からなる
- クライアントにとって一番シンプルなモードは recursive
- このモードはネームサーバをリゾルバとして機能させる
- 応答はエラーまたは回答で、決して参照は返さない
- このサービスはオプショナルであり、利用するクライアントを限定してよい
RFC1034 より抜粋: これが書かれた時代にはキャッシュとコンテンツの分離がちゃんとなされていなかったことを考慮して理解する必要がある
鈴木の解釈: recursive は iterative あるいはローカルな情報を持つサーバに辿り着くまで多段となりうるから recursive
5種類の DNS 返答
Notes on the Domain Name System (D.J.Bernstein) - The five types of DNS responses (
前野訳)
- 「照会名が別名であったため問合せに答えは得られなかった。 照会名を変えてもう一度試みる必要がある。」 (CNAME)
- 「照会名に対して答えるべきレコードを持っていない。 また、他のいかなるタイプのレコードも存在しないことが保証されている。」 (NXDOMAIN / (否定)キャッシュ時間は 応答の authority section のSOA に依存 / DJB の警告に注意)
- 「照会名に対して答レコードが(複数可)あった。」 (NOERROR / QNAME, QTYPE が一致し answer に回答)
- 「サーバが答を持っていないので、問合せには答えてもらえなかった。 別のサーバにコンタクトする必要がある。」 ( Authority section に他のサーバの参照情報 (referral) / *委任にのみ使うべき)
- 「照会名は答レコードをもたない。 しかし、別タイプのレコードはあるかもしれない。」 (NODATA / 擬似応答 / 他のTYPEはあるかもしれない / TTL は SOA に依存)
TTL
- TTL 値はキャッシュ (の利用) が許される時間である (キャッシュし続けるべき時間ではない)
- RRset の RRs の TTL 値は一致していなくてはならない (MUST)
- キャッシュにあるのと同じ RRSet で TTL だけが異なる応答を受信した場合、オプショナルだが TTL を受信したもので更新してもよい (MAY)
- 受信した応答がより権威ある場合 (RFC 2181 ランキング参照) はキャッシュを更新すべきだ (SHOULD)
- ネガティブキャッシュの時間は否定応答に付随する SOA の minimum 値 (Negative cache TTL) あるいは SOA 自身の TTL の短い方が参照される (ゾーンサーバはこれを揃えて応答する)
RFC 2181 講座 (ランキング)
RFC2181
5.4.1. Ranking data
Trustworthiness shall be, in order from most to least:
+ Data from a primary zone file, other than glue data,
+ Data from a zone transfer, other than glue,
+ The authoritative data included in the answer section of an
authoritative reply.
+ Data from the authority section of an authoritative answer,
+ Glue from a primary zone, or glue from a zone transfer,
+ Data from the answer section of a non-authoritative answer, and
non-authoritative data from the answer section of authoritative
answers,
+ Additional information from an authoritative answer,
Data from the authority section of a non-authoritative answer,
Additional information from non-authoritative answers.
ランキング
RFC2181
5.4.1. Ranking data
(snip)
Unauthenticated RRs received and cached from the least trustworthy of
those groupings, that is data from the additional data section, and
data from the authority section of a non-authoritative answer, should
not be cached in such a way that they would ever be returned as
answers to a received query. They may be returned as additional
information where appropriate. Ignoring this would allow the
trustworthiness of relatively untrustworthy data to be increased
without cause or excuse.
2008 年の BlackHat での Kaminsky の説明が間違っていた所以がここに...
キャッシュ上書き実験
root@server_unbound147:/ # dnsqr a www.wine.nom
1 www.wine.nom:
113 bytes, 1+1+2+2 records, response, noerror
query: 1 www.wine.nom
answer: www.wine.nom 1 A 192.168.11.11
authority: wine.nom 239 NS ns.wine.nom
authority: wine.nom 239 NS ns2.wine.nom
additional: ns.wine.nom 239 A 192.168.11.11
additional: ns2.wine.nom 239 A 192.168.11.12
root@server_unbound147:/ # dnsqr a www.wine.nom
1 www.wine.nom:
113 bytes, 1+1+2+2 records, response, noerror
query: 1 www.wine.nom
answer: www.wine.nom 30 A 192.168.11.11
authority: wine.nom 300 NS ns.wine.nom
authority: wine.nom 300 NS ns2.wine.nom
additional: ns.wine.nom 300 A 192.168.11.11
additional: ns2.wine.nom 300 A 192.168.11.12
* この動作は Unbound 1.4.8 , BIND 9.2.3 で修正されたが、、、
幽霊ドメイン名脆弱性
JPRS 重複文書: 「ghost domain names(幽霊ドメイン名)」脆弱性について
https://jprs.jp/tech/notice/2012-02-17-ghost-domain-names.html
に書かれている例
www.example.jp. 46400 IN A 192.0.2.10
example.jp. 46400 IN NS ns1.example.jp.
ns1.example.jp. 46400 IN A 192.0.2.1
というキャッシュに対して、権威サーバ側で NS を ns2.example.jp に書き換え、それを問い合わせると、
;; ANSWER SECTION
ns2.example.jp. 86400 IN A 192.0.2.1
;; AUTHORITY SECTION
example.jp. 86400 IN NS ns2.example.jp.
;; ADDITIONAL SECTION
ns2.example.jp. 86400 IN A 192.0.2.1
という応答が返り、脆弱性のあるキャッシュサーバは以下のようにキャッシュが上書きされる。
www.example.jp. 46400 IN A 192.0.2.10
example.jp. 86400 IN NS ns2.example.jp.
ns1.example.jp. 46400 IN A 192.0.2.1
ns2.example.jp. 86400 IN A 192.0.2.1
つまり NS が変化すると TTL ごと NS キャッシュが更新され、これが繰り返されると委譲元の NS が変わっても古いサーバにアクセスし続けることになる。
NS 移転において憂慮すべき点
- 委譲元の TTL に従うキャッシュサーバの存在
(毒入れ防止の観点からは憂慮ではなく望ましい動作)
- 幽霊ドメイン名脆弱性のあるキャッシュサーバの存在
- キャッシュ兼用サーバからの移転はトラブル必至
- 非協力的な事業者が大半
- 不要になったゾーンを消せないサービスとか (契約解除後までも)
適切な NS 移転の要点
- ケースバイケースであり自分で考えないとダメ (手順は一人歩きするので指南しない)
- 基本的には新 NS を用意しておき、委譲元で NS を切り替えればそれでよい
- NS RRset (+glue) と他の RRs を同時に切り替えない
- 新旧のゾーンデータの内容は極力一致させておくことが重要
- 幽霊ドメイン名脆弱性対策、そして早期に新 NS へ誘導するために、旧サーバに新 NS を書く
- 委譲元の TTL が経過するまでは旧 NS へのアクセスを考慮
- 委譲元の TTL が過ぎたら旧ゾーンの設定は消す
- 緊急時には委譲元を書き換えたら旧ゾーンはすぐに消すのもあり
(たいていのキャッシュサーバは親 (委譲元) 側から検索しなおす)
- 旧 NS に新 NS を書くことも、ゾーンを消すことも出来ない場合はそういうサービスを利用していた自分を罵りつつ、事業者にクレームを入れる
- 移転先が事前にゾーンを作らせてくれない場合、自由の効くサーバに臨時の NS を立てるケースもある
2019/4/5 追記:利用しているサービスによってはすぐにゾーンを消すのは危険なので注意してください。最悪、毒入れされます。このことに今まで気づかなかったのは迂闊でした。上記説明が不適切であったことをお詫びします。(参考:黒塗りのDNS)
「浸透」でごまかすことの弊害
- 待つ必要のない客を待たせる (客を騙す行為)
- 騙されていることに気づかない
- サービスの問題点に気づかない (キャッシュ・コンテンツ兼用など)
- 適切な設定確認を怠る (非再帰問い合わせでまず確認)
- 不適切な確認でネガティブキャッシュを入れて自爆する (いきなり再帰検索)
- 待った上でしか設定ミスや障害を疑わない
- そもそもいつまで待てばいいのかわからない
- DNS の仕組みの理解が進まない
- 間違った理解の浸透に手を貸す
- 「浸透いうな!」と言われて悲しい目にあう
- etc.
(このページのパーマネントリンクはこちらをお願いします)
以上、ご理解頂けましたら、、、