Knot DNS: jak funguje DNSSEC a jak ho efektivně provozovat

14. 12. 2021
Doba čtení: 24 minut

Sdílet

 Autor: Depositphotos
Internetový protokol DNS má počátky v roce 1983. Od svého vzniku prošel mnoha úpravami a je neustále rozvíjen. Mezi jeho nejvýznamnější rozšíření patří zabezpečení pomocí protokolu DNSSEC.

Princip DNSSEC

V základní podobě DNS, když rekurzivní server zjišťuje odpověď na klientský dotaz, putují DNS odpovědi po síti bez jakékoli garance jejich původu a integrity obsahu. S postupným rozvojem Internetu a představením různých útoků na DNS bylo potřeba protokol nějak zabezpečit. Vzniklo proto rozšíření DNSSEC, jehož cílem je zajištění správnosti záznamů, které se v DNS přenášejí. DNSSEC dále zabezpečuje odpovědi na neexistující záznamy v zóně. Pro úplnost dodejme, že funkcí DNSSEC není šifrování provozu.

Protokol DNSSEC je založen na digitálním podepisování DNS záznamů pomocí kryptografie s veřejným klíčem. Protože jsou DNS záznamy uloženy hierarchicky v nezávislých zónách, musí být každá zóna zabezpečena zvlášť. Například naše testovací zóna xdp.cz. dále závisí na zabezpečení kořenové zóny . a zóny nejvyšší úrovně  cz.

Zabezpečení DNSSEC lze provozovat ve dvou režimech:

  • předpodepsání zóny – vhodné pro statické zóny, které lze podepsat předem. Výhodou je vysoký výkon odpovídání a možnost distribuce podepsané zóny na další servery,
  • online podepisování odpovědí – vhodné pro generované odpovědi, které jsou doplněny o podpisy v době jejich zpracování a díky tomu lze poskytovat důkazy na neexistenci domén bez úniku informací o obsahu zóny. Nevýhodou je výrazně nižší výkon odpovídání a složitější provoz na více serverech.

Pro uložení základních informací souvisejících s DNSSEC slouží následující typy záznamů:

  • DNSKEY  – parametry veřejného klíče k podepisování,
  • RRSIG  – podpis sady záznamů stejného typu (tzv. RRsetu),
  • NSEC (NSEC3)  – informace o následujícím (hašovaném) existujícím jménu v zóně,
  • DS  – otisk veřejného klíče podřazené zóny pro provázání zabezpečení mezi zónami.

Podle použití klíčů se rozlišují dvě podepisovací schémata:

  • Dvojice klíčů KSK (podepisuje RRset DNSKEY) a ZSK (podepisuje ostatní RRsety),
  • Jeden společný klíč CSK (podepisuje všechny RRsety).

Největší nevýhodou schématu dvou klíčů KSK a ZSK jsou větší odpovědi na dotazy typu DNSKEY. Přináší však několik výhod:

  • možnost použít algoritmus s rozdílnými velikostmi klíčů. Algoritmus se slabšími parametry pro klíč ZSK pak bude mít menší podpisy. Předpokladem je však jeho častější výměna. Aktuálně se týká už jen algoritmů založených na RSA. Nově nastupující algoritmy, které jsou založeny na eliptických křivkách (ECDSA, EdDSA), mají pevné velikosti klíčů.
  • protože výměna ZSK nevyžaduje součinnost s nadřazenou zónou, je možné tuto operaci provádět častěji a rychleji.
  • možnost oddělení správy DNSSEC mezi různé subjekty (např. CZ.NIC využívá Offline KSK).

Pro ukázku se dotážeme našeho primárního serveru na TXT záznam pro doménu xdp.cz. včetně jeho podpisu  RRSIG:

$ kdig @ns1.xdp.cz xdp.cz txt +dnssec +multiline +noquestion +noopt +nostats
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 1981
;; Flags: qr aa rd; QUERY: 1; ANSWER: 2; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 300 IN TXT "DNSSEC is easy!"
xdp.cz.                 300 IN RRSIG TXT 13 2 300 20211210191848 (
                20211126174848 44002 xdp.cz.
                8Qx7oEU00LUW8ElXxE8/BqbRxfZ2tdN95ikNKU05
                59JbAgLCr3lhzfj8DDVmxUhskqadF+rwn8wBxNM3
                UzdjlQ==
                )

Pro validaci podpisu záznamu musíme nejprve zjistit odpovídající klíč ZSK ze stejné zóny:

