2012年09月04日

NSレコード使用不可なレジストラ提供DNSからの移転・ドメイン移管方法

レジストラ提供の無償DNSサービスには、NSレコードを設定できない場合がある。もしそんな業者を使ってしまっていたら、ドメインを他に移管して抜け出すのが面倒になる。

つまり、 http://jprs.jp/tech/material/iw2011-lunch-L1-01.pdf でいう正しいネームサーバ移転手段を取ることができない。
おそらく、これから完全に抜けだす次善策は次の通り。

ここで
移転先=新しいレジストラや自前で用意する新しいDNSサーバ
移転元=元のレジストラのネームサーバ
委任元=レジストリ(上位ドメイン)のネームサーバ
とする。

移転先DNSを正しく設定する
(ここで移転元のゾーンを書き換えたいができない)
委任元NSレコードを移転先にポイントし直す。並行してドメイン移管申請を他のレジストラで出す。
委任元ネームサーバ全てに直接アクセスし(dig +nssearch)、委任NSレコードが更新されたことを確認する
移転元DNSサーバを無効にする。(アカウント解約なり、DNSのオンオフが出来るならオフにするなど)

移転元DNSサーバのゾーンのmasterリロードとそのキャッシュがフラッシュされると、安全に移転先を利用できるようになる。
それまでは移転元DNSサーバに直接クエリをかけて、NSレコードが残っていないか調べ続ける必要がある。
消えない場合、移転元のレジストラに明示的にリロードとフラッシュを要請するしか無いが、おそらく良い返事は期待できないだろう。

追記
ISPなどのキャッシュに古い移転元を指すNSが残っているにも関わらず、移転元DNSが提供を辞めるため、移転元の配信していたルートノードを指すNSレコードのTTLか、ネガティブキャッシュのいずれか長い方だけ、ユーザがアクセスできない時間が発生する。
これは恐らく避けられないのでは?と思う。
posted by ko-zu at 01:42| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

ドメイン販売業者はかならずDNSサービスを提供しているのか

https://twitter.com/beyondDNS/status/242226610990903296
(1)ドメイン販売業者はかならずDNSサービスを提供しているのか。

レジストリ(トップレベルドメインの管理)とレジストラ(ドメイン登録代理店)をわけて考える。
個人的には、単にドメイン販売業者、と言われると両方を含むように思うからだ。


まずレジストリ、たとえばJPRSはjp.ゾーンを管理し、当然jp.ゾーンの権威サーバであるDNSサーバ群の*.dns.jp.を運用している。
レジストリではエンドユーザからの(現在はAPI経由、昔はレジストラ経由の書面だったかもしれない)要求に応じて、登録したドメインの所有者(例えばexample.jp.を登録した人)の希望する委任先を向いたNSレコードと、対応するグルーレコードを登録するサービス提供義務を負う。
こういう意味で、権威DNSサービスを提供していると言えるが、個々のレコード単位の共用であって、ゾーン設定ファイルごとまとめて、という意味なら共用DNSサービスは提供していない。


また、エンドユーザが不法行為に利用していると判断すれば、相当するレコードを削除することも出来る。ただし、いわゆる”DNS浸透言うな”の幽霊ドメイン問題の方には、キャッシュサーバの実装に依存するので無力だろう。
たとえばとても有名で誰もが使っているドメインが突然悪さをし始めた時、そのドメインの(元)所有者が悪意あるネームサーバを運用し続けることで、レジストリの管理する親の権威DNSサーバから委任NSレコードが消えても、相当の長期間にわたってアクセスが可能になるとおもわれる。そうした場合、そんなキャッシュサーバを運用するISPは非難されてしかるべきだが、今のところ幸運にもそういった事態は起きていないようだ。
visa.co.jpの際も、偶然発見した人が悪意を持たなかったため良かったが、彼が悪意的なネームサーバを運用していたら、ヘタすれば数週間は他のフィッシングサイトへ誘導出来る状態が続いたかもしれない。



