セカンダリDNSをNSDにしてみた

DNS
Published: 2011-11-23

 Bindの脆弱性祭を受けて、「プライマリとセカンダリの両方をBindで運用する事が脆弱性なんじゃね?」と思いつき、セカンダリDNSサーバをNSDで再構築してみました。以下諸々メモ。

 yumにはパッケージが存在しなかったので、公式からダウンロードしてきて、何も考えず./configure ⇒ make installを実施。無事インストール完了。

 /etc/nsdディレクトリ配下にnsd.conf.sampleがあったので、これをnsd.confにコピーして設定ファイルを作成。

server:

	hide-version: yes
	chroot: "/etc/nsd"

zone:
	name: "aimless.jp"
	zonefile: "aimless.zone.signed"	
	allow-notify: 49.212.54.72 NOKEY
	allow-notify: 127.0.0.1 NOKEY
	request-xfr: 49.212.54.72 NOKEY

 デフォルトではchrootが無効となっていたので、chroot: “/etc/nsd”のコメントアウトを削除してとりあえず起動してみる。⇒エラーが出て起動せず

/etc/nsd/nsd.conf: pidfile /var/run/nsd.pid is not relative to chroot /etc/nsd.
/etc/nsd/nsd.conf: databasefile /var/db/nsd/nsd.db is not relative to chroot /etc/nsd.
/etc/nsd/nsd.conf: difffile /var/db/nsd/ixfr.db is not relative to chroot /etc/nsd.
/etc/nsd/nsd.conf: xfrdfile /var/db/nsd/xfrd.state is not relative to chroot /etc/nsd.
/etc/nsd/nsd.conf: 4 semantic errors in 1 zones, 0 keys.

 「設定ファイル上のファイルパスがchroot環境とは異なっているからかな?」と判断し、nsd.conf上のファイルパスを/etc/nsd/・・・に書き換えて起動してみる⇒「nsdユーザがないよ」エラーが出て起動せず。

server:

	hide-version: yes
	database: "/etc/nsd/var/db/nsd/nsd.db"
	pidfile: "/etc/nsd/var/run/nsd.pid"
	chroot: "/etc/nsd"
	difffile: "/etc/nsd/var/db/nsd/ixfr.db"
	xfrdfile: "/etc/nsd/var/db/nsd/xfrd.state"

zone:
	name: "aimless.jp"
	zonefile: "aimless.zone.signed"	
	allow-notify: 49.212.54.72 NOKEY
	allow-notify: 127.0.0.1 NOKEY
	request-xfr: 49.212.54.72 NOKEY

 nsdユーザが無いと言われたのでuseraddして再度起動⇒エラーなし。しかし、プロセス上にnsdなし。。。DBを作成してないからかな?ということでrebuildコマンドを試す⇒エラー

# /usr/local/sbin/nsdc rebuild                 
/usr/local/sbin/nsdc: line 141: /etc/nsd/var/db/nsd/nsd.db.lock: そのようなファイルやディレクトリはありません
cat: /etc/nsd/var/db/nsd/nsd.db.lock: そのようなファイルやディレクトリはありません
database locked by PID:
stale lockfile, removing...
/usr/local/sbin/nsdc: line 141: /etc/nsd/var/db/nsd/nsd.db.lock: そのようなファイルやディレクトリはありません
lock failed

「確かにないな」ということで、/var/dbをchrootである/etc/nsd/にまるまる移動。さらに/etc/nsd/var配下の権限をnsdに変更してrebuild⇒いけたっぽい。

# /usr/local/sbin/nsdc rebuild                 
zonec: reading zone "aimless.jp".
warning: slave zone aimless.jp with no zonefile 'aimless.zone.signed'(No such file or directory) will force zone transfer.
zonec: processed 0 RRs in "aimless.jp".
zonec: done with no errors.

 起動時のログを確認すべく/var/log/messagesにみてみるが何も出ていない。nsd.confにログの出力場所を追記する。⇒空のログファイルを作成し、権限をnsdユーザに変更する。⇒無事ログの出力を確認。

 無事出力されるものの、時刻がUNIXTIMEで表示されてしまう。。。unboundのlog-time-asciiオプションを試してみるも、エラーが出て起動しない。残課題なので何とかしたい。

server:

	hide-version: yes
	database: "/etc/nsd/var/db/nsd/nsd.db"
	logfile: "/var/log/nsd.log"
	pidfile: "/etc/nsd/var/run/nsd.pid"
	chroot: "/etc/nsd"
	difffile: "/etc/nsd/var/db/nsd/ixfr.db"
	xfrdfile: "/etc/nsd/var/db/nsd/xfrd.state"

zone:
	name: "aimless.jp"
	zonefile: "aimless.zone.signed"	
	allow-notify: 49.212.54.72 NOKEY
	allow-notify: 127.0.0.1 NOKEY
	request-xfr: 49.212.54.72 NOKEY

 「よし停止してみるべ」とnsdc stopを試すも、nsdが停止しない。nsdのプロセスは上がっているのに、nsdc stopの結果がnsd is not runningとなる。「なぜだ」とログを見てみると、複数のエラーが

[1321630089] nsd[21484]: error: could not open file /var/db/nsd/ixfr.db for append: Permission denied
[1321630089] nsd[21486]: error: cannot open pidfile /var/run/nsd.pid: No such file or directory

 「確かに作ってないな」ということでpidファイルを作成し、/etc/nsd/var配下の権限をnsdユーザに変更する。⇒nsdc start/stopが出来るようになった。

 プライマリDNSのBindをRestartした所、セカンダリDNSも問題なくゾーンの問い合わせに応答するようになった。bind⇒nsd間のゾーン転送って問題なくできるのか。すごいな。。。。

 DNSの設定チェックで動作確認をしたところ、IPv4は問題なく動くのだがIPv6が応答しない。HEのトンネルを疑うも、外部からのPingとTracerouteは問題なし。「なんでだろー」ととりあえずnsd.confにIPアドレスを明記し、デフォルトでnoなはずのonlyオプションを両方とも明記してみたところ、IPv4/IPv6両方で応答するようになった。デフォルトのワイルドカードだとIPv6が動かないのだろうか。

 現在のnsd.confは下記の通りです。とりあえず動くNSDなセカンダリDNSサーバが出来たので、Bindに超致命的な脆弱性が見つかった場合にはプライマリDNS自体を落とせばいいですね。

server:
	ip-address: 163.43.161.163
	ip-address: 2001:470:36:3cd::1
	
	hide-version: yes
	ip4-only: no
	ip6-only: no
	database: "/etc/nsd/var/db/nsd/nsd.db"
	logfile: "/var/log/nsd.log"
	pidfile: "/etc/nsd/var/run/nsd.pid"
	chroot: "/etc/nsd"
	difffile: "/etc/nsd/var/db/nsd/ixfr.db"
	xfrdfile: "/etc/nsd/var/db/nsd/xfrd.state"

zone:
	name: "aimless.jp"
	zonefile: "aimless.zone.signed"	
	allow-notify: 49.212.54.72 NOKEY
	allow-notify: 127.0.0.1 NOKEY
	request-xfr: 49.212.54.72 NOKEY