Tomcat(Java)を使うとDNSの変更が反映されない件 [職]
メールサーバの変更に伴うDNSレコードの変更が反映されなかったのでメモ。
今回、メールサーバをリプレースした。
DNSがらみでトラブったのでご参考までに。
以下の例で説明しよう。
変更前サーバ:192.168.1.1 ホスト名:aaa
変更後サーバ:192.168.1.2 ホスト名:bbb
SMTPやPOPなどはDNS上ではCNAMEとして登録する。
DNSレコードの例(変更前)
aaa A 192.168.1.1
smtp IN CNAME aaa
DNSレコードの例(変更後)
aaa A 192.168.1.1
bbb A 192.168.1.2
smtp IN CNAME bbb
上記のように変更する事によって、クライアント側での変更を最小限にする。
DNSの変更を素早く反映させるために、TTLを短縮する(86400秒=1日を600秒=10分に変更)
この設定変更により一部のサーバを除いて無事に変更が反映された。
反映されなかった一部のサーバではTomcatが動いていたため、この辺に何か問題があるのではないかと思われた。
まず、基本的な知識として確認。
Linuxの場合、/etc/nsswitch.confの中でホスト名の探索順位が決められている。
例)hosts: files dns
上記の例では、まず、ホスト上のファイル(/etc/hosts)を参照し、その後DNSによる探索を行う。
DNSの探索を行う際には/etc/resolv.confで指定したネームサーバに問い合わせを行う。
Windowsの場合
hostsファイルを参照し、その後、ネットワークのプロパティで指定したDNSサーバに問い合わせを行うのは同じである。
しかし、DNSサーバに問い合わせを行う前にリゾルバキャッシュを確認する。
このキャッシュの内容は以下のコマンドで確認できる。
# ipconfig /displaydns
参考
このキャッシュの保持期間だが、ポジティブキャッシュは1日(86400秒)、ネガティブキャッシュは15分(900秒)とのことである。
このため、OSレベル、ネットワークレベルではキャッシュが永続化する仕組みはないため、DNS変更が反映されるはずなのだが、Tomcat(Java)を使っているとTomcatの再起動をしないと反映されない。
色々調べた結果、Javaのプロパティのひとつ(networkaddress.cache.ttl )が影響している事が分かった。
このプロパティ、デフォルトでは-1となっており、「ずっとキャッシュ」する。
参考
この値を変更するには、java.securityというファイルの中で値を変更する。
ただし、変更にあたってはDNSスプーフィング攻撃に気をつけてねということらしい。
結局、消極的対処としては従来通り、Tomcatを再起動すると言う方法が考えられる。
もう一つは、リスクを取ってこのプロパティ(networkaddress.cache.ttl)を変える。
というわけで、デフォルトではJava系を使っているサイトは再起動が必要になることは覚えておこう。
関連情報として、「DNS Rebinding」DNS攻撃手法というものが興味深い。
4年も前のものだけど全然知らなかった。勉強になります。
力石 健次 DNS rebinding attackの対策と考察
徳丸浩の日記 DNS rebinding
この元になっている論文はこちら。(あとで読む)
Collin Jackson et,al
Protecting Browsers from DNS Rebinding Attacks
ACM CCS 07
コメント 0