Systemd valida DNSSEC, pero no muestra las firmas DNSSEC a sus clientes

Durante las pruebas con DNSSEC para escribir mis artículos recientes sobre el tema, observaba comportamientos extraños cuando hacía los experimentos con mi portátil. Pedía toda la información de un dominio protegido por DNSSEC y recibía validación DNSSEC de mi resolver local, pero no me llegaban las firmas digitales asociadas. Algo incomprensible considerando que el resolver necesita disponer de esas firmas digitales para que poder hacer esa validación.

Nota

En una versión inicial de este artículo utilizaba mi dominio jcea.es para las demostraciones, pero dado que los servidores DNS autoritativos para un dominio no realizan verificaciones DNSSEC para dicho dominio (no activan el flag AD [1]), el resultado era confuso.

Es por eso que he actualizado este artículo para utilizar el dominio nic.fr.

Por ejemplo, esto es lo que veo desde mi portátil cuando pido ver las firmas digitales DNSSEC (los registros RRSIG del DNS):

jcea@jcea:~$ dig +dnssec nic.fr

; <<>> DiG 9.16.1-Ubuntu <<>> +dnssec nic.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20487
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 65494
; OPT=5: 05 07 08 0a 0d 0e 0f (".......")
; OPT=6: 01 02 04 ("...")
; OPT=7: 01 (".")
;; QUESTION SECTION:
;nic.fr.                                IN      A

;; ANSWER SECTION:
nic.fr.                 600     IN      A       192.134.5.37

;; Query time: 135 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: mar jun 28 14:22:40 CEST 2022
;; MSG SIZE  rcvd: 74

Aquí vemos que el resolver local hace validación DNSSEC (el flag AD [1] al principio de la respuesta). Estupendo. ¡Pero no me sale la firma digital asociada!

En cambio, si hago la misma petición desde otra máquina, veo lo siguiente:

[root@DNS ~]# dig +dnssec nic.fr

; <<>> DiG 9.11.36 <<>> +dnssec nic.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15893
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 1232
; COOKIE: 13448363bb43c6627e7acce562baf35331f8dd2b12930e74 (good)
;; QUESTION SECTION:
;nic.fr.                                IN      A

;; ANSWER SECTION:
nic.fr.                 600     IN      A       192.134.5.37
nic.fr.                 600     IN      RRSIG   A 13 2 600 20220726044610 20220626111911 10335 nic.fr. zvFT9jkpNx7J1rvg1nxWLJh1c4VpJnAG/kEOb+z3zy+RQIEwp7072PTv K06DlhSxrFayN6mpApSfRhWfY9qGOw==

;; Query time: 17 msec
;; SERVER: 10.200.0.8#53(10.200.0.8)
;; WHEN: mar. jun. 28 14:25:55 CEST 2022
;; MSG SIZE  rcvd: 181

Aquí vemos que el registro DNS A tiene su firma digital y que la validación DNSSEC es correcta (hay flag AD [1]).

No poder acceder a los registros RRSIG desde mi portatil tiene consecuencias importantes. Por ejemplo, la herramienta delv no se puede usar para validar el correcto funcionamiento de DNSSEC, al menos no usando el resolver local de mi portátil:

jcea@jcea:~$ delv nic.fr
;; no valid RRSIG resolving 'fr/DS/IN': 127.0.0.53#53
;; broken trust chain resolving 'nic.fr/A/IN': 127.0.0.53#53
;; resolution failed: broken trust chain

En cambio en otra máquina obtengo:

[root@DNS ~]# delv nic.fr
; fully validated
nic.fr.                 600     IN      A       192.134.5.37
nic.fr.                 600     IN      RRSIG   A 13 2 600 20220726044610 20220626111911 10335 nic.fr. zvFT9jkpNx7J1rvg1nxWLJh1c4VpJnAG/kEOb+z3zy+RQIEwp7072PTv K06DlhSxrFayN6mpApSfRhWfY9qGOw==

Investigando el asunto, veo que es un problema con el resolver de systemd en el Linux de mi portátil, un Ubuntu 20.04. Es un problema conocido, que viene de antiguo y que no acaba de solucionarse:

Otra de las infinitas miserias de Systemd...

Un apaño ahora mismo es prescindir del resolver local de Systemd cuando necesito acceso a los registros RRSIG. Es decir, enviar las peticiones a otro servidor DNS. Por ejemplo:

jcea@jcea:~$ delv nic.fr
;; no valid RRSIG resolving 'fr/DS/IN': 127.0.0.53#53
;; broken trust chain resolving 'nic.fr/A/IN': 127.0.0.53#53
;; resolution failed: broken trust chain

jcea@jcea:~$ delv @dns.jcea.es nic.fr
; fully validated
nic.fr.                 189     IN      A       192.134.5.37
nic.fr.                 189     IN      RRSIG   A 13 2 600 20220726044610 20220626111911 10335 nic.fr. zvFT9jkpNx7J1rvg1nxWLJh1c4VpJnAG/kEOb+z3zy+RQIEwp7072PTv K06DlhSxrFayN6mpApSfRhWfY9qGOw==