hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

BINDの使い方(TSIG)



1 TSIG(Transaction Signature)とは?

TSIGは次のことを保証する仕組みです。
DNSメッセージの完全性
DNSメッセージ送信元の真正性
これにより、プライマリーサーバとセカンダリーサーバの間でゾーン情報を安全に転送することができます。TSIG はDNS メッセージにTSIGレコードを付加することで、DNS メッセージに電子署名を行います。なお、ゾーン転送は、BINDの使い方(ゾーン転送) - hana_shinのLinux技術ブログを参照してください。

2 検証環境

2.1 ネットワーク構成

DNSサーバは、プライマリーサーバとセカンダリーサーバの2台構成です。

                       192.168.122.0/24
primary(eth0) ----------------------------------(eth0) secondary
             .16                             .213

2.2 版数

プライマリーサーバとセカンダリーサーバのAlmaLinux版数は以下のとおりです。

[root@primary ~]# cat /etc/redhat-release
AlmaLinux release 9.1 (Lime Lynx)

カーネル版数は以下のとおりです。

[root@primary ~]# uname -r
5.14.0-162.6.1.el9_1.x86_64

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メッセージの完全性/真正性を実現するために使用されます。

次は、プライマリーサーバからセカンダリーサーバにゾーン転送をしている時のWiresharkのキャプチャ画面です。