説明
sign プラグインは、ゾーンに署名(RFC 6781 参照)するために使用されます。このプロセスでは、DNSSEC リソースレコードが追加されます。リソースレコードセットに署名する署名には有効期限があり、この有効期限に達する前に署名プロセスを繰り返す必要があります。そうしないと、ゾーンのデータは BAD になります(RFC 4035、セクション 5.5)。sign プラグインはこれを処理します。
NSEC のみがサポートされており、sign は NSEC3 をサポートしていません。
Sign は file および auto プラグインと連携して動作します。このプラグインはゾーンファイルを署名し、auto と file はゾーンのデータを提供します。
このプラグインを機能させるには、少なくとも 1 つの共通署名キー(coredns-keygen(1) を参照)が必要です。このキー(または複数のキー)は、ゾーン全体に署名するために使用されます。Sign は、ZSK/KSK の分割をサポートしておらず、キーまたはアルゴリズムのロールオーバーも行いません。単に署名するだけです。
Sign は以下を行います。
-
CSK でゾーンを(再)署名する場合
-
最後に署名されてから 6 日以上経過した場合。各ゾーンには、開始日に適用されるジッターがいくつかあります。
-
署名の有効期限が残り 14 日になった場合。
これらの両方の日付は、SOA の署名でのみチェックされます。
-
-
指定された DNSKEY ごとに、開始時刻が -3 時間(0〜18 時間のジッターをマイナス)、有効期限が +32 日(0〜5 日のジッターをプラス)の RRSIG を作成します。
-
ゾーン内のすべての名前に対して NSEC レコードを追加します。これらの TTL は、SOA レコードのネガティブキャッシュ TTL です。
-
指定されたキーから派生したすべての頂点 CDS/CDNSKEY レコードを追加または置換します。各キーに対して、SHA1 を使用した CDS と SHA256 を使用した CDS の 2 つが作成されます。
-
署名が行われたときの Unix エポックに、SOA のシリアル番号を更新します。これにより、以前のシリアル番号はすべて上書きされます。
ゾーンが署名されるタイミングを決定する 2 つの方法があります。通常、6 日ごと (プラスジッター) に再署名されます。何らかの理由でこのチェックに失敗した場合、有効期限が切れる 14 日前が開始されます。
キーには (BIND9 に従って) K<name>+<alg>+<id>.key
および K<name>+<alg>+<id>.private
という名前が付けられます。キーはゾーンに含めてはなりません。sign によって追加されます。これらのキーは、coredns-keygen
または BIND9 の dnssec-keygen
で生成できます。この命名規則に従う必要はありませんが、キーを明示的に指定する必要がある場合は、「keys file
ディレクティブ」を参照してください。
生成されたゾーンは、directory
ディレクティブで指定されたディレクトリ(デフォルトは /var/lib/coredns
)に db.<name>.signed
という名前のファイルに書き出されます。
構文
sign DBFILE [ZONES...] {
key file|directory KEY...|DIR...
directory DIR
}
- DBFILE 読み込んで解析するゾーンデータベースファイル。パスが相対パスの場合は、root プラグインからのパスが先頭に追加されます。
- ZONES 署名する必要のあるゾーン。空の場合、構成ブロックのゾーンが使用されます。
key
は、ゾーンに署名するキー(複数可)を指定します。file
が使用されている場合、KEY のファイル名がそのまま使用されます。directory
が使用されている場合、sign は DIR でK<name>+<alg>+<id>
ファイルを探します。これらのファイル内のメタデータ(Activate、Publish など)は無視されます。これらのキーもキー署名キー(KSK)である必要があります。directory
は、署名されたゾーンを CoreDNS が保存する DIR を指定します。指定されていない場合、デフォルトは/var/lib/coredns
です。ゾーンは、db.<name>.signed
という名前で保存されます。パスが相対パスの場合、root プラグインからのパスが先頭に追加されます。
キーは coredns-keygen
で生成できます。sign プラグインで使用するために作成するには、coredns-keygen example.org
または dnssec-keygen -a ECDSAP256SHA256 -f KSK example.org
を使用します。
例
ファイル db.example.org
に含まれる example.org
ゾーンに署名し、その結果を ./db.example.org.signed
に書き出して、file プラグインがそれを取得して提供できるようにします。使用されるキーは、/etc/coredns/keys/Kexample.org.key
および /etc/coredns/keys/Kexample.org.private
から読み取られます。
example.org {
file db.example.org.signed
sign db.example.org {
key file /etc/coredns/keys/Kexample.org
directory .
}
}
これを実行すると、次のログ出力になります(この例では、タイマーが短い間隔に設定されていることに注意してください)。
[WARNING] plugin/file: Failed to open "open /tmp/db.example.org.signed: no such file or directory": trying again in 1m0s
[INFO] plugin/sign: Signing "example.org." because open /tmp/db.example.org.signed: no such file or directory
[INFO] plugin/sign: Successfully signed zone "example.org." in "/tmp/db.example.org.signed" with key tags "59725" and 1564766865 SOA serial, elapsed 9.357933ms, next: 2019-08-02T22:27:45.270Z
[INFO] plugin/file: Successfully reloaded zone "example.org." in "/tmp/db.example.org.signed" with serial 1564766865
または、複数のゾーンに対して単一のゾーンファイルを使用します。ZONES が両方のプラグインで繰り返されていることに注意してください。また、これにより複数の署名付き出力ファイルが出力されることにも注意してください。ここでは、デフォルトの出力ディレクトリ /var/lib/coredns
を使用します。
. {
file /var/lib/coredns/db.example.org.signed example.org
file /var/lib/coredns/db.example.net.signed example.net
sign db.example.org example.org example.net {
key directory /etc/coredns/keys
}
}
これは同じ構成ですが、ゾーンはサーバーブロックに配置されています。ただし、file プラグインで、どのゾーンに対してどのファイルが提供されるかを指定する必要があることに注意してください。
example.org example.net {
file var/lib/coredns/db.example.org.signed example.org
file var/lib/coredns/db.example.net.signed example.net
sign db.example.org {
key directory /etc/coredns/keys
}
}
署名するオリジンを完全にリストするように注意してください。そうしないと
example.org example.net {
sign plugin/sign/testdata/db.example.org miek.org {
key file /etc/coredns/keys/Kexample.org
}
}
これにより、example.org
と example.net
のオリジンをサーバーブロックで指定しているため、このセクション全体が 2 回解析されるため、db.example.org
が2 回署名されます。
強制的にゾーンを再署名するには、署名済みゾーンファイルを削除し(CoreDNS はメモリから提供し続けます)、プロセスに SIGUSR1 を送信して、ゾーンファイルを再ロードして再署名させます。
参考
DNSSEC RFC: RFC 4033、RFC 4034、および RFC 4035。および DNSSEC に関する BCP である RFC 6781。さらに、マニュアルページ coredns-keygen(1) および dnssec-keygen(8)。および file プラグインのドキュメント。
Coredns-keygen は、https://github.com/coredns/coredns-utils の coredns-keygen ディレクトリにあります。
その他の便利な DNSSEC ツールは、ldns にあります。たとえば、DNSKEY から DS レコードを作成する ldns-key2ds
です。
バグ
keys directory
は実装されていません。