一方、レジストラではエンドユーザの利便性のため、ゾーン単位で共用する共用DNSを提供していることが多い。
すでに書いたように、共用DNSでは、ユーザが要求するゾーンの所有権を確認することが必要になる。レジストラはエンドユーザが所有しているドメインを契約上知っているため、これを使ってドメインを乗っ取ることは不可能である。もちろん、正しくチェックが機能していれば。

多くのレジストラでは、提供している共用DNSには、A/MX/CNAMEのような一般的なレコードのみ登録していることを許可している。単純に管理コストのためだろう。
正しくチェックする人的リソースがレジストラにあるならば、ゾーン全体をエンドユーザに自由に編集させても問題は無いはずだ。
逆に、NSレコードを変更できないレジストラのサービスを使ってしまうと、通常委任先DNSの移転をともなう、ドメインの移管自体が困難になる。(追記・あるいはNSのTTL期間分のサービス中断を強いられる。)



レジストラによってはドメイン登録と紐つけられていない、別サービスとして、共用DNSを提供している場合がある。
たとえばValue-domainは誰でも使える無料共用DNSを提供しているし、さくらは同じ会社のレンタルサーバ部門に、レンタルサーバ利用者向けの無償共用DNSを提供している。
その他、 xname.orgなど単純に公共的なサービスとして無料DNSサーバを提供しているところもある。
これらはドメインの所有権が紐ついていないので、正しく登録時にチェックしないと不正な利用者がドメインを乗っ取ることが可能になる。

結局レジストラはほとんど、レジストラにユーザに契約したドメインをゾーンルートとするゾーンに限って、共用DNSをレコードを限定して提供している。ということが出来る。
posted by ko-zu at 01:19| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

DNSのRFCの問題点いくつか

RFC1034当時の記述を見ると、当時の想定と現在の実情の差異でセキュリティ上問題になる点がいくつかある。

権威のあるレコードに加え、権威を持たないレコードも追加で返すことを許容し、推奨してしまった。
当時は、あるゾーンについて権威のあるサーバは、暗黙に完全に信頼できると考えられていて、権威サーバへのリゾルバ・キャッシュ機能を信用して負荷分散してしまえる、と考えられていたようだ。推奨されるリゾルバの挙動には、単に権威のあるサーバや、ヒントとして設定されているリゾルバなりから返答を受け取ったら、(文法・リクエストID一致のセキュリティチェックをせず、)ユーザに返しキャッシュに入れる。と書いてある。

現在では、権威のあるサーバが(乗っ取りやポイズニングを含め)悪意を含んだ時に、委任元がそれを検知して排除するまでの時間差が十分ある。権威のあるレコード以外を破棄するか何らかの信頼性評価の後に返答し、リゾルバもそれをチェックすべきと定義するべきだった。


信頼済みサーバと権威の階層化を明確に定義しなかった

信頼出来るサーバ、例えば(程度によるが)DHCPの指定DNSサーバや、ISPのDNSサーバーや、ルートサーバは信頼して良いはずだ。
もしリゾルバのアルゴリズムに、信頼済みサーバを切り分けるポリシーが最初から定義されていれば、それらから返ってくる回答はそれがAdditionalであっても信頼してキャッシュしてしまって良く、それ以外は破棄する実装の指標が明示できた。
そうすればキャッシュの挙動がバージョンごとに変わるなんてこともなかったのではないか?

また、権威サーバはよりルートに近いほうがより高い権威があると定義されていれば、2つの異なるゾーンが権威を持ちうるNSレコード・グルーレコードの優先順が明示でき、浸透言うな(3)のようなNSレコードキャッシュの不用意な更新はRFC由来でなくただの実装ミスのバグと言えた。
posted by ko-zu at 00:25| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

共用DNSでのゾーンのチェックと権威

本来、サブゾーンを作るには、たとえ同じDNSサーバであって親ゾーンに対応する委任元NSレコードを必要とするが、少なくともBIND9はこれを確認しない。
例えば、親ゾーンが同一のBINDインスタンスに設定されているにも関わらず、NSレコードでの委任が記述されていない(擬似的な)サブゾーンをゾーン設定ファイルとして受け付ける。そして、一旦登録されてしえば、RFCどおり、よりリクエストに近いサブゾーン側を優先して解答する。

