描述
sign 外掛程式用於簽署 (請參閱 RFC 6781) 區域。在此過程中,會新增 DNSSEC 資源記錄。用於簽署資源記錄集的簽名具有到期日,這表示必須在此到期日到達之前重複簽署過程。否則,該區域的資料將會變成錯誤 (RFC 4035,第 5.5 節)。sign 外掛程式會處理此問題。
僅支援 NSEC,sign 不支援 NSEC3。
Sign 與 file 和 auto 外掛程式協同運作;此外掛程式會簽署區域檔,而 auto 和 file 則會服務區域資料。
為了讓此外掛程式運作,至少需要一個通用簽署金鑰 (請參閱 coredns-keygen(1))。此金鑰 (或多個金鑰) 將用於簽署整個區域。Sign 不支援 ZSK/KSK 分割,也不會進行金鑰或演算法輪替,它只會簽署。
Sign 將會
-
在以下情況下,使用 CSK 重新簽署區域:
-
上次簽署的時間距今已超過 6 天。每個區域的起始日期都會套用一些抖動。
-
簽名在到期前僅剩 14 天。
這些日期都只會在 SOA 的簽名上進行檢查。
-
-
針對每個給定的 DNSKEY 建立 RRSIG,其起始時間為 -3 小時 (減去 0 到 18 小時之間的抖動),到期時間為 +32 天 (加上 0 到 5 天之間的抖動)。
-
為區域中的所有名稱新增 NSEC 記錄。這些記錄的 TTL 是來自 SOA 記錄的負快取 TTL。
-
使用從給定金鑰衍生的金鑰新增或取代所有頂點 CDS/CDNSKEY 記錄。針對每個金鑰,會建立兩個 CDS,一個使用 SHA1,另一個使用 SHA256。
-
將 SOA 的序號更新為簽署發生時的Unix 時間戳記。這會覆寫任何先前的序號。
有兩種方式可以決定何時簽署區域。通常每 6 天 (加上抖動) 就會重新簽署一次。如果因為某些原因我們無法通過此檢查,則會在到期前 14 天開始觸發。
金鑰會命名 (遵循 BIND9):K<name>+<alg>+<id>.key
和 K<name>+<alg>+<id>.private
。這些金鑰不得包含在您的區域中;它們將由 sign 新增。可以使用 coredns-keygen
或 BIND9 的 dnssec-keygen
產生這些金鑰。您不必遵循此命名慣例,但這樣一來您就需要明確命名您的金鑰,請參閱 keys file
指令。
產生的區域會寫入名為 db.<name>.signed
的檔案,該檔案位於 directory
指令命名的目錄中 (預設為 /var/lib/coredns
)。
語法
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
}
}
這會導致 db.example.org
被簽署兩次,因為整個區段會被剖析兩次,因為您在伺服器區塊中指定了來源 example.org
和 example.net
。
若要強制重新簽署區域,可以移除已簽署的區域檔案 (CoreDNS 會繼續從記憶體提供服務),並將 SIGUSR1 傳送至該程序,以使其重新載入並重新簽署區域檔案。
另請參閱
DNSSEC RFC:RFC 4033、RFC 4034 和 RFC 4035。以及有關 DNSSEC 的 BCP,RFC 6781。此外,還有手冊頁面 coredns-keygen(1) 和 dnssec-keygen(8)。以及 file 外掛程式的文件。
可以在 https://github.com/coredns/coredns-utils 中的 coredns-keygen 目錄找到 Coredns-keygen。
其他實用的 DNSSEC 工具可以在 ldns 中找到,例如 ldns-key2ds
,用於從 DNSKEY 建立 DS 記錄。
錯誤
尚未實作 keys directory
。