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!
[1] | (1, 2, 3) El flag AD significa "authenticated data". Indica que el resolver que estamos usando está haciendo validación DNSSEC y que esa petición en concreto contiene firmas DNSSEC y son correctas. Si el dominio no usase DNSSEC, no aparecería ese flag. Si el dominio usase DNSSEC pero las firmas no fuesen correctas, el resolver local daría un error. |
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:
- resolved stub resolver doesn't provide RRSIG data in replies when DO/CD queries are sent to it #4621.
- resolved should be able to 'proxy' DNSSEC to validating recursor #12317.
- resolved: DNSSEC records still not passed to applications #18714.
- resolved: actually use the specified rrsig argument #18747.
- resolved: DNSSEC stub validation broken (again) #22002.
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==