2013/06/30 Category : 覚書 development DNSリバインディングとその対策(nginxとapache) DNSリバインディングというのは、IPスプーフィングがIPアドレスを詐称するのに対し、ドメイン名を詐称して攻撃対象のサーバに不正にアクセスすること。 なんとなく分かったような分からないような説明だが、つまりこういうことだ。例えば、ある攻撃者がターゲットとするサイトに第三者を介して攻撃を仕掛ける場合1.攻撃者はまず自分で罠サイト(http://xxx.com/attack(IP:123.1.2.3))を作成し、不特定の第三者にメールや掲示板を通じてアクセスさせる。(「期間限定セール情報!」等と称してURLを記載したメールをばらまくとか)2.何も知らない第三者が罠サイトにアクセスしたら、その直後にDNSサーバの設定を変更して自分のサイトのドメイン名xxx.comに対応するIPアドレスを攻撃ターゲットのサイトのもの(例:203.3.4.5)に書き換える。3.第三者がアクセスしたhttp://xxx.com/attackに、5秒毎とかにxxx.comにアクセスし直すJavaScriptが仕込んでおくと、定期的にxxx.comへのアクセスが試みられる。4.このときxxx.comに対応するIPはターゲットサイトのものに既に変更されているので、ブラウザはターゲットサイトにリクエストを送る。ざっくりとした仕組みはこんな感じ。この仕組みを、CSRFやDoS攻撃などに利用される可能性がある、ということだ。で、ターゲットになったサイトはどうやってこれを防ぐべきか、という話だが、まず5.ターゲットサイトのサーバが受け取る情報にはリクエストホスト名(Hostヘッダ)が含まれる。この攻撃をされた場合、サーバが受け取るリクエストホスト名は自サイトの物ではなく、必ずxxx.comになっている。6.だから、ターゲットサイトのサーバは「リクエストホスト名が自サイトのものでない場合はリクエストを処理しない」ようにすれば、この攻撃を回避することが出来る。7.そのためには、プログラム側で対策することも出来るし、サーバ側で対策することも出来る。8.サーバ側で対策するなら、名前ベースの仮想ホストを使うと簡単。apacheなら以下のようにダミーの仮想ホストを作成すれば良い。#ダミーのバーチャルホスト(dummy.example.jp)<VirtualHost *:80> ServerName dummy.example.jp DocumentRoot /var/www/dummy ErrorDocument 404 /index.html</VirtualHost>#正規のバーチャルホスト<VirtualHost *:80> ServerName www.example.jp#以下略ダミーの仮想ホストは全ての仮想ホストの一番上に記述する。そうすることによってこれがデフォルトのサーバとなり、ServerNameが他の仮想ホストとマッチしない場合はこれが使われる。また、nginxで対策するは以下が参考になる。http://nginx.org/ja/docs/http/request_processing.htmlここに書いてある通り、仮想サーバの挙動はapacheと同じようだ。つまり、1つ以上の仮想サーバがあり、Hostヘッダがそのどれともマッチしない場合、nginxはデフォルトのサーバを使おうとする。 デフォルトサーバは、通常は一番上に書かれているサーバ。なので、対象サーバの仮想サーバ設定より上に適当に設定を書いておけば、サイト名がマッチしない場合はそのサーバを使うようになる。このサーバに403とかをおいておくなりなんなりすれば良い。これが対策方法その1。 デフォルトサーバは、default_serverという名前で以下のように明示的に指定が出来る。これならどこに定義しても大丈夫。あとはその1の対策と一緒。これが対策その2。server { listen 80 default_server; server_name example.net www.example.net; ...} 最後の方法としては、nginxはHost名が未定義の場合、以下のように書くことで全てのリクエストをdropし、接続を閉じることが出来る。この設定は、そのままDNSリバインディングに対しても有効だと思われる。server { listen 80 default_server; server_name _; return 444;}444はnginxの特別なステータスコード。ということで、nginxを使う場合はこの設定もアリだな。それにしても、こんな面倒なことをしてまで悪いことをしたい奴らというのは、いったいどういう人種なんだろう。いつも不思議に思う。 PR