したがって、共用DNSサーバ管理者がユーザーの権限をチェックせずユーザーからのゾーン追加要求を受け入れると、同じ共用DNSサーバの他のゾーンのサブゾーンを乗っ取ることが出来る。つまりさくらの共用DNS問題になる。
これ自体は、BINDのnamed-checkconfの実装が、ゾーン登録時に委任関係の矛盾をチェックするよう実装してあれば問題はなかったと思われる。

ただし根本的には、共用DNSの管理者が、要求したユーザーがそのドメインの所有者であることを確認することが必要になる。
レジストラが共用DNSを運営していて、ドメイン登録管理アカウントと連携しているなら、ユーザがドメインの所有者であることは自明だが、外部から共用DNSへ受け入れる場合、確認は非常に困難になる。

本来、悪意あるゾーンが(他の登録済みゾーンと衝突しない限り)勝手に登録されていても、自身が権威あるDNSサーバと解答するだけでだれもアクセスしないはずなので問題は無さそう(追加セクションでのポイズニング問題は別として)に見えるが、ちょうどDNSサーバを移転しようとしていたり、ゾーンの衝突を確認せず二重登録を許容していたりすると、乗っ取りが可能になる。

簡易な運用では、ユーザーの要求をチェックせずとにかく受け入れ、しばらくしても委任元のNSレコードが対照共用DNSサーバを向かない場合は不正として削除する。
これは無料の共用DNSや、共用ウェブホスティングなどに付属する(無償オプションとしての)共用DNSで使われている。
たとえばvalue-domainの無料DNSはこの運用だった。
この方法では、応答の権威セクションや追加セクションを無制限に信頼する古いリゾルバ実装にポイズニングしうる。

より安全な運用では、ユーザがドメインの(レジストラに承認された)所有者であることを確認する必要がある。
それは委任元の(tldレジストリのDNSサーバ上の)NSレコードを編集する権限があるかでチェックすることができるのは、以前書いた。
もちろん、登録済みの他のユーザーのゾーンと矛盾がないか、といったチェックは依然必要だが。

レジストリがWhoisデータベースの一括ダウンロードといった提供をすることが無い限り、このチェック以外確認のしようが無いと考えている。
posted by ko-zu at 00:03| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

2012年09月03日

RFCからDNS関連用語ほか

http://www5d.biglobe.ne.jp/%257Estssk/dns.htmlなどを参考に。


ドメイン名空間
DNSが管理する空間全体を指す。ルートノードから広がる名前全体。ルートが上位あるいは親、末端が下位あるいは子の方向とする。
大文字小文字は区別されない。(が実装はそれを保存すべき、とも)

リソースレコード
SOAレコードを始めとする個々の情報。
オーナー(対応ドメイン)、タイプ(A/NS/SOA)、クラス(今はINインターネットのみ)、TTL(有効期限秒数)、RDATA・資源テータ(目的のデータ)で構成される。

ノード
リソースレコード(DNSでは木構造でいうリーフ=葉もノードと扱う)やゾーン分割の根・節点。
ゾーンはそれぞれ固有の一つのノードをゾーンのルートとして持つ。

ラベル
いわゆるホスト名。"" (BIND実装ではでは@で書き表すがDNSのプロトコル上では空文字そのもの)をゾーンのルートとして扱う。
63文字以下。BINDでいうホスト・ラベルと違うのは、ピリオドを許容しない点。

ドメイン名の表記
ドメイン名を記述する時は、
完全な表記(いわゆるFQDN、絶対ドメイン名)は末尾に"."をつけてラベルのリストをつなげたもの。たとえば"www.example.com."(最後の.のあとに""空文字がある)
ローカルドメイン(=文脈が属するドメイン)がわかっているときは相対表記。これは末尾に.がつかないので区別出来る。
特定のローカルドメインを指すのでなければルートから相対とみなす。
# とするとゾーンのSOAレコードに対応するドメインは例えば ".example.jp"と書くべきか?。


サブドメイン
あるドメインにの下位(子孫)に属するドメイン。直下のみを指す直接サブドメインという派生も。

委任
あるゾーンの中から、一部のノードとその先のゾーンの権限を他者に渡すこと。NSレコードで実現される。
#このブログでは親ゾーンを委任元、サブゾーンを委任先と読んでいる。

