SSブログ

auto-dnssec maintain; を試してみる

BIND-9.7.2-P2auto-dnssec maintain;を試したメモ。

ARMを見る限り、auto-dnssecに指定できる値としては、allow|maintain|create|offがあるみたいですけど、allowは、dnssec-signzone(8)-Sで使えるSmart signingに毛が生えた程度な感じだし、完全放置プレイができそうなcreateは、まだ未実装みたいなので、取り敢えず、一番便利そうなmaintainを試してみることに。大雑把にいえば、timing metadataを付けた鍵を用意しておけば、そのtimingで鍵をゾーンにpublishedにしたり、ゾーンでactiveにしたりInactiveにしたりrevokeにしたり、ゾーンからdeleteしたりしてくれるシロモノのようです。

お試しの環境はCentOS 5.5で、ディレクトリ構成なんかはchrootな場合のデフォルトです。起動オプションは、

# /usr/sbin/named -u named -t /var/named/chroot


になります。用意するゾーンはテストなのでexample.jp.にして、鍵は、/var/named/chroot/var/named/keys/example.jpに置くことにして、ゾーンファイルは、/var/named/chroot/var/named/dynamicに置くことにします。まず、下準備。

$ su -
# cd /var/run/named
# ln -s /var/named/chroot/var/run/named/session.key .
# cd /var/named/chroot/var/named
# mkdir -m 770 dynamic
# chown -R named:named dynamic
# mkdir -m 770 keys
# chown -R named:named keys
# su - named --shell=/bin/bash
$ cd /var/named/chroot/var/named/keys
$ mkdir -m 770 example.jp
$ cd example.jp


んで、鍵を作ります。お試しするだけなので、賞味期限は短めで。まずは、KSK。

今すぐゾーンに公開され署名に使用され、1 日後署名に使用されなくなり、2 日後ゾーンから消えるものを。

$ /usr/sbin/dnssec-keygen -f KSK -r /dev/urandom -3 -a RSASHA256 \
 -b 2048 -I +86400 -D +172800 -n ZONE example.jp
Generating key pair........+++ .........................................................+++
Kexample.jp.+008+12199
$ cat Kexample.jp.+008+12199.key
; This is a key-signing key, keyid 12199, for example.jp.
; Created: 20101027123754 (Wed Oct 27 21:37:54 2010)
; Publish: 20101027123754 (Wed Oct 27 21:37:54 2010)
; Activate: 20101027123754 (Wed Oct 27 21:37:54 2010)
; Inactive: 20101028123754 (Thu Oct 28 21:37:54 2010)
; Delete: 20101029123754 (Fri Oct 29 21:37:54 2010)
example.jp. IN DNSKEY 257 3 8 ...
$


次に、ZSK。2つ作ります。

今すぐゾーンに公開され署名に使用され、3 時間後署名に使用されなくなり、4 時間後ゾーンから消えるものと、1 時間後ゾーンに公開され、2 時間後署名に使用され、5 時間後署名に使用されなくなり、6 時間後ゾーンから消えるものを。

$ /usr/sbin/dnssec-keygen -r /dev/urandom -3 -a RSASHA256 \
 -b 1024 -I +10800 -D +14400 -n ZONE example.jp
Generating key pair...++++++ ..............++++++
Kexample.jp.+008+59595
$ cat Kexample.jp.+008+59595.key
; This is a zone-signing key, keyid 59595, for example.jp.
; Created: 20101027124257 (Wed Oct 27 21:42:57 2010)
; Publish: 20101027124257 (Wed Oct 27 21:42:57 2010)
; Activate: 20101027124257 (Wed Oct 27 21:42:57 2010)
; Inactive: 20101027154257 (Thu Oct 28 00:42:57 2010)
; Delete: 20101027164257 (Thu Oct 28 01:42:57 2010)
example.jp. IN DNSKEY 256 3 8 ...
$ /usr/sbin/dnssec-keygen -r /dev/urandom -3 -a RSASHA256 \
 -b 1024 -P +3600 -A +7200 -I +18000 -D +21600 -n ZONE example.jp
Generating key pair..........++++++ ..............++++++
Kexample.jp.+008+58539
$ cat Kexample.jp.+008+58539.key
; This is a zone-signing key, keyid 58539, for example.jp.
; Created: 20101027124555 (Wed Oct 27 21:45:55 2010)
; Publish: 20101027134555 (Wed Oct 27 22:45:55 2010)
; Activate: 20101027144555 (Wed Oct 27 23:45:55 2010)
; Inactive: 20101027174555 (Thu Oct 28 02:45:55 2010)
; Delete: 20101027184555 (Thu Oct 28 03:45:55 2010)
example.jp. IN DNSKEY 256 3 8 ...
$


