ゾーン自体の動的追加もゾーンの中身も動的更新できるBIND環境

 article  Comments Off on ゾーン自体の動的追加もゾーンの中身も動的更新できるBIND環境
May 222018
 

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

ゾーンファイルを作成します。

[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 "master/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 ~]#

ゾーンを指定しなければ全ゾーンの同期になります。