ISC BINDの動的更新環境を試してみたくてやってみました。環境はCentOS 7.5.1804です。
SELinux 有効のまま、ゾーンの動的追加とゾーンの動的更新 2 つを実施できる環境を目指します。
ゾーンの動的追加
/etc/named.conf の options に allow-new-zones yes を追加して named サービスを起動します。
[root@dns1 ~]# vi /etc/named.conf
[root@dns1 ~]# systemctl start named.service
ゾーンファイルを作成します。ここではファイルを作成しているだけで、このファイルを使ったゾーンの追加は後ほどrndcコマンドで実施します。
[root@dns1 ~]# cat <<__EOF__ > /var/named/example.com.db
\$ORIGIN example.com.
\$TTL 86400
@ IN SOA dns1.example.com. hostmaster.example.com. (
2018040101 ; serial
21600 ; refresh after 6 hours
3600 ; retry after 1 hour
604800 ; expire after 1 week
86400 ) ; minimum TTL of 1 day
;
IN NS dns1.example.com.
;
dns1 IN A 192.168.110.71
__EOF__
[root@dns1 ~]# chown named: /var/named/example.com.db
[root@dns1 ~]# chmod o-rwx /var/named/example.com.db
[root@dns1 ~]# ls -l /var/named/example.com.db
-rw-r-----. 1 named named 404 May 21 00:51 /var/named/example.com.db
[root@dns1 ~]#
ゾーンを動的追加すると、named.conf の directory 配下にファイルが作成されます。
こちらに named プロセス実行ユーザーで書き込みできるようパーミッションを変更します。
[root@dns1 ~]# chmod g+w /var/named/
[root@dns1 ~]# ls -ld /var/named/
drwxrwx---. 6 root named 169 May 22 01:00 /var/named/
[root@dns1 ~]#
rndc コマンドで先ほど作成したゾーンファイルを指定し、ゾーンを追加してみます。あとで nsupdate による RR 変更も実施したいので、localhost からの update も許可しています。
[root@dns1 ~]# rndc addzone example.com '{
type master;
file "example.com.db";
allow-update { localhost; };
};'
rndc: 'addzone' failed: permission denied
[root@dns1 ~]#
ディレクトリの書き込み権限は先ほど与えたのに、permission denied です。
SELinux は無効化していないため、audit.log を確認してみます。
[root@dns1 ~]# audit2allow < /var/log/audit/audit.log
#============= named_t ==============
#!!!! This avc can be allowed using the boolean 'named_write_master_zones'
allow named_t named_zone_t:dir { add_name remove_name write };
#!!!! This avc can be allowed using the boolean 'named_write_master_zones'
allow named_t named_zone_t:file { append create rename unlink write };
[root@dns1 ~]#
どうやら named_write_master_zones を on にする必要があるようです。
[root@dns1 ~]# getsebool named_write_master_zones
named_write_master_zones --> off
[root@dns1 ~]# setsebool named_write_master_zones=on
[root@dns1 ~]# rndc addzone example.com '{
type master;
file "example.com.db";
allow-update { localhost; };
};'
[root@dns1 ~]#
今度はエラーなく実行できました。dig コマンドでのクエリーも問題ありません。
[root@dns1 ~]# dig +noall +answer @localhost example.com. ns
example.com. 86400 IN NS dns1.example.com.
[root@dns1 ~]#
先ほど設定した named_write_master_zones 設定を永続化します。
[root@dns1 ~]# setsebool -P named_write_master_zones=on
[root@dns1 ~]#
なお、追加したゾーン定義の情報は /var/named/ 配下に *.nzf として保存されます。
ファイル名は view (今回の例では default)を hash 化した値になるそうです。
[root@dns1 ~]# ls /var/named/*.nzf
/var/named/3bf305731dd26307.nzf
[root@dns1 ~]#
ゾーンの動的更新
次にゾーンの動的更新です。先ほど追加した example.com ゾーンに A レコードを追加します。
nsupdate にはローカル更新を指示するため、-l スイッチを付けて起動します(デフォルトでは SOA レコードを探索してネームサーバーを探しに行っちゃうはず)。
[root@dns1 ~]# nsupdate -l
update add newhost.example.com 86400 A 172.16.1.1
send
quit
[root@dns1 ~]# dig +noall +answer @localhost newhost.example.com. a
newhost.example.com. 86400 IN A 172.16.1.1
[root@dns1 ~]#
できました。しかし追加したレコードはゾーン定義のジャーナルファイル(*.jnl)に格納されてゾーン定義ファイル自体には書き込まれません。rndc sync コマンドを使うとジャーナルファイルの内容をマージできます。-clean オプションは *.jnl ファイルも削除。
[root@dns1 ~]# rndc sync -clean example.com
[root@dns1 ~]#
ゾーンを指定しなければ全ゾーンの同期になります。