🤖

DNSセキュリティ強化:TSIGを使ったゾーン転送の設定と検証

2024/07/27に公開

はじめに

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