NSレコード
ラベルでゾーンの切れ目を定義し、データでネームサーバを指定する。
NSレコードと必要ならグルーレコードは、小ゾーンを管理するネームサーバの応答と一致するべきである。

SOAレコード
ゾーンごとに一つ、ゾーン管理者のゾーン管理ポリシーを記述する。

CNAMEレコード
別名=エイリアスを定義する。ドメイン名に対して一つだけ定義できる。

ゾーン
あるノードに対して、そのノードより下位に属する全てのノードの内、分割して委任していない部分。
ゾーンに含まれる情報は、
・分割して委任したゾーンを除く全ての権威レコード
・ルートノード自身に対応するレコード (上の一部)
・委任する先のゾーンのルートを示すレコード、
・委任する先のゾーンに属するが、NSレコードと委任先ネームサーバにアクセスするのに必要なレコード(グルーレコード)



権威データ・権威レコード
The authoritative data for a zone is simply all of the RRs attached to
all of the nodes from the top node of the zone down to leaf nodes or
nodes above cuts around the bottom edge of the zone.
ということで、NSやグルーレコードを含め、ゾーンに含まれうるレコード(=リーフ)は全て権威があることになる。
RFC2181 6.1で注釈、(NSレコードやグルーレコードはゾーンのリーフでもあるが)NSやグルーレコードを含まず、そのほかゾーンに含まれうるレコード(=リーフ)は全て権威があることになる。
分割委任先のドメインに対応するレコードは全て権威をもたない。




DNS要求について
要求するドメイン名と、要求するタイプ、再帰クエリ要求の有無や、現在ほぼ無意味なクラスなどパラメータを渡す。


DNS応答について
回答セクション
要求ドメインに完全に一致したレコード、およびCNAMEでのエイリアス先ドメインのレコードのリスト。
回答のAAビットフラグは、この内要求ドメインに一致したレコードが権威あるものであることを示す。CNAMEで解決したものについては何も言わない。

したがって、要求ドメインへの回答がCNAMEレコードなら、リゾルバはCNAMEのエイリアス先が権威あるDNSサーバ・信頼済みサーバからの回答かチェックする必要がある。

権威セクション
応答するDNSサーバが、権威があると知っているゾーンについて記述するセクション。
例えばDNSコンテンツサーバは、要求されたドメインについて自身が権威を持っているなら(委任されていなければ)そのゾーンのルートゾーンに対応するNSレコード、委任済みで権威を持たないなら委任先のNSレコードを含めて返す。

追加セクション
DNS応答の一部。NSやCNAME、MXなど、DNSサーバが応答を生成する時点で、RDATAがドメイン名を指し、将来リゾルバが問い合わせるだろうとわかっているとき、(気を利かせて)自身のキャッシュから追加して良い部分。また、全く知らないドメインを要求された場合、tldやルートゾーンなど、部分的なドメインに関する権威あるネームサーバについてキャッシュがあれば、これもここで返してよい。

注。
これを無制限に信頼してしまうと、キャッシュポイズニングの原因になる。信頼済みの例えばISPのフルリゾルバからの応答であったり、同じ権威DNSサーバが権威を持っている(再度問い合わせることになるだけの)レコードであれば信用してよいだろうが、インターネット上の特に信頼しているわけでないDNSサーバから返された追加セクションは無視すべきである。また、ネット全体に向けて公開するコンテンツサーバでは、どうせ無視される追加セクションは無効に設定してしまっても良いしそうすべきだ。(BINDの、addition-from-cache: no)。


DNSサーバの区別

フルリゾルバ
再帰要求を受け付け、自分で全て解決して応答を返せるDNSサーバー。

スタブリゾルバ
再帰要求を受け付けるが、単に他のフルリゾルバに転送・フォワードして、そこからの結果を返すリゾルバ。結果をキャッシュすることが主目的。
上記2つが主にキャッシュサーバと呼ばれるもの。

権威サーバー
権威をもつレコードを保持するDNSサーバー。内部的にキャッシュも(暗黙に)持っていることになっている。