$ kdig @ns1.xdp.cz xdp.cz dnskey +dnssec +multiline +noquestion +noopt +nostats
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 16172
;; Flags: qr aa rd; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 300 IN DNSKEY 256 3 13 (
                qbTIi76e9uMVM/Fuayxo6NB8lO99k01V9m73f29B
                yKyoURcuFn9zl+xmK7Q1eMEiP2E3lf1uavLxiXl5
                FHSYDQ==
                ) ; ZSK, ECDSAP256SHA256 (256b), id = 44002
xdp.cz.                 300 IN DNSKEY 257 3 13 (
                ONGSk6Yko2ZDmzlASEh6H8ZOnVv2lrjLU2CCJKH6
                QEaevH1vlH42sSDd+kCngJ4FKvXGpazCtAPbjHby
                67iBxA==
                ) ; KSK, ECDSAP256SHA256 (256b), id = 32114
xdp.cz.                 300 IN RRSIG DNSKEY 13 2 300 20211210202348 (
                20211126185348 32114 xdp.cz.
                3UqQjpwc4dRrTxrM9mFX/M3xs08MIOLuh2uy/wml
                yTr7Q1psUfhLXSf2Y4LMUJEzCU4u/e0iq1rvIjwm
                NuJFfg==
                )

Abychom mohli klíč ZSK použít, musíme ověřit platnost podpisu pro celý RRset DNSKEY, který je podepsán klíčem KSK. Ten ale musíme ověřit přes jeho otisk DS v nadřazené zóně  cz.:

$ kdig @a.ns.nic.cz xdp.cz ds +dnssec +multiline +noquestion +noopt +nostats
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 58870
;; Flags: qr aa rd; QUERY: 1; ANSWER: 2; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 3600 IN DS 32114 13 2 (
                3EA51B0EE57236721C664C873A23579D8A2BBF9F
                FE9DBB2E192D8CD6D173EE5B
                )
xdp.cz.                 3600 IN RRSIG DS 13 2 3600 20211212125003 (
                20211128112003 15479 cz.
                QUs4xIMuRRf8mxBAHhPIgTaxaMzBTHYpDhTaqajq
                8kTDL+/wtHKzDvUkUi3RG9EvC8bY7bKtqhlAwixP
                XeEQmw==
                )

Pro ověření podpisu otisku klíče potřebujeme opět místní klíč ZSK:

$ kdig @a.ns.nic.cz cz dnskey +dnssec +multiline +noquestion +noopt +nostats
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 31912
;; Flags: qr aa rd; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
cz.                     3600 IN DNSKEY 256 3 13 (
                Dh1LBvaqDXjBLfklh+bdHBcXo7d00HxxXeYZnNby
                nFaPdJa4N/XaMESAgECcQhRdTp73rjG5yJf6hX/q
                EWuqwg==
                ) ; ZSK, ECDSAP256SHA256 (256b), id = 15479
cz.                     3600 IN DNSKEY 257 3 13 (
                nqzH7xP1QU5UOVy/VvxFSlrB/XgX9JDJzj51PzIj
                35TXjZTyalTlAT/f7PAfaSD5mEG1N8Vk9NmI2nxg
                QqhzDQ==
                ) ; KSK, ECDSAP256SHA256 (256b), id = 20237
cz.                     3600 IN RRSIG DNSKEY 13 1 3600 20211212162134 (
                20211128145134 20237 cz.
                igkX1GI1LkofFiotWWQoPhr/L1xTgdt+71yUEzYO
                Dh8vOu6hShv8PCNPMAV2ICu43OFNzhWmh8fPo0mL
                RVXwYw==
                )

Pro ověření ZSK přes KSK doptáme příslušný otisk v kořenového zóně  .:

$ kdig @a.root-servers.net cz ds +dnssec +multiline +noquestion +noopt +nostats
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 48007
;; Flags: qr aa rd; QUERY: 1; ANSWER: 2; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
cz.                     86400 IN DS 20237 13 2 (
                CFF0F3ECDBC529C1F0031BA1840BFB835853B920
                9ED1E508FFF48451D7B778E2
                )
cz.                     86400 IN RRSIG DS 8 1 86400 20211215050000 (
                20211202040000 14748 .
                f6wB1HdaQNaBuUuiwzDHmR/PRK6oy5A10ow7IXaj
                ZSJ8e6y+zjSPFFzZMH9P1fIBcFlYa/v7QhrrCRIZ
                yHQFifvhwiyvn0YIA093Yb8gcdeCOl1/7CVxADtg
                8E698uh2t2Tv6U2sbaW7FxLD+dI2/JGRfmoVhB6J
                Bc2MZ5jCuqa+46wJp2iS757L13hcbS61nP5YstU5
                gfc6gnaI3PD5MoSZpx0fo1cUcDpdulyszm2E4vDg
                baedkW/2vvTjuxxXvEb/Jt7YDLG1ZC7RJxoL+33W
                WF0Skq1RP4oi0rh7EKESKfa/L/Fc6dwWoLxpHdab
                R5xKtHgwi/N57vP42Xr37A==
                )

