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 ~]#
ゾーンを指定しなければ全ゾーンの同期になります。
Sorry, the comment form is closed at this time.