マスターサーバ
ゾーンのマスターファイル(ゾーン設定ファイル)をもち、SOAレコードで指定される。セカンダリサーバはここに問い合わせて、ゾーン全体を更新する。ふつうNSレコードに載る権威サーバの一つ。

セカンダリサーバ
ゾーンのマスターを持たない、ゾーン転送で受け取ったコピーのみを持つ権威サーバ。



以下はRFCに直接提示されていないが一般的ぽい呼称として、
コンテンツサーバ
ゾーンについての情報を持ち、(外から権威があるとみえるかはべつとして)自身が権威サーバであると認識しているDNSサーバー
たとえば、非公開のマスターサーバで公開されているスレーブサーバはSOAレコードのにのみ現れてNSレコードには現れない、など。

プライマリ・スレーブサーバ
それぞれマスター・セカンダリサーバに対応

キャッシュサーバ
リゾルバに対応。
posted by ko-zu at 23:47| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

ネームサーバ移転と共有ホスティングからの転出時障害

ネームサーバの移転時には正しく移転シないといつまでも古い情報が残り続ける。といういわゆる『DNS浸透言うな』の http://www.e-ontap.com/dns/propagation/pinning.html 
についてhttps://twitter.com/tomyuk 氏からご指摘いただいた。

概説すると、
DNSでは委任元と委任先で同じNSレコードが設定されていることを要求している。もし、この前提が崩れて委任元と委任先で異なるレスポンスが帰ったらどうすべきか? 委任関係の原則から言って、委任の情報を優先して、間違った委任先を無視するべきである。ところが、古いキャッシュサーバでは委任先の情報を信用してしまう=キャッシュが古い情報で汚染されるというバグがある。

ルートからたどれば間違っているとわかるため、DNSキャッシュサーバーがリブート(キャッシュを消去)されると正しい情報になったように見える。
リブート頻度はISPのメンテ頻度によってまちまちなので、あるプロバイダでは接続できて、あるプロバイダだけ接続できない、という状況が発生しうる。
そして実際に発生した http://www.e-ontap.com/dns/propagation/

これを防ぐには、
ネームサーバを切り替える時には移転元のゾーンも移転先と同じ新しいゾーンに更新すること
が最大の解決法になる。
逆に言えば、共有ホスティングのユーザーが、共有DNSに所有ドメインを委任していた時に、何も考えず委任元のNSレコードだけ差し替えた場合、このバグにヒットする場合がある。ユーザーのDNSへの認識レベルによってはありうる事態だ。

氏の指摘は、このシナリオにおいてもプロなら顧客が安全に利用できる手段を取るべきだ、というものだと自分は解釈した。
自分はそんなシナリオでの障害は自己責任であって、DNSのよく言われる注意点を確認しない最悪シナリオだ、と考慮の埒外に置いていた。

その点を反省し、より安全な設定を考える。

まず、単純に移転元のDNSの設定や改善では無理がある。委任元のNSが変わったことを、master/slaveゾーン持ちの(自身を権威と思っている)サーバが知る術は無いからだ。これは外部的に情報を与えてやるしか無い。

自分が考えうるのは、

1.@ IN NSレコードをhint扱いとする。つまり通常はauth/additionalセクションを返さないようにして、委任元サーバへの問い合わせ結果を得てから、それを返したりゾーン転送に使用することを許可する。そうすれば負荷が上がるかもしれないが汚染は起きない。これはBIND設定でできるかもしれない。探してみる。
additional-from-auth, additional-from-cacheをnoにすることで意図的にNSをクエリしない限り大丈夫とは思うのだが。

2.定期的にルート(か信頼出来るtld)からキャッシュなしのdig traceして、対応するNSレコードが一致するかチェックする。(上位サーバのNSにはmasterがあるのだからキャッシュ汚染されることはあり得ない。)

一日あたり1クエリくらいして、もしNSが予想外に変更されていたら、 "@ IN NS namesever" だけを上書きした新しいゾーンに自動更新する。
他のレコードが間違っているかも知れないが、NSさえ更新されていれば、TTL時間内にキャッシュ汚染は消える。