A pro platnost otisku použijeme aktuální ZSK kořenové zóny:

$ kdig @a.root-servers.net . dnskey +dnssec +multiline +noquestion +noopt +nostats
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 1570
;; Flags: qr aa rd; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
.                       172800 IN DNSKEY 256 3 8 (
                AwEAAY+oUaY0b7Z45vRD1ef/GykZqgHJtfdzRcnQ
                NvGVQAqlH22QChtG+n1EMugw7T/6uDBAGlRIkXAS
                dtHXhxStb9lPpyQe5/JIuMIlg+NhxKxEJ5e3J9SS
                PCavvDhH/BPrBCJwn8b68QAWRjVW6Rgdx63pUm7l
                fsimiWGMfplHNvcZWgVbKA9OI2o2lU8rT8n7zuwt
                lZPNpDLSI5GzrJgIiKR2Id16fmAgTJBOw14Xye/t
                4/BxTdxeMiiVFwA4KUV2VeqspHKSHFOz+lUIIqBR
                knEmYpSvnxnyi0n1n4tGnGP8z6ZwRACi1Rw0nCu7
                BGOU9M6LpInRoW/W4KXLODr6xqU=
                ) ; ZSK, RSASHA256 (2048b), id = 14748
.                       172800 IN DNSKEY 257 3 8 (
                AwEAAaz/tAm8yTn4Mfeh5eyI96WSVexTBAvkMgJz
                kKTOiW1vkIbzxeF3+/4RgWOq7HrxRixHlFlExOLA
                Jr5emLvN7SWXgnLh4+B5xQlNVz8Og8kvArMtNROx
                VQuCaSnIDdD5LKyWbRd2n9WGe2R8PzgCmr3EgVLr
                jyBxWezF0jLHwVN8efS3rCj/EWgvIWgb9tarpVUD
                K/b58Da+sqqls3eNbuv7pr+eoZG+SrDK6nWeL3c6
                H5Apxz7LjVc1uTIdsIXxuOLYA4/ilBmSVIzuDWfd
                RUfhHdY6+cn8HFRm+2hM8AnXGXws9555KrUB5qih
                ylGa8subX2Nn6UwNR1AkUTV74bU=
                ) ; KSK, RSASHA256 (2048b), id = 20326
.                       172800 IN RRSIG DNSKEY 8 0 172800 20211221000000 (
                20211130000000 20326 .
                bzGxyBzXDHcqGZwZ3v4L373VyBkgwi9l0Cb0p1OD
                HCvAa8AgLzJzj7SmksXFpbe3I28TlnigIF/Ggl/w
                YYmRMtQW8C7XViKSsR110V426t1N+ZO66yegIe31
                8yXcg4t3nFcWK1HwwJl0jD5LMaE7Cc99ylyFYe0v
                I2d66MEq7BAmZDPs/5uDwId+RX47oP+WG06QcDqg
                x1NE48LebNW5DVnVyzkHvG6KZ1KXTdyRihH085re
                UqFokixQu3opu8YECy/WXv1mBPbdn0rRK7jWQBgF
                +3XkHVboVySr0J405H26MnwOflrP7qwIw+QupVop
                GAsC3O+YdQdrvjKn26k+GA==
                )

Opět ověříme správnost ZSK pomocí KSK kořenové zóny, jehož parametry jsou již uloženy v DNS resolverech nebo jinak nezávisle distribuovány, a pak už můžeme ověřit celou sekvenci odpovědí až k našemu požadovanému záznamu TXT. Naštěstí toto vše za nás dělají DNSSEC validující DNS resolvery.

Z ukázky je také patrné, že aktuální klíče i podpisy v kořenové zóně jsou oproti klíčům a podpisům v podřazených zónách větší. To je důsledek použití rozdílných algoritmů pro podepisování.

Konfigurace podepisování DNSSEC

Základním režimem podepisování v Knot DNS je předpodepisování zóny, které jsme při úvodním zprovoznění serveru aktivovali ve výchozím nastavení pomocí:

zone:
  - domain: xdp.cz.
    ...
    dnssec-signing: on

Kdybychom chtěli specifikovat parametry podepisování explicitně, bylo by třeba vytvořit sekcipolicy a na tu se odkázat z nastavení zóny přes dnssec-policy. Příklad s uvedením základních parametrů podepisování s výchozími hodnotami:

