1 はじめに
1.1 DNSSEC(DNS Security Extensions)とは?
DNSSECは、キャッシュDNSサーバの問い合わせに対して、以下を検証する仕組みです。
・応答が正当な権威DNSサーバからのものであること(真正性)
・応答が権威DNSサーバからの送信後に改ざんされていないこと(完全性)
DNSSECは、キャッシュポイズニングなどの攻撃によってキャッシュDNSサーバのキャッシュが改ざんされ、クライアントが意図しないサーバに誘導されるリスクを防ぐために使用します。ここでは、DNSSECで使うコマンドの使い方を説明します。なお、キャッシュDNSサーバと権威DNSサーバの関係は、digコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
1.2 DNSSECで使用するコマンド
DNSSECでは、以下のコマンドを使います。
コマンド | 用途 |
---|---|
dnssec-keygen | ZSK(*1),KSK(*2)を作成するコマンドです。ZSK,KSKはそれぞれ秘密鍵、公開鍵のペアからなります。つまり、4つの鍵が存在します |
dnssec-signzone | ZSK,KSKを使ってゾーンファイルに署名するコマンドです |
dnssec-dsfromkey | DSレコードを作成するコマンドです。DSリソースレコードは、KSK公開鍵のハッシュ値を含む情報です。自ゾーンのKSK公開鍵を検証するために上位の権威DNSサーバに登録します |
(*1) Zone Signing Key(ゾーン署名鍵)
(*2) Key Signing Key(鍵署名鍵)
ZSK,KSKの用途は以下のとおりです。
名称 | 用途 |
---|---|
ZSK | ゾーンファイルのリソースレコードに署名をするために使用します |
KSK | ZSKに署名するために使用します |
2 検証環境
プライマリーサーバのAlmaLinux版数は以下のとおりです。
[root@primary ~]# cat /etc/redhat-release AlmaLinux release 9.1 (Lime Lynx)
カーネル版数は以下のとおりです。
[root@primary ~]# uname -r 5.14.0-162.6.1.el9_1.x86_64
3 ZSK,KSKの作成方法
ZSK,KSKはdnssec-keygenコマンドを使って作成します。コマンドの書式は以下のとりです。
dnssec-keygen [オプション] ドメイン名
オプションの意味は以下のとおりです。
オプション | 意味 |
---|---|
-f | KSK:KSKを作成するときに指定します |
REVOKE:作成した鍵を無効化するときに指定します | |
未指定:ZSKを作成する場合、オプションを指定する必要はありません | |
-a | 暗号アルゴリズムを指定します。RSASHA1, NSEC3RSASHA1, RSASHA256, RSASHA512, ECDSAP256SHA256, ECDSAP384SHA384, ED25519, ED448のいずれかを指定します |
-b | 鍵のサイズ(bit)を指定するオプションです。オプションを指定しなければデフォルトの鍵サイズが使用されます。たとえば、ゾーンの署名に使うRSAの場合1024(bit)、鍵の署名に使うRSAの場合2048(bit)になります |
RSASHA1:1024~4096 | |
NSEC3RSASHA1:1024~4096 | |
-K(大文字) | ZSK,KSKを作成するディレクトリを指定するオプションです |
-n | 鍵のオーナタイプを指定するオプションです。 ZONE,HOST,ENTITY,USER ,OTHERのいずれかを指定します |
3.2 KSKの作成方法
KSKを作成します。
[root@primary ~]# dnssec-keygen -f KSK -a RSASHA256 -b 1024 -K /var/named/keys -n zone abc.test Generating key pair............++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .............++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Kabc.test.+008+18256
作成したKSKを確認します。KSKの公開鍵(key)と秘密鍵(private)が作成されたことがわかります。
[root@primary ~]# ls -l /var/named/keys/ 合計 8 -rw-r--r--. 1 root root 424 6月 11 22:05 Kabc.test.+008+18256.key -rw-------. 1 root root 1012 6月 11 22:05 Kabc.test.+008+18256.private
公開鍵の中身を確認してみます。
[root@primary ~]# cat /var/named/keys/Kabc.test.+008+18256.key ; This is a key-signing key, keyid 18256, for abc.test. ; Created: 20230611130539 (Sun Jun 11 22:05:39 2023) ; Publish: 20230611130539 (Sun Jun 11 22:05:39 2023) ; Activate: 20230611130539 (Sun Jun 11 22:05:39 2023) abc.test. IN DNSKEY 257 3 8 AwEAAbsk2bsnSHR/+xywTwKAAWZiTFHLv67DwWDxpWiu6dRq3DTH1xRL 4McB9vpCjUac8XzO4QUZKayPQ7eON0cHSroGYEcFmX3ghJ1MJu1l/FPW RMaRABD6rHaSqnStrKhlza0aZ5DXdi/VOaY2xFd1PCkFwA67FosSHFTI SfbmWoOP
DNSKEYレコードのフォーマットは以下のとおりです。
フォーマットは、RFC 4034: Resource Records for the DNS Security Extensionsで規定されています。
<ドメイン名> IN DNSKEY <フラグ> <プロトコル> <アルゴリズム> <公開鍵>
レコード | 意味 |
---|---|
フラグ | 256はZSK、257はKSKを意味します |
プロトコル | プロトコル番号は3になります。 |
アルゴリズム | DNSSECアルゴリズム番号を意味します。8はRSA/SHA-256アルゴリズムを示しています。詳細はhttps://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtmlを参照ください |
公開鍵 | 公開鍵をBase64でエンコードした文字列です |
3.3 ZSKの作成方法
[root@primary ~]# dnssec-keygen -a RSASHA256 -b 1024 -K /var/named/keys -n zone abc.test Generating key pair......................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ....................................................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Kabc.test.+008+43296
作成したZSKを確認します。ZSKの公開鍵(key)と秘密鍵(private)が作成されたことがわかります。
[root@primary ~]# ls -l /var/named/keys/ 合計 16 -rw-r--r--. 1 root root 424 6月 11 22:05 Kabc.test.+008+18256.key -rw-------. 1 root root 1012 6月 11 22:05 Kabc.test.+008+18256.private -rw-r--r--. 1 root root 425 6月 11 22:45 Kabc.test.+008+43296.key -rw-------. 1 root root 1012 6月 11 22:45 Kabc.test.+008+43296.private
[root@primary ~]# cat /var/named/keys/Kabc.test.+008+43296.key ; This is a zone-signing key, keyid 43296, for abc.test. ; Created: 20230611134551 (Sun Jun 11 22:45:51 2023) ; Publish: 20230611134551 (Sun Jun 11 22:45:51 2023) ; Activate: 20230611134551 (Sun Jun 11 22:45:51 2023) abc.test. IN DNSKEY 256 3 8 AwEAAdM31XgEivQjEwdaMD5Q6+4yi//wZFq3fz0WzgL/bwvIXvppyGL8 bP0yL0ILgx+tN4bNvhUvUTo7yE/C01Ra2axPyAgQ/RO4AUMxxVzagCyw JiLUPIkQCCtTCskStTVlIlhOoTL6j1S+QiQpVgaClv/o6tzItvhrJR1T EbsLjgy7
4 リソースレコードの署名方法
ゾーンファイル内のリソースレコードに署名するためには、dnssec-signzoneコマンドを使用します。以下にコマンドの書式の例を示します。
dnssec-signzone [オプション] ゾーンファイル [keys]
オプションの意味は以下のとおりです。
オプション | 意味 |
---|---|
-a | 生成されたすべての署名を検証するときに指定します |
-S | 鍵をゾーンファイル書き込むときに指定します |
-x | BIND 9がDNSKEY、CDNSKEY、およびCDSのRRセットに対してのみキーサインキーで署名し、ゾーンサインキーによる署名を省略することを示します |
-3 salt | ソルトを指定します。このソルトを使用してNSEC3チェーンを生成します |
-K(大文字) | DNSSECキーを検索するためのディレクトリを指定します。指定されていない場合、デフォルトで現在のディレクトリが使用されます |
-o | ゾーンのオリジンを指定します |
dnssec-signzoneコマンドを使ってリソースレコードに署名をします。以下の例ではソルト(-3)に1234、オリジン(-o)にabc.testを指定しています。
[root@primary ~]# dnssec-signzone -a -S -x -3 1234 -K /var/named/keys -o abc.test /var/named/abc.test.db Fetching abc.test/RSASHA256/18256 (KSK) from key repository. Fetching abc.test/RSASHA256/43296 (ZSK) from key repository. Verifying the zone using the following algorithms: - RSASHA256 Zone fully signed: Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked ZSKs: 1 active, 0 present, 0 revoked /var/named/abc.test.db.signed
ゾーンファイルを確認します。abc.test.db.signedというファイルが作成されたことがわかります。
[root@primary ~]# ls -l /var/named/abc.test.db* -rw-r--r--. 1 root root 485 6月 1 19:58 /var/named/abc.test.db -rw-r--r--. 1 root root 451 6月 1 19:58 /var/named/abc.test.db.org -rw-r--r--. 1 root root 3966 6月 12 21:49 /var/named/abc.test.db.signed
作成したゾーンファイルの中身を確認します。既存のレコードに加え、RRSIGレコード、NSEC3PARAMレコード、NSEC3レコードが追加されていることがわかります。
[root@primary ~]# cat /var/named/abc.test.db.signed ; File written on Mon Jun 12 21:49:47 2023 ; dnssec_signzone version 9.16.23-RH abc.test. 3600 IN SOA primary.abc.test. root.abc.test. ( 2023052802 ; serial 300 ; refresh (5 minutes) 900 ; retry (15 minutes) 3600 ; expire (1 hour) 3600 ; minimum (1 hour) ) 3600 RRSIG SOA 8 2 3600 ( 20230712114947 20230612114947 43296 abc.test. zwap89WPc+C/NZD072SLvnTUD8308ZOzb8tx Hj0/o7EUyKKKO8RnsJxeAu14bWpD3bXU9YEF cL+9NwitF/pdgePSu9kLdLJOFHj+q1xdToZe ISBa+qH6DqNSds2CpH11wON3I8UmGl1cqgeB rQxoFX4OXq0n/Myegk7Ae7TMuzE= ) 3600 NS primary.abc.test. 3600 RRSIG NS 8 2 3600 ( 20230712114947 20230612114947 43296 abc.test. ItAfBAP0ndlLr6Y9Zo3fiFaasOCk1lUT3q7S Rcga8f/9Uij9ASqKt+W+iBO33zCbHeUwPhtX t6C30GmPDXS4ox2OX6Xlv8NYM8ICjBHrC2pN wwM4tD+uG4DG2y6kDp/wMY5JUDwjIohVp8Ck O5zS/wIKei5s1zPtt1tx8vnyoGk= ) 3600 DNSKEY 257 3 8 ( AwEAAbsk2bsnSHR/+xywTwKAAWZiTFHLv67D wWDxpWiu6dRq3DTH1xRL4McB9vpCjUac8XzO 4QUZKayPQ7eON0cHSroGYEcFmX3ghJ1MJu1l /FPWRMaRABD6rHaSqnStrKhlza0aZ5DXdi/V OaY2xFd1PCkFwA67FosSHFTISfbmWoOP ) ; KSK; alg = RSASHA256 ; key id = 18256 3600 DNSKEY 256 3 8 ( AwEAAdM31XgEivQjEwdaMD5Q6+4yi//wZFq3 fz0WzgL/bwvIXvppyGL8bP0yL0ILgx+tN4bN vhUvUTo7yE/C01Ra2axPyAgQ/RO4AUMxxVza gCywJiLUPIkQCCtTCskStTVlIlhOoTL6j1S+ QiQpVgaClv/o6tzItvhrJR1TEbsLjgy7 ) ; ZSK; alg = RSASHA256 ; key id = 43296 3600 RRSIG DNSKEY 8 2 3600 ( 20230712114947 20230612114947 18256 abc.test. Sh+47dbiEg1QiUn5N4aystCzZoPioxdgtmHu hpIO9E9+VC3ZUjDKLSn9uFg64plXHgx5EG8v Wy15gSyLW5IWUEX0y3rxzi9MbwhUAe5YJm74 EmwPea3dUzIpUkZZXH3vBcm9O1Ke3lv8V1Rt LiQwtksJGFzoGJpnsRI3Evc3Os4= ) 0 NSEC3PARAM 1 0 10 1234 0 RRSIG NSEC3PARAM 8 2 0 ( 20230712114947 20230612114947 43296 abc.test. J549EEC6bARktJaTXPKsvhF3AxK+AoCV+jt5 HaAA5A3Jm1Ts6k8XQE6bjV+Pb5a8PUNrkeLM 6ZEF2w9MwlLpEdmoiCHN7JpDAhfCvxSBKZ6v ueGxgoMXUdT0etaFsRVpFiAz3LZXTAd8jkcE OqHmxaTAT3dT1K044t7BXaIDf4k= ) primary.abc.test. 3600 IN A 192.168.122.16 3600 RRSIG A 8 3 3600 ( 20230712114947 20230612114947 43296 abc.test. IMHwi3Icml76UOlEbjgQ3XkmH+s+hEWhismT J9ZyPKiXSTpcT+EAzmrRP0f0jUTXVKIT/mfv GJutJqCibE1OZv6wNBAfff1M4P9sW1ykyuUc S3kl7hgM9+r6c3fmw8TIW21rfzH8KGY3qnzl nRkM5Abd80eoGyKB8kMum6+KIWw= ) FKUSJSS19E8994LO00GH510HCD7I4AMM.abc.test. 3600 IN NSEC3 1 0 10 1234 ( UBJNF1IDKRB7SGG2P11RLSAI7GBSJ38J A RRSIG ) 3600 RRSIG NSEC3 8 3 3600 ( 20230712114947 20230612114947 43296 abc.test. UVyKxOeyRyn3l+erymeb3kgknL/0TpxAlPQS A7JOK9VSXrzzKsOFCO9Ohu9laWw3ZXwcpoky +q9Vh6P6tKSlNgvQPu8p6XWCAznDXRPov2pA 38NoCQsTbZY0A/Pbcalr/euK5gZRrcS3Lub1 BaJ3jV/r/YyGn33fM4ma4/vYVqw= ) BK5S6VI9M6F57QF0ODM1CR8ITTMJTJ3P.abc.test. 3600 IN NSEC3 1 0 10 1234 ( FKUSJSS19E8994LO00GH510HCD7I4AMM NS SOA RRSIG DNSKEY NSEC3PARAM ) 3600 RRSIG NSEC3 8 3 3600 ( 20230712114947 20230612114947 43296 abc.test. Jdhz/pK/5JxDQDpbeDXvJdfz5Qlab76uYeR/ ++FMFWhSj0UkbKuRRJzZBlJaUmfzKfEed/SK Gj0isMxsw40FWxxJS4rMW3FBbl8K3PKV4KR9 DJ864iZPOC6oKKb1IV4p1+oSXQQD5AQiJLDy OeCPgC/fIRy0i/TfHC+qzZM774A= ) www.abc.test. 3600 IN A 192.168.122.20 3600 RRSIG A 8 3 3600 ( 20230712114947 20230612114947 43296 abc.test. JKMVPFA6sEChBRp8DvZnJO+UE23z6fcRAfxm BVmeln1vAcjND85+IT0vLkp3G78CZaEn5Jeg w9Fk/RM5uC3+0j1RWEfI9Ri/4Fh0IesJCgAt 1od1zww6C23itIf5C0nhrb+PNn22sfy8UQQD xaMBzwrjHBBWnmV+6FsDuQoyYEo= ) UBJNF1IDKRB7SGG2P11RLSAI7GBSJ38J.abc.test. 3600 IN NSEC3 1 0 10 1234 ( BK5S6VI9M6F57QF0ODM1CR8ITTMJTJ3P A RRSIG ) 3600 RRSIG NSEC3 8 3 3600 ( 20230712114947 20230612114947 43296 abc.test. ZoYTcbesk0srNmHwT/AIHNB9KY4iwt8qp0rQ ma1iX73Ixn51UbUCVIKNLPHml+8Pfm3Z6J57 chg/FtfUKrj9V6P+ZcP+FpnJy0YvepIYB6ro EmwYJSqJGmJp6zlqtKhHurDWfFqeSy57YVX1 mOg2rzfr6trFIDUpfkTacoKEyAU= )
各種リソースレコードの意味を以下に示します。
レコード名 | 意味 |
---|---|
RRSIG | 各リソースレコードに対する署名が格納されます |
NSEC3 | リソースレコードの情報をハッシュしたNSEC |
NSEC3PARAM | NSEC3の利用に必要とされる情報 |
5 DSリソースレコードの作成方法
DSリソースレコードは、dnssec-dsfromkeyコマンドを使って作成します。dnssec-dsfromkeyコマンドの書式は以下のとおりです。キーファイルには、KSKの公開鍵を指定します。
dnssec-dsfromkey [オプション] キーファイル
オプションの意味は以下のとおりです。
オプション | 意味 |
---|---|
-1 | ハッシュ値を生成するアルゴリズムにSHA-1を使用する |
-2 | ハッシュ値を生成するアルゴリズムにSHA-256を使用する |
-a | ハッシュ値を生成するアルゴリズムを指定するオプションです |
KSKの公開鍵を指定して、dnssec-dsfromkeyコマンドを実行します。
[root@server ~]# dnssec-dsfromkey /var/named/keys/Kabc.test.+008+18256.key abc.test. IN DS 18256 8 2 9C4C6BBD44E0F04BEFB50729773F75461A166BF4823D9F911F0EACEE8E88FD45