DNSセキュリティ強化:TSIGを使ったゾーン転送の設定と検証
はじめに
DNS(Domain Name System)は、インターネット上でドメイン名とIPアドレスを結びつける重要な役割を担っています。DNSサーバーは、マスターサーバーとスレーブサーバーに分けられ、マスターサーバーがゾーンデータを管理し、スレーブサーバーがそのデータを複製して利用します。ゾーン転送とは、マスターサーバーからスレーブサーバーへゾーンデータを送信するプロセスです。
しかし、ゾーン転送はセキュリティ上のリスクがあります。特に、なりすまし攻撃によってマスターサーバーのIPアドレスを偽装された場合、攻撃者がゾーンデータを不正に取得する可能性があります。このリスクを軽減するために、TSIG(Transaction SIGnature)を使用します。TSIGは、DNSメッセージの完全性を保証し、認証を行うためのプロトコルです。
本記事では、TSIGを用いたDNSゾーン転送の設定し検証しました。
TSIGの概要
TSIG(Transaction SIGnature)は、DNSメッセージに署名を追加することで、メッセージの完全性と送信元の認証を保証するプロトコルです。TSIGは、マスターサーバーとスレーブサーバーが共通の秘密鍵を持ち、その鍵で署名を行うことで、なりすまし攻撃を防ぎます。
TSIGの設定手順
ステップ1: 秘密鍵の生成
まず、マスターサーバーでTSIGの共有鍵を生成します。これには、dnssec-keygen
コマンドを使用します。このコマンドは、任意のディレクトリで実行できますが、鍵ファイルが生成されるので、管理しやすい場所で実行すると良いでしょう。例として、ホームディレクトリで実行します。
cd ~
/usr/sbin/dnssec-keygen -a HMAC-SHA256 -b 128 -n HOST xfr-key
- -a HMAC-SHA256:使用するアルゴリズムを指定します。HMAC-SHA256は高度なセキュリティを提供します。
- -b 128:鍵の長さを指定します。128ビットが適切です。
- -n HOST:ホスト用の鍵を生成します。
- xfr-key:鍵の名前です。
このコマンドを実行すると、以下のようなファイルが生成されます。
Kxfr-key.+163+35393.key
Kxfr-key.+163+35393.private
ステップ2: 秘密鍵の内容確認
生成されたファイルの中身を確認し、鍵情報を取り出します。これも任意のディレクトリで実行できますが、鍵ファイルが保存された場所で行うと便利です。ここでは、ホームディレクトリで行います。
cd ~
cat Kxfr-key.+163+35393.key
出力例:
xfr-key. IN KEY 512 3 163 Q1uGyZQZA/DgBNZz/lJNEw==
ステップ3: named.confの設定(マスターDNS)
マスターDNSの設定ファイル/etc/named.conf
に鍵情報を追加します。
sudo vi /etc/named.conf
次に、以下の設定を追加します。
key "xfr-key" {
algorithm hmac-sha256;
secret "Q1uGyZQZA/DgBNZz/lJNEw==";
};
zone "example.com" IN {
type master;
file "example.com.zone";
allow-transfer { key xfr-key; 192.0.2.11; };
};
- key "xfr-key":鍵の名前を指定します。
- algorithm hmac-sha256:使用するアルゴリズムを指定します。
- secret "Q1uGyZQZA/DgBNZz/lJNEw==":共有鍵を指定します。
- allow-transfer { key xfr-key; 192.0.2.11; }:TSIG鍵 xfr-key で認証されたクライアントおよびIPアドレス 192.0.2.11(スレー- ブDNSのIPアドレス)のクライアントにのみゾーン転送を許可します。
ステップ4: named.confの設定(スレーブDNS)
スレーブDNSの設定ファイル/etc/named.conf
にも同様の設定を追加します。こちらもシステムの設定ファイルなので、/etc
ディレクトリにあります。
sudo vi /etc/named.conf
次に、以下の設定を追加します。
key "xfr-key" {
algorithm hmac-sha256;
secret "Q1uGyZQZA/DgBNZz/lJNEw==";
};
server 192.0.2.1 {
keys { "xfr-key"; };
};
zone "example.com" IN {
type slave;
file "slaves/example.com.zone";
masters { 192.0.2.1; };
};
- key "xfr-key": 鍵の名前を指定します。
- algorithm hmac-sha256: 使用するアルゴリズムを指定します。
- secret "Q1uGyZQZA/DgBNZz/lJNEw==": 共有鍵を指定します。
- server 192.0.2.1: マスターDNSのIPアドレスを指定し、使用する鍵を設定します。
- keys { "xfr-key"; }: 使用する鍵の名前を指定します。
- zone "example.com" IN: example.com ゾーンの設定を開始します。
- type slave: このサーバーがスレーブサーバーであることを指定します。
- file "slaves/example.com.zone": ゾーンデータを格納するファイルを指定します。
- masters { 192.0.2.1; }: マスターDNSのIPアドレスを指定します。
ステップ5: TSIGの認証
TSIGを使用しないゾーン転送
まず、TSIGを使用せずにゾーン転送を試みます。このコマンドは、ゾーン転送が許可されていないため失敗するはずです。
dig @192.0.2.1 example.com AXFR
このコマンドの各部分の意味は以下の通りです:
- dig:DNSの情報を照会するためのコマンド。
- @192.0.2.1:クエリを送信するDNSサーバーのIPアドレス。ここでは、マスターDNSサーバーのIPアドレスです。
- example.com:照会するドメイン名。ここでは、ゾーン転送を試みる対象のドメイン名です。
- AXFR:ゾーン転送のタイプ。DNSのゾーン転送を要求します。
このコマンドは、マスターDNSサーバー(192.0.2.1)に対して example.com ゾーンの完全なコピーを要求します。TSIGなしで実行すると、ゾーン転送が許可されていないため失敗するはずです。
TSIGを使用したゾーン転送
次に、TSIGを使用してゾーン転送を試みます。このコマンドは、認証されたクライアントからのリクエストとして処理され、成功するはずです。
dig @192.0.2.1 -y hmac-sha256:xfr-key:Q1uGyZQZA/DgBNZz/lJNEw== example.com AXFR
このコマンドの各部分の意味は以下の通りです:
- dig:DNSの情報を照会するためのコマンド。
- @192.0.2.1:クエリを送信するDNSサーバーのIPアドレス。ここでは、マスターDNSサーバーのIPアドレスです。
- -y:TSIGキーを指定するオプションです。これを使用してDNSメッセージに署名を付けることで、メッセージの整合性を保証し、認証を行います。
- hmac-sha256:使用するTSIGのアルゴリズム。ここでは、HMAC-SHA256を使用します。
- xfr-key:TSIGキーの名前。設定ファイルで定義した鍵名です。
- Q1uGyZQZA/DgBNZz/lJNEw==:TSIGキーの共有鍵です。
- example.com:照会するドメイン名。ここでは、ゾーン転送を試みる対象のドメイン名です。
- AXFR:ゾーン転送のタイプ。DNSのゾーン転送を要求します。
このコマンドは、TSIG鍵 xfr-key を使用してマスターDNSサーバー(192.0.2.1)に対して認証されたリクエストを送信し、 example.com ゾーンの完全なコピーを要求します。このリクエストは、適切なTSIG鍵で認証されているため、ゾーン転送が成功するはずです。
検証結果
TSIGキーを使用しない場合のゾーン転送は失敗します:
dig @192.0.2.1 www.example.com AXFR
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.6 <<>> @192.0.2.1 www.example.com AXFR
; (1 server found)
;; global options: +cmd
; Transfer failed.
TSIGキーを使用したゾーン転送が成功しました:
dig @192.0.2.1 -y hmac-sha256:xfr-key:Q1uGyZQZA/DgBNZz/lJNEw== example.com AXFR
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.13.6 <<>> @192.0.2.1 -y hmac-sha256 example.com AXFR
; (1 server found)
;; global options: +cmd
example.com. 86400 IN SOA ns1.example.com. admin.example.com. 2024072702 3600 1800 1209600 86400
example.com. 86400 IN NS ns1.example.com.
example.com. 86400 IN NS ns2.example.com.
ns1.example.com. 86400 IN A 192.0.2.1
ns2.example.com. 86400 IN A 192.0.2.2
www.example.com. 86400 IN A 192.0.2.3
example.com. 86400 IN SOA ns1.example.com. admin.example.com. 2024072702 3600 1800 1209600 86400
xfr-key. 0 ANY TSIG hmac-sha256. 1722070261 300 32 1uWVSpvMgcLzt5Pm7fQAKI7bvjpPb9u04O3dbw839Yg= 14988 NOERROR 0
;; Query time: 0 msec
;; SERVER: 192.0.2.1#53(192.0.2.1)
;; WHEN: Sat Jul 27 17:51:01 JST 2024
;; XFR size: 7 records (messages 1, bytes 287)
まとめ
この記事では、TSIGを用いたDNSゾーン転送の設定とその検証方法について解説しました。TSIGを使用することで、DNSメッセージの完全性と認証を保証し、セキュリティを強化できることが確認できました。
TSIGは共通鍵を使用するため、特定の相手とのみやり取りが可能です。この特性を活かして、マスターサーバーとスレーブサーバー間のゾーン転送などに利用されます。公開鍵暗号を使うDNSSECとは異なり、TSIGは特定の通信に適したセキュリティプロトコルです。
Discussion