policy:
  - id: default_policy
    manual: off
    single-type-signing: off
    algorithm: ecdsap256sha256
    ksk-size: 256
    zsk-size: 256
    ksk-lifetime: 0
    zsk-lifetime: 30d
    dnskey-ttl: 300
    propagation-delay: 1h
    delete-delay: 0
    rrsig-lifetime: 14d
    rrsig-refresh: 7d
    rrsig-pre-refresh: 1h

zone:
  - domain: xdp.cz.
    ...
    dnssec-signing: on
    dnssec-policy: default_policy

Pod první konfigurační volbou manual se skrývá ta největší úleva pro operátora serveru. Vypíná manuální, resp. zapíná automatickou správu DNSSEC klíčů. To obnáší generování nových klíčů a jejich řádnou výměnu, což bývá největším problémem při provozování podepsané zóny. Manuální správa klíčů je určena pokročilým uživatelům, kteří potřebují mít celý proces plně pod kontrolou, nebo musí nějak do správy klíčů zasáhnout.

Vypnutím volby single-type-signing vynucujeme použití schématu dvou klíčů KSK a ZSK. Následuje nastavení podepisovacího algoritmu (aktuálně je standardem ECDSAP256SHA256) a velikosti klíčů, jejichž velikost je v tomto případě předurčena algoritmem.

Dalších několik voleb se týká časových parametrů klíčů. Nulová hodnota ksk-lifetime říká, že KSK má neomezenou životnost a nebude automaticky aktualizován. Naproti tomu zsk-lifetime říká, že klíč ZSK se má automaticky vyměnit každých 30 dnů. Hodnota TTL RRsetu DNSKEY je 300 sekund a maximální doba propagace podepsané zóny na všechny koncové servery je jedna hodina. Na nastavení hodnoty propagation-delay závisí správné časování při výměně klíčů! Parametr delete-delay udává minimální prodlevu, po kterou je starý klíč ponechán v úložišti, než je smazán. To se může hodit pro případ chyby operátora.

Poslední sada parametrů určuje, jak často jsou aktualizovány podpisy RRSIG. Hodnota rrsig-lifetime nastavuje platnost podpisu, která je součástí samotného záznamu. Poslední dvě volby rrsig-refresh a rrsig-prerefresh říkají serveru, v jakém časovém rozpětí před vypršením platnosti podpisu musí být podpis aktualizován. Ve výchozím nastavení se podpisy aktualizují nejpozději 7 dní před jejich expirací, a to v rozmezí jedné hodiny (pokud není přepodepsání vynuceno z jiného důvodu).

Celkově jsou výchozí parametry podepisování poměrně přísné a například životnost ZSK s algoritmem ECDSAP256SHA256 by mohla být mnohem delší. Ale díky automatizaci to není třeba u běžných zón řešit.

Databáze KASP

Informace o klíčích pro DNSSEC ukládá Knot DNS do databáze KASP. Ta je stejně jako dříve popisované databáze (žurnál a konfigurační databáze) založena na LMDB a není určena k přímému přístupu. Většinou je umístěna pod /var/lib/knot/keys. Maximální velikost databáze KASP je omezena parametrem kasp-db-max-size.

Vedle databáze KASP máme ještě úložiště klíčů (tzv. keystore), na něž se odkáže z příslušné policy přes keystore. Podporovány jsou dvě varianty:

  • soubory ve formátu PEM v kombinaci s kryptografickou knihovnou GnuTLS – jde o nejčastější použití a výchozí volbu. Soubory soukromých klíčů jsou většinou ukládány v podadresáři keys databáze KASP.
  • zařízení s rozhraním PKCS #11 Hardwarový bezpečnostní modul (tzv. HSM) – vyžaduje dostupnost speciálního zařízení nebo softwarový emulátor SoftHSM.

V případě HSM je generování klíčů, výpočet a ověřování podpisů prováděno pomocí tohoto zařízení. Profesionální HSM jsou velmi nákladná a jejich hlavním smyslem je bezpečné uložení klíčů. Na základě praktických zkušeností bychom je však nenazvali kryptoakcelerátory. Při paralelním přístupu neposkytují významný či vůbec uspokojivý výkon. V dalším textu se už budeme výhradně zabývat variantou se soubory PEM.

Pro uživatelský přístup k databázi KASP slouží nástroj keymgr. Při automatické správě klíčů využijeme nejčastěji výpis klíčů. Například pro zónu xdp.cz. vypadá zjednodušený výpis klíčů (od verze 3.2 bude výchozím režimem) s časovými značkami v lidštější nebo ISO podobě:

$ sudo keymgr -b xdp.cz. list human
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=-2M1D1h9m47s ready=-2M1D1h9m47s
28447ed5682704fb5cb0e5405c48a2af105cc673 17646 ZSK ECDSAP256SHA256 publish=-1D4m47s active=-22h59m47s

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z
28447ed5682704fb5cb0e5405c48a2af105cc673 17646 ZSK ECDSAP256SHA256 publish=2021-12-05T19:18:48Z active=2021-12-05T20:23:48Z

Plný výpis klíčů s časovými údaji ve formě unixového času vypadá:

$ sudo keymgr xdp.cz. list
28447ed5682704fb5cb0e5405c48a2af105cc673 ksk=no  zsk=yes tag=17646 algorithm=13 size=256  public-only=no  pre-active=0 publish=1638731928 ready=0 active=1638735828 retire-active=0 retire=0 post-active=0 revoke=0 remove=0
cd4d3e0021bdf4f52a61d4450a0956e401a54137 ksk=yes zsk=no  tag=32114 algorithm=13 size=256  public-only=no  pre-active=0 publish=1633544028 ready=1633544028 active=0 retire-active=0 retire=0 post-active=0 revoke=0 remove=0

Vidíme tedy dva klíče, každý se dvěma identifikátory. Interní identifikátor v rámci úložiště (první sloupec ve výpisech) a identifikátor odpovídajícího DNSKEY záznamu (tzv. keytag, druhý sloupec nebo hodnota tag). Většina údajů o klíči jsou časové značky, při nichž dochází ke změně stavu klíče. Ty udávají například, kdy je klíč publikovaný jako DNSKEY záznam, použitý k podepisování nebo odebíraný ze zóny.

A odpovídající soubory PEM se soukromými klíči jsou:

$ sudo ls -1 /var/lib/knot/keys/keys
28447ed5682704fb5cb0e5405c48a2af105cc673.pem
cd4d3e0021bdf4f52a61d4450a0956e401a54137.pem

Výměna klíče ZSK

Protože se většina DNS záznamů zdržuje v keších resolverů po dobu TTL, musí výměna klíčů DNSSEC (tzv. rollover) probíhat v několika krocích, aby nedošlo k výpadkům DNS v důsledku nekonzistence mezi obsahem keší resolverů a aktuálním obsahem zóny na autoritativních serverech. ZSK rollover je nejjednodušší a je možné ho provést dvěma způsoby (viz RFC 6781). Knot DNS provádí automatický ZSK rollover pomocí předpublikace nového klíče. Na naší testovací zóně už automatický ZSK rollover pravidelně probíhá. My si ho však pro ukázku přímo teď vynutíme. Aktuální dvojice klíčů je:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z
28447ed5682704fb5cb0e5405c48a2af105cc673 17646 ZSK ECDSAP256SHA256 publish=2021-12-05T19:18:48Z active=2021-12-05T20:23:48Z

Vidíme jeden aktivní klíč ZSK ( 17646). Ručně spustíme okamžitý ZSK rollover příkazem:

$ sudo knotc zone-key-rollover xdp.cz. zsk
OK

V jednu chvíli může na jedné zóně probíhat pouze jeden rollover klíče nebo algoritmu. Kdyby již nějaký probíhal, provedený příkaz by neměl efekt. V logu démona vidíme:

Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] control, received command 'zone-key-rollover'
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, ZSK rollover started
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: notice: [xdp.cz.] DNSSEC, KSK submission, waiting for confirmation
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, ready, active+
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 17646, algorithm ECDSAP256SHA256, public, active
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 07 15:34:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-07T16:39:35+0100

Vygeneroval se nový klíč ZSK ( 29957) a je ve stavu publikace, tedy je obsažen v DNSKEY RRsetu, ale není používán k podepisování záznamů. Ještě aktuální stav databáze KASP:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z
28447ed5682704fb5cb0e5405c48a2af105cc673 17646 ZSK ECDSAP256SHA256 publish=2021-12-05T19:18:48Z active=2021-12-05T20:23:48Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z

Od okamžiku publikace se musí vyčkat po dobu DNSKEY TTL (5 min) + propagation delay (60 min). Poté následuje další změna:

Dec 07 16:39:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: notice: [xdp.cz.] DNSSEC, KSK submission, waiting for confirmation
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, ready, active+
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 17646, algorithm ECDSAP256SHA256, public
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public, active
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 07 16:39:36 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-07T17:44:35+0100

