このページはリンク切れを生じないために残してありますが、内容は古くなっていますのでご注意下さい。

TSIGでゾーン転送を認証してみる

Knot DNSをマスタ、スレーブの両方で動作させることができたので、TSIGでゾーン転送を認証してみましょう。
ns.example1.jp[192.0.2.1]→ns.example2.jp[203.0.113.1]のexample1.jpゾーンのゾーン転送はxfr-key-1という名前の鍵、ns.example2.jp[203.0.113.1]→ns.example1.jp[192.0.2.1]のexample2.jpゾーンのゾーン転送はxfr-key-2という名前の鍵を使って認証することにし、それぞれの鍵のアルゴリズムはhmac-sha256、鍵長は128bitというパラメータを使うことにします。
今のところKnot DNSには鍵生成ユーティリティが含まれていませんので、手近なところでBINDのdnssec-keygenを使って鍵を生成します。方法はBIND9 Administrator Reference Manualの4章に載っています。

% /usr/sbin/dnssec-keygen -a hmac-sha256 -b 128 -n host xfr-key-1
Kxfr-key-1.+163+27056
% ls
Kxfr-key-1.+163+27056.key  Kxfr-key-1.+163+27056.private
% cat Kxfr-key-1.+163+27056.key
xfr-key-1. IN KEY 512 3 163 Q1uGyZQZA/DgBNZz/lJNEw==

これでxfr-key-1が生成できました。Q1uGyZQZA/DgBNZz/lJNEw==の部分が鍵情報です。同様にしてxfr-key-2も生成します。
次に、この鍵をremotes{}のslave-serverの設定に追加します。

system {
        storage "/proj/knot-dns/var";
}
keys {
        xfr-key-1 hmac-sha256 "Q1uGyZQZA/DgBNZz/lJNEw==";
}
interfaces {
        eth0 {
                address 192.0.2.1;
        }
}
remotes {
        ns.example2.jp {
                address 203.0.113.1;
                port 53;
        }
        slave-server {
                address 203.0.113.1;
key xfr-key-1;
} } zones { example1.jp { file "/proj/dns/namedb/example1.jp"; xfr-out slave-server; } example2.jp { file "/proj/dns/namedb/example2.jp"; xfr-in ns.example2.jp; } }
knotc reloadで設定を反映させ、ns.example2.jp[203.0.113.1]からdigでexample1.jpのゾーン転送を要求してみます。まずはTSIGを使わずに

ns.example2.jp% dig @192.0.2.1 example1.jp AXFR                                  
; <<>> DiG 9.6.-ESV-R5-P1 <<>> @192.0.2.1 example1.jp AXFR
; (1 server found)
;; global options: +cmd
; Transfer failed.

拒否されました。
次はTSIGの鍵を付加して

ns.example2.jp% dig @192.0.2.1 -y hmac-sha256:xfr-key-1:Q1uGyZQZA/DgBNZz/lJNEw== example1.jp AXFR

; <<>> DiG 9.6.-ESV-R5-P1 <<>> @192.0.2.1 -y hmac-sha256 example1.jp AXFR
; (1 server found)
;; global options: +cmd
example1.jp.            86400   IN      SOA     ns.example1.jp. hostmaster.example1.jp. 2012040101 1200 900 2419200 900
example1.jp.            86400   IN      NS      ns.example1.jp.
ns.example1.jp.         86400   IN      A       192.0.2.1
example1.jp.            86400   IN      SOA     ns.example1.jp. hostmaster.example1.jp. 2012040101 1200 900 2419200 900
xfr-key-1.              0       ANY     TSIG    hmac-sha256. 1340627776 300 32 dMgaFTGT/l2MRMlwfCoRoxRTQT7mHYGllWzCi0CoAts= 8336 NOERROR 0 
;; Query time: 0 msec
;; SERVER: 192.0.2.1#53(192.0.2.1)
;; WHEN: Mon Jun 25 21:36:16 2012
;; XFR size: 4 records (messages 1, bytes 249)

今度は成功しました。これでTSIGの認証がうまく動作していることが確認できました。
次はこれまでとは逆方向に、ns.example1.jp[192.0.2.1]がns.example2.jp[203.0.113.1]に対してexample2.jpゾーンのゾーン転送を要求するときに、TSIG鍵xfr-key-2を付加するための設定をします。xfr-key-2は先ほどのxfr-key-1と同様にして生成します。

system {
        storage "/proj/knot-dns/var";
}
keys {
        xfr-key-1 hmac-sha256 "Q1uGyZQZA/DgBNZz/lJNEw==";
xfr-key-2 hmac-sha256 "cv11voz/g8t99cZ9uOOWkw==";
} interfaces { eth0 { address 192.0.2.1; } } remotes { ns.example2.jp { address 203.0.113.1; port 53;
key xfr-key-2;
} slave-server { address 203.0.113.1; key xfr-key-1; } } zones { example1.jp { file "/proj/dns/namedb/example1.jp"; xfr-out slave-server; notify-out slave-server; } example2.jp { file "/proj/dns/namedb/example2.jp"; xfr-in ns.example2.jp; notify-in ns.example2.jp; } }
一度、/proj/dns/namedb/example2.jpと/proj/knot-dns/var/example2.*を削除してKnot DNSを再起動すると、無事example2.jpゾーンのファイルを作り直していることがわかります。
TSIG鍵が読めると、例えばそれを他のホストに持ち出してゾーン転送できてしまうので、BINDやNSDでは、TSIG鍵の部分をnamed.confやnsd.confとは別のファイルにして一般ユーザの読み取り権を落とし、includeディレクティブを使って設定に取り込むという手法がよく使われますが、Knot DNSにはv1.0.6の時点ではincludeの機能がないようなので、TSIGを使う場合にはknot.confのパーミッションに注意を払う必要があります。
Copyright(c) 2012 Koh-ichi Ito, All rights reserved
ページ先頭のアイコン: Copyright(c) 2017 いらすとや, All rights reserved.
Last update: $Date: 2019-08-16 11:45:02 +0900 (Fri, 16 Aug 2019) $
[マスタになってみるへ|indexへ|小ネタへ]