という事でもしより安全かつユーザフレンドリな実装を行いたいとしたら、2の手段を提案する。
さくらのように極端に多数のゾーンを一括ホストしているのでも無い限り、TLDのサーバに一箇所から負担をかけたり、処理に時間がかかりすぎる(ほとんどの利用者は多段委任なんてしないだろう。)なんてことは無いと考える。 少なくともWHOISを確認したりするよりもずっと安全だし、低コストだろう。

#こういう不正な委任関係をチェックしてゾーン編集するスクリプトはDNSやるとき一回は書いてみたことあると思う。スクリプト言語の練習にもなるし。

大変長いこと暇人に付き合っていただいた  @tomyuk @beyondDNS 両氏に感謝。
posted by ko-zu at 01:35| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

2012年09月02日

共有サーバホスティングでのドメイン・アカウント紐付け方法

ホスティング事業者は、自社サービスのアカウントとドメインの紐付けについて理想的にはこのようにすべきと考える。

まず業者example.netは顧客ドメインホスティング用のDNSサーバとして

dns1.example.net. IN A 1.1.1.1
dns2.example.net. IN A 1.1.1.2
dns3.example.net. IN A 1.1.1.3
さらに認証用に
*.domaincheck.example.net . IN A 1.1.1.3
を持っているとする。(ゾーン表記にしました)

In. アカウントから委任したいゾーンexample.com.の申請を受ける場合

事業者はネームサーバを顧客に伝えるがその時、
dns1.example.net.
dns2.example.net.
に加え、ランダムに選んだホスト名abcedfを付加したabcdef.domaincheck.example.net.をdns3の替りに通知する。
IPは同じなのでDNS上問題はない。(キャッシュサーバに少しだけ迷惑だけど) (IPを登録うんぬん修正しました)

顧客はdns1, dns2に加えabcdef.dnscheck.example.net.に向けてNSレコードを設定する。

事業者はexample.com.のNSレコードが、abcdef.dnscheck.example.net.へ正しく委任元DNSに登録されたことを確認し、example.comをアカウントと紐つけ、認証完了とする。さらに、以前の顧客に同じドメインを持っている人が居るかもしれないので、example.comがすでに自社のDNSやアカウントデータベースに登録されていないかチェックし、あればそれを削除する。

これでもう登録はすんだので*.dnscheckからdns3.example.net.に変更してもらう。(負荷的な意味なので必須という程でもない。)
委任元のNSが正しく自社のdns*.example.net.を指している限り、アカウントとドメインの紐付けは正しい。
紐付けの確認が必要なときは、上位レジストラのDNSに一回クエリして確認するだけで足りる。

Out. アカウントがドメインを他に持ち出す場合
出来れば連絡が欲しいがそんなものしてくれない顧客も多いだろう。

正しく設定されたサーバは委任元DNSのNSレコードの変更に追従してくれるので、業者のdns1〜3へのアクセスはなくなりただ事業者のデータベースの中に残るだけなので、しばらくはそのままで問題ない。
次にドメインとアカウントの紐付けの確認が必要になった時、上位レジストラにNSレコードをクエリしてNSが変わっていることに気づくから、その際に除去できる。

もちろん、lameになっていることに違いはないので、定期的にチェックして除去すべきだろう。
また、正しくない設定の不味いデュアルロールDNSを立てていると、中の人が新しいNSにアクセスできなくなる



上記のような確認を怠ると、ヒトのドメインを勝手に登録できてしまう某社のような共有ホスティングが出来上がる。
posted by ko-zu at 16:37| Comment(2) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

DNSコンテンツサーバとキャッシュサーバを分ける理由

はじめに言っておくと、だいたいBIND8のせいです。

(少なくとも昔の)BINDは、masterなゾーンが設定されているとき(recurseな)クエリを受けると、自分が権威サーバかチェックすることなく、単にそれを返す。したがってドメイン所有者が転出してしまったあと、ドメイン所有者とDNSサーバ提供事業者(webホスティングとか)の間で意思疎通がなくなって、Lameなmasterゾーンが残っていると、そのDNSをキャッシュとして使っている内側のユーザには古いlameなゾーンの情報が返され続けることなる。
またゾーン管理スクリプトの委任関係のチェックが甘いと、不正な(当然lameな)ゾーンを突っ込まれる可能性もある。これが直ぐDNSのポイズニングにつながるかどうかは、正しく設定されているかによる。