Starý klíč ZSK ( 17646) se přestal používat pro podepisování, ale zůstal ještě publikovaný. Novým klíčem ZSK ( 29957) se již podepisuje zóna. Odpovídající stav databáze KASP:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z
28447ed5682704fb5cb0e5405c48a2af105cc673 17646 ZSK ECDSAP256SHA256 publish=2021-12-05T19:18:48Z active=2021-12-05T20:23:48Z retire=2021-12-07T15:39:35Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z active=2021-12-07T15:39:35Z

Před poslední fází se musí vyčkat po dobu zone maximum TTL (5 min) + propagation-delay (60 min). Pak dojde k odebrání starého ZSK:

Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: notice: [xdp.cz.] DNSSEC, KSK submission, waiting for confirmation
Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, ready, active+
Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public, active
Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-08T14:59:45+0100

A pro úplnost výpis finálního stavu databáze KASP:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z active=2021-12-07T15:39:35Z

Ještě dodejme, že hodnota maximálního TTL záznamů v zóně se zjišťujě automaticky, pokud není explicitně nastavena volbou zone-max-ttl.

Výměna klíče KSK

KSK rollover je o něco složitější, protože vyžaduje aktualizaci DS záznamu v nadřazené zóně. S tímto úkonem souvisí i několikrát vypsaná hláška v logu:

Dec 07 17:44:35 ns1.xdp.cz knotd[209149]: notice: [xdp.cz.] DNSSEC, KSK submission, waiting for confirmation

Když jsme zapnuli podepisování DNSSEC a nastavili příslušný DS záznam v rozhraní registrátora, neinformovali jsme démona o dokončeném zprovoznění klíče KSK a to by nám bránilo v jeho výměně. Zpětně tedy dokončíme nasazení prvotního klíče příkazem:

$ sudo knotc zone-ksk-submitted xdp.cz.

Abychom se o tento krok nemuseli více starat, nastavíme automatickou detekci aktualizace DS záznamu. Tato detekce není ve výchozím stavu zapnutá, neboť klíč KSK má neomezenou platnost a je na rozhodnutí uživatele, jaké servery k detekci použije. Může jít o autoritativní servery nadřazené zóny, resolvery nebo jejich libovolnou kombinaci. My se spokojíme se dvěma veřejnými validujícími resolvery. Přidáme do konfigurace jejich popis v sekci remote a odkážeme se na ně z nové definice v sekci submission, kde dále nastavíme interval kontrol na 30 minut:

remote:
 - id: cznic
   address: [2001:148f:ffff::1, 2001:148f:fffe::1]
 - id: cloudflare
   address: [2606:4700:4700::1111, 2606:4700:4700::1001]

submission:
  - id: submission_30m
    check-interval: 30m
    parent: [cznic, cloudflare]

Vytvoříme si už vlastní nastavení podepisování, kde kromě sledování záznamu DS ještě nastavíme pozdržené mazání klíčů na dva dny:

policy:
  - id: main_policy
    delete-delay: 2d
    ksk-submission: submission_30m

zone:
  - domain: xdp.cz.
    ...
    dnssec-signing: on
    dnssec-policy: main_policy

A načteme upravenou konfiguraci sudo systemctl reload knot.

Knot DNS provádí automatický KSK rollover pomocí dvou podpisů RRsetu DNSKEY (viz RFC 6781). My si teď tento rollover vynutíme příkazem:

$ sudo knotc zone-key-rollover xdp.cz. ksk
OK

V logu vidíme nově vygenerovaný klíč KSK ( 40920), který je publikovaný a používá se, vedle stávajícího KSK klíče ( 32114), k podepisování RRsetu  DNSKEY:

Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] control, received command 'zone-key-rollover'
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, KSK rollover started
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, active
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public, active
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 40920, algorithm ECDSAP256SHA256, KSK, public, active+
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 07 18:29:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-07T19:34:20+0100

Aktuální stav databáze KASP:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z active=2021-12-07T17:22:09Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z active=2021-12-07T15:39:35Z
057230e5df7ebc95b27285f1a7a9567eebd8ec3a 40920 KSK ECDSAP256SHA256 publish=2021-12-07T17:29:20Z

Dotazem se přesvědčíme, že popsaný stav odpovídá skutečnosti (dva klíče KSK, jeden klíč ZSK a dva podpisy):

$ kdig @ns1.xdp.cz xdp.cz. dnskey +dnssec +multiline +noquestion +noopt +nostats +nocrypto
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 42593
;; Flags: qr aa rd; QUERY: 1; ANSWER: 5; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 300 IN DNSKEY 256 3 13 [omitted]
                 ; ZSK, ECDSAP256SHA256 (256b), id = 29957
xdp.cz.                 300 IN DNSKEY 257 3 13 [omitted]
                 ; KSK, ECDSAP256SHA256 (256b), id = 32114
