簽署

原始碼

sign 將 DNSSEC 記錄新增至區域檔。

描述

sign 外掛程式用於簽署 (請參閱 RFC 6781) 區域。在此過程中,會新增 DNSSEC 資源記錄。用於簽署資源記錄集的簽名具有到期日,這表示必須在此到期日到達之前重複簽署過程。否則,該區域的資料將會變成錯誤 (RFC 4035,第 5.5 節)。sign 外掛程式會處理此問題。

僅支援 NSEC,sign 不支援 NSEC3。

Signfileauto 外掛程式協同運作;此外掛程式會簽署區域檔,而 autofile 則會服務區域資料

為了讓此外掛程式運作,至少需要一個通用簽署金鑰 (請參閱 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>.keyK<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.orgdnssec-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.orgexample.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