もちろん、DNSキャッシュとコンテンツが同一のマシン・プログラムで動いていても、セキュリティ・ポリシーとして、キャッシュする際には権威があるサーバー(つまり自分になるはず)までルートから必ず確認しに行くように設定できればいい。

ISCのBIND9 http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.html document view statements あたりを読むと、Bind9で導入された viewを内向きと外向きで切り替え、内向きはキャッシュ動作させ、外+内向きはコンテンツのみ動作、さらにキャッシュを独立させる(これは少なくとも9.9ではattach-cacheなしがデフォルト)やや面倒な設定をすることでできそうです。


acl local {
192.168.0.0/16;
// このサーバを信頼してくれてる人。お客様は神様です
};

options {/* 全略 */};

view "cache" {
match-recursive-only yes;
// 再帰はキャッシュを通す
// これ設定しないと無限ループするよ!!!


match-clients {127.0.0.1/8; local;};
// 内向きのみ


recursion yes;

include "local.conf";
// RFC規定のhintやローカル関連ゾーンのリスト

include "admin.conf";
// DNSサーバ管理者がメンテしているmaster/slaveゾーンのリスト
// これ信用出来ないならこの鯖意味ないよね

// ここに少しでも不安があるゾーンをincludeしちゃダメ

};

// BINDは+norecurseで探索するのでクエリはこっちに来ます
// forwardするなら同居する意味ないよね

view "userzones" {
match-clients {any;};
// 自分も含めること
recursion no;

include "local.conf";
include "admin.conf";

include "user.conf";
// ユーザーから要求されたmaster/slaveゾーンのリスト
// 管理者がいくらチェックしてても一時的にLAMEってる可能性はある

// ここでattach-cacheはダメ!絶対!
// 今のところattach-cacheはただの参照で階層化してるわけじゃないんです! BIND9.9doc
};
// typo直しました

つまり言いたいことは、
DNSキャッシュ(リゾルバ)と、DNS管理人がメンテしてるゾーン(絶対に信頼出来る)と、ユーザーのゾーン(いくらか嘘が混じっているかも)を区別してください。ってことです。

ただこの方法は、LAMEな設定が残っているのを見逃すことにもなるので、定期的にチェックしてlameな設定やバグで変なレコードがuser.confに入ってないかチェックはしましょう。
posted by ko-zu at 13:45| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

DNS Summer Days 2012 togetterまとめからの感想

DNS Summer Days 2012について個人的感想をまとめてみました。
参加しておらずまとめhttp://togetter.com/li/365750 依存の情報のため詳細が間違っていたら申し訳ありません。