xdp.cz.                 300 IN DNSKEY 257 3 13 [omitted]
                 ; KSK, ECDSAP256SHA256 (256b), id = 40920
xdp.cz.                 300 IN RRSIG DNSKEY 13 2 300 20211221172920 (
                20211207155920 32114 xdp.cz.
                [omitted]
                )
xdp.cz.                 300 IN RRSIG DNSKEY 13 2 300 20211221172920 (
                20211207155920 40920 xdp.cz.
                [omitted]
                )

Nyní se čeká po dobu DNSKEY TTL (5 min) + propagation-delay (60 min) než se nový klíč KSK přepne do nám již známého stavu  ready:

Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: notice: [xdp.cz.] DNSSEC, KSK submission, waiting for confirmation
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, active
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public, active
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 40920, algorithm ECDSAP256SHA256, KSK, public, ready, active+
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-14T16:39:35+0100
Dec 07 19:34:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DS check, outgoing, remote 2001:148f:ffff::1@53, KSK submission check: negative

Ještě obsah databáze KASP:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z active=2021-12-07T17:22:09Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z active=2021-12-07T15:39:35Z
057230e5df7ebc95b27285f1a7a9567eebd8ec3a 40920 KSK ECDSAP256SHA256 publish=2021-12-07T17:29:20Z ready=2021-12-07T18:34:20Z

V tuto chvíli se navíc publikovaly záznamy typu CDNSKEY a CDS. Syntakticky jsou stejné jako záznam DNSKEY pro nový klíč KSK a jeho otisk DS, ale jejich přítomností informujeme nadřazenou zónu, pokud to podporuje (viz hezký přehled registrů), že bychom v ní chtěli aktualizovat náš DS záznam. Přesvědčíme se o existenci těchto záznamů:

$ kdig @ns1.xdp.cz xdp.cz cdnskey +dnssec +multiline +noquestion +noopt +nostats +nocrypto
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 49048
;; Flags: qr aa rd; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 0 IN CDNSKEY 257 3 13 [omitted]
                 ; KSK, ECDSAP256SHA256 (256b), id = 40920
xdp.cz.                 0 IN RRSIG CDNSKEY 13 2 0 20211221183420 (
                20211207170420 32114 xdp.cz.
                [omitted]
                )
xdp.cz.                 0 IN RRSIG CDNSKEY 13 2 0 20211221183420 (
                20211207170420 40920 xdp.cz.
                [omitted]
                )
$ kdig @ns1.xdp.cz xdp.cz cds +dnssec +multiline +noquestion +noopt +nostats +nocrypto
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 63143
;; Flags: qr aa rd; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 0 IN CDS 40920 13 2 (
                70959CF5D6A0A3F53BD0AE42DF4DA6ADE84DA066
                AE1F95F6B6B610DA53F6E86A
                )
xdp.cz.                 0 IN RRSIG CDS 13 2 0 20211221183420 (
                20211207170420 32114 xdp.cz.
                [omitted]
                )
xdp.cz.                 0 IN RRSIG CDS 13 2 0 20211221183420 (
                20211207170420 40920 xdp.cz.
                [omitted]
                )

V této fázi musíme vyčkat, než si nadřazená zóna ( cz.) detekuje naší změnu a aktualizuje se. Výpisem naplánovaných událostí nad zónou si můžeme zobrazit stav detekce aktualizace záznamu  DS:

$ sudo knotc zone-status xdp.cz. +events
[xdp.cz.] load: not scheduled | refresh: not scheduled | update: not scheduled | expiration: not scheduled | journal flush: not scheduled | backup/restore: not scheduled | notify: not scheduled | DNSSEC re-sign: +6D20h53m5s | NSEC3 resalt: not scheduled | DS check: +19m41s | DS push: not scheduled

Vidíme, že nejbližší událost DS check se provede za necelých 20 minut. Jednotlivé pokusy najdeme v logu až do úspěšného zdetekování na obou resolverech:

Dec 07 20:04:20 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DS check, outgoing, remote 2001:148f:ffff::1@53, KSK submission check: negative
...
Dec 08 15:34:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DS check, outgoing, remote 2001:148f:ffff::1@53, KSK submission check: negative
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DS check, outgoing, remote 2001:148f:ffff::1@53, KSK submission check: positive
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DS check, outgoing, remote 2606:4700:4700::1111@53, KSK submission check: positive
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: notice: [xdp.cz.] DNSSEC, KSK submission, confirmed
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, active+
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public, active
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 40920, algorithm ECDSAP256SHA256, KSK, public, active
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 08 16:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-08T17:04:21+0100

