TSIGによる署名とその検証の準備

設定と運用の基本的な例のページでは、NOTIFYとゾーン転送のアクセス制限をIPアドレスで行いましたが、TSIG署名とその検証による方法を使ってみましょう。
以下、このページでは、10.2.0.3はBINDで動作していると仮定します。

鍵情報の定義

鍵の生成

最初に、署名に使う鍵を生成します。鍵の生成はBINDのdnssec-keygen(BIND8ならdnskeygen)を使うのが手っ取り早いと思います。不純に思われる方もいらっしゃるかもしれませんが、NSDは2.1.xまではゾーン転送にBIND8のnamed-xferを借用していたので、気にしない!
生成する鍵はアルゴリズムがhmac-md5で、鍵のタイプがHOST型の鍵です。ここではns.example1.jpからns.example2.jpに送出するメッセージへの署名に使う鍵をns.example1.jp-ns.example2.jpという名前に、逆方向の鍵をns.example2.jp-ns.example1.jpという名前にして、それぞれ鍵長は128bitにしておきます。
# dnssec-keygen -a hmac-md5 -b 128 -n HOST ns.example1.jp-ns.example2.jp Kns.example1.jp-ns.example2.jp.+157+29537
これでKns.example1.jp-ns.example2.jp.+157+29537.keyとKns.example1.jp-ns.example2.jp.+157+29537.privateという2つのファイルが生成されました。このうち、Kns.example1.jp-ns.example2.jp.+157+29537.privateの方の内容を見てみると

Private-key-format: v1.2
Algorithm: 157 (HMAC_MD5)
Key: wxL/kIYgbap9ZXJrdipRWg==

となっています。Key:の後のwxL/kIYgbap9ZXJrdipRWg==という文字列が生成された鍵をbase64でエンコードした物です。この文字列を使って、NSDの側にはnsd.confに

key:
        name: ns.example1.jp-ns.example2.jp
        algorithm: hmac-md5
        secret: wxL/kIYgbap9ZXJrdipRWg==

というkey: clauseを、BINDの側にはnamed.confに

key ns.example1.jp-ns.example2.jp {
        algorithm hmac-md5;
        secret "wxL/kIYgbap9ZXJrdipRWg==";
};

というkeyステートメントを設定すれば、鍵が定義できます。

鍵情報へのアクセス権

しかしここで、この文字列が読めるということは、その鍵を使って署名したqueryを送出できることを意味することに注意する必要があるでしょう。管理者以外のアカウントがあるホストでは、このことは問題となり得るでしょうし、管理者のアカウントしかないホストでは問題にならないかもしれません。しかし、rootの特権を放棄して動作しているdaemonのバッファオーバーランなどを気にし始めると、管理者のアカウントしかないホストでも問題となるかもしれません。バッファオーバーランで抜かれた可能性のあるホストは、どっちみち既に終わっている、という考え方/状況もあり得るでしょう。管理者以外のアカウントもあるけど、みんな信頼できるユーザばかりだし、という場合もあるかもしれませんが、有事の際に要らぬ疑いをかけなくて済むように、見られてはよくない物はきちんと隠す、というのも、管理者としてのモラルではないかと思います。というわけで、さじ加減はケースバイケースで決めて下さい。
で、隠す方針にするのであれば、nsd.confあるいはnamed.confの属性から無用な読み出し許可を落としてしまう方法もありますが、技巧的には隠すべき箇所だけを別のファイルに切り出して適切な属性を設定した上で、そのファイルの内容をinclude:ディレクティブ(nsd.conf)やincludeステートメント(named.conf)で差し込むという方法もあります。

鍵情報の転送、複写あるいは伝達

TSIGのフレームワークでは、署名側と検証側が鍵を共有していなければなりません。そこで2台のホスト間で鍵情報を転送する必要があります。転送ではなく複写とか伝達といった言葉を使った方が適切かもしれません。
このときに鍵情報が漏洩する可能性がありますが、さじ加減としては などいろいろありますので、両者の物理的位置関係、管理主体の間柄、利用可能な媒体などの事情に応じて決めて下さい。

鍵の設定

何らかの手法でKns.example1.jp-ns.example2.jp.+157+29537.privateがns.example1.jpとns.example2.jpの間でコピーできたことにします。
まずns.example1.jp側の設定です。/proj/nsd3/etc/key/ns.example1.jp-ns.example2.jpというファイル名で

algorithm: hmac-md5
secret: wxL/kIYgbap9ZXJrdipRWg==

という内容のファイルを作り、それをinclude:ディレクティブで取り込むことにします。
やり方はいろいろありますが、隣からのぞき込まれたりディスプレイケーブルの漏洩信号を盗聴されたりするといけないので、secretの文字列が画面に表示されないように

# (echo "algorithm: hmac-md5"; sed -ne '/^Key:/s/Key:/secret:/p' Kns.example1.jp-ns.example2.jp.+157+29537.private) >/proj/nsd3/etc/key/ns.example1.jp-ns.example2.jp
# chown nsd /proj/nsd3/etc/key/ns.example1.jp-ns.example2.jp
# chmod 400 /proj/nsd3/etc/key/ns.example1.jp-ns.example2.jp

とでもやってみましょう。
nsd.confでは、このファイルを

key:
        name: ns.example1.jp-ns.example2.jp
        include: /proj/nsd3/etc/key/ns.example1.jp-ns.example2.jp

のようにして取り込みます。
ns.example2.jp側でも

# (echo "algorithm hmac-md5;"; sed -ne '/^Key:/s/^Key: \(.*\)$/secret "\1";/p' Kns.example1.jp-ns.example2.jp.+157+29537.private) >ns.example1.jp-ns.example2.jp
# chown bind ns.example1.jp-ns.example2.jp
# chmod 400 ns.example1.jp-ns.example2.jp

のようにして同様のファイルを作成します。
named.confでは、

key ns.example1.jp-ns.exampe2.jp {
        include "key/ns.example1.jp-ns.example2.jp";
};

のようにして取り込みます。
ここまでと同様にして、ns.example2.jp-ns.example1.jpという鍵もそれぞれに設定します。
nsdc|Up|TSIGによる署名
Copyright(c) 2006, Koh-ichi Ito, All right reserved.
Last update: $Date: 2018-10-21 16:09:48 +0900 (Sun, 21 Oct 2018) $