ホスティングへのドメイン受け入れ
まずドメインをさくらのNSに振り向けたが対応するサーバが未契約や解約済みの時、乗っ取りが可能。これは独自ドメインを外部から受け入れるほとんどのホスティングで同じことが言える。
対策としては、WHOIS情報によるメール認証を入れる https://twitter.com/goto_ipv6/status/241710112396435457 、といった所有者認証をホスティング側で実装する(完全)か、レジストラのLAMEチェックに頼る(乗っ取り後は無力)。所有者の自己責任に頼る(悪用されたら?)かのいずれか。悪用時のサーバー没収リスク的に言えば、所有者認証を組み込むのが最善手とおもわれる。ユーザエクスペリエンス的にWhoisいじらせるのは最悪だけど。
(追記:少し詳しく書きました 
http://causeless.seesaa.net/article/289854678.html )

ホスティングとゾーン分割
twitterの内容ではあまり詳細が負えないが・・(ゾーンとホストを混同している?ように見える。)
まず考えうるのはホスト登録時のチェック方法のバグ。ホスティングでは顧客が申請したドメインが本当にホスティングサーバに向いているかチェックする必要があるが、これが漏れていたり、定期的におこなっていなかったりすると、同じサーバを向いた他人のゾーンの中からホスト名を奪ってしまうことがあり得る。これも他の共有ホスティングサイトでは起こりうるし、実際に目にしたことがある。
これはさらに2通り考えられ、1つは共有DNSコンテンツサーバへのホスト登録スクリプトの脆弱性で、ゾーンごと委状されている他人のDNSゾーンファイルの中に、勝手にホストを登録できる場合。もう一つは、正規の所有者が不用意にワイルドカードレコードを設定してしまったがために、その(擬似的なゾーンの)中からホスト名をHTTPサーバのバーチャルホスト機能に登録できてしまう場合
いずれも、ホスト名を設定しようとする利用者と、ドメイン・ゾーンの所有者の権利関係の確認を行えば完全に回避できるが、実装は考えるだに面倒そうだ。


親子同居問題
他にもコメントを見ると親子同居問題を指しているらしいものがある。
ゾーンを更に切り分けて同じDNSサーバに委任すると、ゾーンファイル2つで管理することになるが、親=根に近い方のゾーンに、子のゾーンに含むべきホスト名を(ピリオド付きホスト名やワイルドカードで)登録できてしまう。これが杭違えば子のゾーン側の同一ホストにアクセスできなくなる。
もちろん委任先と委任元は信頼関係にあるはずだから、これはバグでなく利用者側の問題だろう。


DNSポイズニングによる検閲ISP
かの?Anonymousが書いたらしい論文。DNSポイズニングをすることで、ファイル共有や違法ポルノや薬物関連サイトへのアクセスを困難にする検閲手段がある。これは自分が広告除去に使っているのと全く同じ手法だ。検出方法として公開リゾルバからやTTL変化で検閲者を特定できる。(要はそいつを叩き潰せ、と)


TLSA
HTTPSに使う証明書をDNSSEC経由で安全に配信しようという方法。通常ブラウザは一番最初に必要なルート証明書(Verisignとか)を持っているわけだが、同じようにDNSリゾルバもルートDNSの証明書を内蔵している。ということはDNSの委任関係をそのまま使って証明書を配信すればうまくいくんじゃないか?という話。
Verisignのような市場寡占事業者に依存することなく誰でもドメインレジストと同程度に自由に証明書を発行できるので、嬉しいことは嬉しい。ただHTTPSのEV(強化された実在認証)は利用しようがない。あくまで、ドメイン名と接続先が一致することを証明するだけで、ドメイン保有者がどの程度信頼出来るかの指標には全くならない。
まあそもそもEVなんてソーシャルなレベルの詐欺師を排除できるわけじゃないので意味もないと思うんだけど。あくまでVerisignへのちょっと高いお布施に対するご利益をどれだけ信用できるか、に置き換わるだけ。


posted by ko-zu at 02:06| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

2012年09月01日

DNS設定のおかしなところ

DNS設定のおかしなところはwindowsでもチェックできる。
c:\>nslookup
> set type=any
> takeo-mylib.jp
サーバー:  ****
Address:  *.*.*.*

権限のない回答:
takeo-mylib.jp  internet address = 210.252.128.116
takeo-mylib.jp  nameserver = dns3.odn.ne.jp
takeo-mylib.jp  nameserver = ns.coara.or.jp

takeo-mylib.jp  nameserver = dns3.odn.ne.jp
takeo-mylib.jp  nameserver = ns.coara.or.jp
ns.coara.or.jp  internet address = 192.244.1.1
dns3.odn.ne.jp  internet address = 143.90.130.58
> server 143.90.130.58
既定のサーバー:  dns3.odn.ne.jp
Address:  143.90.130.58

> takeo-mylib.jp
サーバー:  dns3.odn.ne.jp
Address:  143.90.130.58

権限のない回答:
takeo-mylib.jp  nameserver = dns3.odn.ne.jp
takeo-mylib.jp  nameserver = ns.coara.or.jp

takeo-mylib.jp  nameserver = ns.coara.or.jp
takeo-mylib.jp  nameserver = dns3.odn.ne.jp
ns.coara.or.jp  internet address = 192.244.1.1
dns3.odn.ne.jp  internet address = 143.90.130.58
ラベル:DNS 武雄市
posted by ko-zu at 13:26| Comment(0) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。