$Id: howto-dnssec.html,v 1.8 2001/04/13 05:53:36 sakane Exp $

%Hd: DNSSEC で遊ぶ


o はじめに
ドキュメントはソースの doc/arm/Bv9ARM.htmlから辿れる。
RFC は読んどいた方がよい。
	RFC2535: Domain Name System Security Extensions
	RFC2536: DSA KEYs and SIGs in the Domain Name System
	RFC2537: RSA/MD5 KEYs and SIGs in the Domain Name System
	RFC2538: Storing Certificates in the Domain Name System
	RFC2541: DNS Security Operational Considerations

環境は tanu.org. の下にテスト用に sec.tanu.org. を作る。


o RFC2536 の KEY/SIG RR を作ってみる。

親となるzone(tanu.org.)の鍵対を作る。

	dnssec-keygen を使って zone key という鍵対を作る。
	dnssec-keygenは、DSA以外のアルゴリズムとして RSA,DH,HMAC-MD5が使える。

	Q. どのアルゴリズムがいいのか?
	A. RFC2535 section 3.2 says:
	   Algorithm specific formats and procedures are given in separate
	   documents.  The mandatory to implement for interoperability algorithm
	   is number 3, DSA.  It is recommended that the RSA/MD5 algorithm,
	   number 1, also be implemented.  Algorithm 2 is used to indicate
	   Diffie-Hellman keys and algorithm 4 is reserved for elliptic curve.

	Q. 鍵長はどの位あれば十分なのか?
	A. See RFC2541 Section 4. Public/Private Key Size Considerations

	Q. FreeBSD4.2 + OpenSSL0.9.6 において 2001/04/10時点で root で鍵を作ると
		dnssec-keygen: failed to generate key sec.tanu.org/DSA: out of entropy
	   などと怒られる。
	A. /dev/urandom を使う。
	   または一般ユーザで起動して、キーボードを使って乱数を生成する。

	アルゴリズムは DSAを使う。

	# dnssec-keygen -r /dev/urandom -a DSA -b 768 -n ZONE tanu.org.
	Ktanu.org.+003+55565

	2つのファイルが作られる。
		Ktanu.org.+003+55565.key	DSA公開鍵。KEY RR
		Ktanu.org.+003+55565.private	秘密情報
			RSAで言う所のPKCS#1だと思う。DSAではなんて言うんだろ?

子供となるzone(sec.tanu.org.)の鍵対を作る。

	# dnssec-keygen -r /dev/urandom -a DSA -b 768 -n ZONE sec.tanu.org.
	Ksec.tanu.org.+003+45420

	同じく2つのファイルが作られる。
		Ksec.tanu.org.+003+45420.key
		Ksec.tanu.org.+003+45420.private

親(tanu.org.)にサインしてもらうために dnssec-makekeysetを使って子供(sec.tanu.org.)の鍵セット(?)を作る。TTLは1日に設定。

	Q. -s/-e を指定しないと?
	-> dnssec-makekeyset で作った時から1ヵ月に設定している。

	# dnssec-makekeyset -r /dev/urandom -t 3600 Ksec.tanu.org.+003+45420.key
	keyset-sec.tanu.org.

	KEY RR と子供の SIG RR が入ったファイル keyset-sec.tanu.org. が作られる。

子供(sec.tanu.org.)へサインするには dnssec-signkey を使う。

	# dnssec-signkey -r /dev/urandom keyset-sec.tanu.org. Ktanu.org.+003+55565
	signedkey-sec.tanu.org.

	KEY RR と親の SIG RR が入ったファイル keyset-sec.tanu.org. が作られる。

	Q. ドキュメントでは 2つの zone keysを使っているが何のため?

子供(sec.tanu.org.)は自分のzoneファイルにサインするために dnssec-signzoneを使う。

	# dnssec-signzone -r /dev/urandom -o sec.tanu.org sec.tanu.org.zone
	sec.tanu.org.zone.signed

	sec.tanu.org.zone.signed というファイルが作られるので、これを sec.tanu.org. のzoneファイルに使う。

	Q. NXT RR って何?

