1 TSIG(Transaction Signature)とは?
TSIGは次のことを保証する仕組みです。
・DNSメッセージの完全性
・DNSメッセージ送信元の真正性
これにより、プライマリーサーバとセカンダリーサーバの間でゾーン情報を安全に転送することができます。TSIG はDNS メッセージにTSIGレコードを付加することで、DNS メッセージに電子署名を行います。なお、ゾーン転送は、BINDの使い方(ゾーン転送) - hana_shinのLinux技術ブログを参照してください。
2 検証環境
3 動作確認
bindパッケージのインストール方法やポート番号の開放は、BINDの使い方(ゾーン転送) - hana_shinのLinux技術ブログを参照ください。
3.1 共有鍵の作成
共有鍵はtsig-keygenコマンドを使って作成します。書式は以下のとおりです。tsig-keygenコマンドの引数にはハッシュ関数と共有鍵名を指定します。デフォルトのハッシュ関数はhmac-sha256です。
# tsig-keygen -a [アルゴリズム] 共有鍵名
tsig-keygenコマンドを使用して共有鍵を作成します。共有鍵の名前はprimary-secondaryとします。
[root@primary ~]# tsig-keygen primary-secondary key "primary-secondary" { algorithm hmac-sha256; secret "QBTirziTOPJe3Fa0lA8hVXt9hNxuqAAKz8jIwYiZGck="; };
3.2 プライマリーサーバ
作成した共有鍵をプライマリーサーバの設定ファイルに追加します。
[root@primary ~]# diff -Nur /etc/named.conf.org /etc/named.conf --- /etc/named.conf.org 2023-06-03 23:42:27.674145301 +0900 +++ /etc/named.conf 2023-06-03 23:40:37.412881984 +0900 @@ -63,3 +63,10 @@ allow-transfer { 192.168.122.213; }; notify yes; }; + +key "primary-secondary" { + algorithm hmac-sha256; + secret "QBTirziTOPJe3Fa0lA8hVXt9hNxuqAAKz8jIwYiZGck="; +}; + +
3.3 セカンダリーサーバ
作成した共有鍵をセカンダリーサーバの設定ファイルに追加します。さらに、共有鍵を使用するため、serverステートメント内でkeysサブステートメントを使って定義します。keysサブステートメント内のパラメータは鍵の名前(primary-secondary)を指定します。
[root@secondary ~]# diff -Nur /etc/named.conf.org /etc/named.conf --- /etc/named.conf.org 2023-06-03 23:43:34.299629797 +0900 +++ /etc/named.conf 2023-06-03 23:50:39.562587606 +0900 @@ -62,3 +62,13 @@ file "slaves/abc.test.db"; masters { 192.168.122.16; }; }; + +key "primary-secondary" { + algorithm hmac-sha256; + secret "QBTirziTOPJe3Fa0lA8hVXt9hNxuqAAKz8jIwYiZGck="; +}; + +server 192.168.122.16 { + keys { primary-secondary; }; +}; +
3.4 TSIGレコードの確認
TSIG レコードを確認するため、tcpdumpコマンドを実行します。tcpdumpコマンドの使い方は、tcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。
[root@secondary ~]# tcpdump -i eth0 host 192.168.122.16 and port 53 -w dns.pcap
セカンダリーサーバのnamedを起動したらすぐにゾーン転送が行われるようにするため、セカンダリーサーバの/var/named/slaves配下のゾーンファイルを削除します(もし存在していたら)。以下の実行例では、ゾーンファイルが存在しないことがわかります。
[root@secondary ~]# ls /var/named/slaves/ [root@secondary ~]#
プライマリーサーバでnamedサービスを起動します。
[root@primary ~]# systemctl start named
セカンダリーサーバでnamedサービスを起動すると、ゾーン転送が開始されます。
[root@secondary ~]# systemctl start named
以下は、セカンダリーサーバからプライマリーサーバにゾーン転送を要求したときのWiresharkのキャプチャ画面です。Additional RRsが1となっていて、TSIGレコードが1つ追加されていることがわかります。また、TSIGレコードのMACフィールドは、DNSメッセージの完全性/真正性を実現するために使用されます。