hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

DNSSECコマンドの使い方



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