named.confを編集して、zone(sec.tanu.org.) を追加する。

	zone "sec.tanu.org." IN {
		type master;
		file "sec.tanu.org.zone.signed";
			:

	//trusted-keys
	//{
	//	"name" - - - "keygits";
	//}


o RFC2538の CERT RRを作ってみる。

	CERT RR として使えるデータは以下が定義されている。

	    Value  Mnemonic  Certificate Type
	    -----  --------  ----------- ----
		0            reserved
		1   PKIX     X.509 as per PKIX
		2   SPKI     SPKI cert
		3   PGP      PGP cert
	    4-252            available for IANA assignment
	      253   URI      URI private
	      254   OID      OID private
	    255-65534        available for IANA assignment
	    65535            reserved

	アルゴリズムは RFC2353 に定義されている。

	   VALUE   Algorithm
	     0      - reserved, see Section 11
	     1     RSA/MD5 [RFC 2537] - recommended
	     2     Diffie-Hellman [RFC 2539] - optional, key only
	     3     DSA [RFC 2536] - MANDATORY
	     4     reserved for elliptic curve crypto
	   5-251    - available, see Section 11
	   252     reserved for indirect keys
	   253     private - domain name (see below)
	   254     private - OID (see below)
	   255      - reserved, see Section 11

	さて、試しに tanu.sec.tanu.org の CERT RR を作ってみる。

	最初に PEM形式のX.509 証明書を用意する。
	参照 http://mine.kame.net/~sakane/doc/public/howto-ssleay.html

	CAがいないので、サイン用の親(sec.tanu.org)の鍵対を作る。
	ついでに自己署名の証明書も作る。

	% openssl genrsa -out sec.tanu.org.privkey.pem 1024
	% openssl req -new -nodes -newkey rsa:1024 -md5 -keyform PEM \
		-keyout sec.tanu.org.privkey.pem -outform PEM \
		-out sec.tanu.org.request.pem
	% openssl x509 -req -in sec.tanu.org.request.pem \
		-signkey sec.tanu.org.privkey.pem \
		-md5 -out sec.tanu.org.cert.pem

	次に tanu.sec.tanu.org の証明書を作る。

	% openssl genrsa -out tanu.sec.tanu.org.privkey.pem 1024
	% openssl req -new -nodes -newkey rsa:1024 -md5 -keyform PEM \
		-keyout tanu.sec.tanu.org.privkey.pem \
		-outform PEM -out tanu.sec.tanu.org.request.pem
	% openssl x509 -req -in tanu.sec.tanu.org.request.pem \
		-signkey sec.tanu.org.privkey.pem \
		-md5 -out tanu.sec.tanu.org.cert.pem

	できた tanu.sec.tanu.org.cert.pem から
		-----BEGIN CERTIFICATE-----
		-----END CERTIFICATE-----
	を除いて CERT RR として使う。

	type は 1, algorithm は 1 を指定する。

		Q. key tag って何?

	こんなかんじ。

	tanu.sec.tanu.org. IN CERT 1 1 1 MIICaTCCAdICAQAwDQYJKoZIhvcNAQEEBQAwfTELMAkGA1UEBhMCSlAxETAPBgNVBAgTCEthbmFnYXdhMREwDwYDVQQHEwhGdWppc2F3YTEVMBMGA1UEChMMV0lERSBQcm9qZWN0MRUwEwYDVQQLEwxLQU1FIFByb2plY3QxGjAYBgNVBAMTEXRhbnUuc2VjLnRhbnUub3JnMB4XDTAxMDQxMDA3NDU1NFoXDTAxMDUxMDA3NDU1NFowfTELMAkGA1UEBhMCSlAxETAPBgNVBAgTCEthbmFnYXdhMREwDwYDVQQHEwhGdWppc2F3YTEVMBMGA1UEChMMV0lERSBQcm9qZWN0MRUwEwYDVQQLEwxLQU1FIFByb2plY3QxGjAYBgNVBAMTEXRhbnUuc2VjLnRhbnUub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA6iBypmwfge2iVy8UYVzYjadGbJpoYiRptfn31gK8bntROAwSQO8E0/6TalU4fe+Sfwxc1/ROkfXkNyuzfaOOt+A1WMvXirJWUB4SX2pxe2HcjbFD9K2qmDtMQgWkm0NuGhPekwxDY+j20f4AKXMks3FuPybn7dkEl1Ly1CArVwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG+9Pmmuwd6QFyz8vAtftAamuFK5YoEV96e6PgbyEpF3GX2txM/WFqNvwZ4DHYp/3pyk21jLYSG0P+kJcCLksKlWVKhLGY82Ex/QWSbXoNmA8iIXtsHsKDERNs7zdsIPWL51bsJuyBQhdSgc++JIwGa8fRGJfOouxcQvBN6Qx8O+

	zoneファイルを書き換えたら dnssec-signzone するのを忘れずに。

	% dig @papa.tanu.org sec.tanu.org. cert
	;; Truncated, retrying in TCP mode.
	;; Got answer:
	;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31375
	;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 5

	;; QUESTION SECTION:
	;sec.tanu.org.			IN	CERT

	;; ANSWER SECTION:
	sec.tanu.org.		3581	IN	CERT	PKIX 1 RSAMD5 MIICXzCCAcgCAQAwDQYJKoZIhvcNAQEEBQAweDELMAkGA1UEBhMCSlAx ETAPBgNVBAgTCEthbmFnYXdhMREwDwYDVQQHEwhGdWppc2F3YTEVMBMG A1UEChMMV0lERSBQcm9qZWN0MRUwEwYDVQQLEwxLQU1FIFByb2plY3Qx FTATBgNVBAMTDHNlYy50YW51Lm9yZzAeFw0wMTA0MTAwNzQ0MjdaFw0w MTA1MTAwNzQ0MjdaMHgxCzAJBgNVBAYTAkpQMREwDwYDVQQIEwhLYW5h Z2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRUwEwYDVQQDEwxzZWMu dGFudS5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMDqIHKm bB+B7aJXLxRhXNiNp0ZsmmhiJGm1+ffWArxue1E4DBJA7wTT/pNqVTh9 75J/DFzX9E6R9eQ3K7N9o4634DVYy9eKslZQHhJfanF7YdyNsUP0raqY O0xCBaSbQ24aE96TDENj6PbR/gApcySzcW4/Juft2QSXUvLUICtXAgMB AAEwDQYJKoZIhvcNAQEEBQADgYEAl4p05Um8ULGUlc6DPDGnzhN8fBeX PMQAwzGEDf+RytIQ1ckSch5BbLpV/cp3TBqRLVPYvcf0Anj+Agjn6LZL gI68wBnWLb94kZ9gYE/0ZlPQ7+lw+PNqhuK+fsHzz4/Ob6LY5Jq6HZZN ImN0JWfY/Ibief8YN31Pogg8XgJWDT0=

	;; AUTHORITY SECTION:
	sec.tanu.org.		3581	IN	NS	papa.tanu.org.
	sec.tanu.org.		3581	IN	NS	nymph.wide.ydc.co.jp.
	sec.tanu.org.		3581	IN	NS	orange.kame.net.

	;; ADDITIONAL SECTION:
	papa.tanu.org.		3600	IN	A	203.178.141.195
	papa.tanu.org.		3600	IN	AAAA	2001:200:0:4819:260:8ff:fec9:9d58
	nymph.wide.ydc.co.jp.	86400	IN	A	202.249.27.1
	nymph.wide.ydc.co.jp.	86400	IN	AAAA	3ffe:501:481d::3
	nymph.wide.ydc.co.jp.	86400	IN	AAAA	2001:200:101:2000::3

	;; Query time: 4 msec
	;; SERVER: ::1#53(::1)
	;; WHEN: Wed Apr 11 10:03:41 2001
	;; MSG SIZE  rcvd: 856