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