ちなみに、metadataの20101027124555みたいな日時はUTCなもの、Wed Oct 27 21:45:55 2010みたいなのはJSTです。そして、テスト用に簡単なexample.jp.ゾーンファイルを作成。

$ cd ../../dynamic
$ cat > example.jp.zone.signed
$ORIGIN example.jp.
$TTL 3600
@       IN      SOA     localhost.example.jp.  hostmaster.example.jp.    (
                                2010102701      ; Serial
                                10800           ; Refresh
                                1200            ; Retry
                                604800          ; Expire
                                1200    )       ; Minimum TTL

                        IN      NS      localhost.example.jp.
                0       IN      NSEC3PARAM 1 0 10 1234ab
localhost               IN      A       127.0.0.1
$


まあ、かなり適当です。

次に、named.conf(5)optionsview

dnssec-enable yes;


を足して、zoneを以下のように追加します。

zone "example.jp." {
	type master;
	file "dynamic/example.jp.zone.signed";
	key-directory "/var/named/keys/example.jp";
	update-policy local;
	auto-dnssec maintain;
};


尚、お試しならばzonednssec-secure-to-insecure yes;を足しておいた方が幸せかもしれません。ちなみに、update-policy local;ですが、名前からするとDynamic DNSなupdateをローカルに限定してくれそうですが、ARMによると、

update-policy { grant local-ddns zonesub any; };


と完全に等価ですので、例えば、

view "world" {
        match-clients { any; };
        match-destinations { 外側のインターフェースのIPアドレス; };
        ...
};


みたいなviewに追加した場合、デフォルトのTSIG session keyを他のホストにコピーすればリモートからもupdateがかけられます。尚、デフォルトのTSIG session keyの場所や名前も変えられるようで、options

session-keyfile "/var/run/named/session.key";
session-keyname "local-ddns";
session-keyalg "hmac-sha256";


とか記述すればできます。ちなみに、上記はデフォルト値です。

これで、準備ができたので、reloadしてloadkeysします(*1)

# rndc reload
# rndc loadkeys example.jp.


これで、Kexample.jp.+008+12199とKexample.jp.+008+59595が署名に使用され、Wed Oct 27 22:45:55 JST 2010 を過ぎればKexample.jp.+008+58539がゾーンに公開され、Thu Oct 28 00:42:57 JST 2010を過ぎればKexample.jp.+008+59595が署名に使われなくなったりしてくれます(*2)

ゾーンへの RR の追加などは、nsupdate(1)で行います。ローカルから更新できるview内にあるのであれば、

# nsupdate -l


なんぞで、そうでなければ、

# nsupdate -k /var/run/named/session.key


とかして、serverを指定するなりすれば更新できます。別解としては、

# rndc freeze example.jp.


して、/var/named/chroot/var/named/dynamic/example.jp.zone.signedをエディタで編集し、SOA RRのシリアルを上げて、

# rndc thaw example.jp.


する手もあります。ちなみに、鍵に timing metadata が付いていて、ちゃんとkey-directoryが指定されていれば、auto-dnssec off;でもnsupdate(1)等で更新すれば適切に署名してくれます。

ただ、key-directoryを指定せずデフォルト以外の場所に鍵を置いていたりすると、署名の有効期限が近づいたときに、named(8)が勝手に署名の更新をかけようとして鍵が見つからないので、署名の除去をしたりするのはなんだかなといった感じ。DNSSECなゾーンはDynamic DNSが使えるように設定しとかないと面倒な状態になるみたいですね。auto-dnssec off;なら署名の期限切れなんて自己責任にしてくれてもいいんじゃないかなと。設定であるのかな。取り敢えず、rndc freezeしとけば、そういう更新は起こりませんけど、なんか使い方が違う気がしますし。

ま、取り敢えず、これで上位へのDSやDLVの登録なんかを除けば、鍵を作り足し忘れない限り、大丈夫そうな状態が作れる感じ。適切なoffset値でdnssec-keygen(8)にtiming optionを指定してcron(8)あたりで呼べば、作成もなんとかなるのかも。




*1: rndc loadkeysに関する記述を追加(Nov 09, 2010)。まあ、reloadしてるんで問題ないんですけど、鍵追加したときにはloadkeysしようねという意味で。
*2: うまく動作しない場合もあるみたいです(Nov 09, 2010)。
nice!(0)  コメント(0)  トラックバック(4) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 4

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。