Protože se podařilo ověřit, že nadřazená zóna obsahuje nový záznam DS, ze zóny byly odstraněny záznamy CDNSKEY a CDS. Toto chování lze ovlivnit volbou cds-cdnskey-publish. Aktuální obsah databáze KASP:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z active=2021-12-07T17:22:09Z retire-active=2021-12-08T15:04:21Z remove=2021-12-08T16:04:21Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z active=2021-12-07T15:39:35Z
057230e5df7ebc95b27285f1a7a9567eebd8ec3a 40920 KSK ECDSAP256SHA256 publish=2021-12-07T17:29:20Z ready=2021-12-07T18:34:20Z active=2021-12-08T15:04:21Z

Starý klíč KSK ( 32114) je však stále ještě publikovaný a používaný k podepisování dokud není jistota, že starý záznam DS expiroval v keších resolverů:

$ kdig @ns1.xdp.cz xdp.cz dnskey +dnssec +multiline +noquestion +noopt +nostats +nocrypto
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 22011
;; Flags: qr aa rd; QUERY: 1; ANSWER: 5; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 300 IN DNSKEY 256 3 13 [omitted]
                 ; ZSK, ECDSAP256SHA256 (256b), id = 29957
xdp.cz.                 300 IN DNSKEY 257 3 13 [omitted]
                 ; KSK, ECDSAP256SHA256 (256b), id = 32114
xdp.cz.                 300 IN DNSKEY 257 3 13 [omitted]
                 ; KSK, ECDSAP256SHA256 (256b), id = 40920
xdp.cz.                 300 IN RRSIG DNSKEY 13 2 300 20211221172920 (
                20211207155920 32114 xdp.cz.
                [omitted]
                )
xdp.cz.                 300 IN RRSIG DNSKEY 13 2 300 20211221172920 (
                20211207155920 40920 xdp.cz.
                [omitted]
                )

Po vyčkání po dobu parent DS TTL (60 min) dojde k dokončení KSK rolloveru:

Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing zone
Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK
Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 29957, algorithm ECDSAP256SHA256, public, active
Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, key, tag 40920, algorithm ECDSAP256SHA256, KSK, public, active
Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, signing started
Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, successfully signed
Dec 08 17:04:21 ns1.xdp.cz knotd[209149]: info: [xdp.cz.] DNSSEC, next signing at 2021-12-14T16:39:35+0100

Ve výsledném obsahu databáze KASP je vidět ještě starý klíč KSK, který je v „karanténě“ po dobu dvou dnů před jeho finálním odstraněním z úložiště klíčů:

$ sudo keymgr -b xdp.cz. list iso
cd4d3e0021bdf4f52a61d4450a0956e401a54137 32114 KSK ECDSAP256SHA256 publish=2021-10-06T18:13:48Z ready=2021-10-06T18:13:48Z active=2021-12-07T17:22:09Z retire-active=2021-12-08T15:04:21Z remove=2021-12-08T16:04:21Z
efc302f2da45f4022ac3596789cbb959d621be54 29957 ZSK ECDSAP256SHA256 publish=2021-12-07T14:34:35Z active=2021-12-07T15:39:35Z
057230e5df7ebc95b27285f1a7a9567eebd8ec3a 40920 KSK ECDSAP256SHA256 publish=2021-12-07T17:29:20Z ready=2021-12-07T18:34:20Z active=2021-12-08T15:04:21Z

A dotázáním primárního serveru si zobrazíme aktuální RRset  DNSKEY:

bitcoin_skoleni

$ kdig @ns1.xdp.cz xdp.cz dnskey +dnssec +multiline +noquestion +noopt +nostats +nocrypto
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 18746
;; Flags: qr aa rd; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1

;; ANSWER SECTION:
xdp.cz.                 300 IN DNSKEY 256 3 13 [omitted]
                 ; ZSK, ECDSAP256SHA256 (256b), id = 29957
xdp.cz.                 300 IN DNSKEY 257 3 13 [omitted]
                 ; KSK, ECDSAP256SHA256 (256b), id = 40920
xdp.cz.                 300 IN RRSIG DNSKEY 13 2 300 20211222160421 (
                20211208143421 40920 xdp.cz.
                [omitted]
                )

V příštím díle se podíváme ještě na některé další funkce související s DNSSEC.

(Původně vyšlo na blogu CZ.NIC.)

Autor článku

Vystudoval softwarové inženýrství na Fakultě jaderné a fyzikálně inženýrské ČVUT v Praze. V Laboratořích sdružení CZ.NIC má na starosti vývoj projektu Knot DNS, jehož je členem od roku 2012.