dnsscan: escáner de seguridad DNS en Go que evalúa DNSSEC, SPF, DMARC, CAA y MTA-STS

Verificar que un dominio tiene bien configurado SPF, DMARC, DNSSEC o MTA-STS suele implicar abrir varias herramientas distintas o hacer consultas DNS a mano. dnsscan lo agrupa todo en un único pase: evalúa los controles de seguridad de la capa DNS de un dominio y devuelve un grade de A+ a F con puntuación numérica de 0 a 100, explicando exactamente qué pasa y por qué.

Qué controles evalúa dnsscan

El escáner de seguridad DNS cubre siete controles modernos de la capa DNS:

  • DNSSEC: comprueba la presencia de registros DNSKEY/RRSIG y el flag AD del resolver, reportando si está habilitado y si la validación es correcta.
  • CAA: detecta los registros CAA en el apex del dominio, indicando qué autoridades de certificación están autorizadas a emitir.
  • SPF: lee el registro TXT v=spf1 y analiza la política terminal: -all (estricto), ~all (softfail), ?all (neutral) o +all (peligrosamente permisivo).
  • DMARC: consulta el TXT en _dmarc.dominio y reporta la política (none, quarantine o reject) con el registro completo.
  • MTA-STS: si el TXT _mta-sts está presente, descarga y parsea el fichero de política en https://mta-sts.dominio/.well-known/mta-sts.txt con certificado validado, timeout de 5 s y un guard anti-SSRF que rechaza redirecciones fuera del dominio. Reporta modo, max_age y la lista de MX autorizados.
  • TLS-RPT: detecta el TXT en _smtp._tls.dominio para informes de fallos de entrega cifrada.
  • DKIM: solo informativo (requiere un selector explícito para comprobarse).

El resultado en JSON

El contrato de salida es un struct JSON estable —los campos nunca se renombran ni eliminan, solo se añaden— que incluye grade, score, el detalle de cada control y un array de findings con status pass/warn/fail/info y severity info/low/medium/high. Ejemplo resumido para un dominio bien configurado:

{"domain":"cloudflare.com","grade":"A","score":85,
 "spf":{"present":true,"policy":"-all"},
 "dmarc":{"present":true,"policy":"reject"},
 "dnssec":{"enabled":true,"valid":true}}

Tres formas de usarlo

Como librería Go: dnsscan.Scan(ctx, dnsscan.Options{Domain: "ejemplo.com"}) devuelve el Result completo. Una única dependencia externa: github.com/miekg/dns (BSD-3-Clause, comercialmente compatible).

Como CLI: dnsscan ejemplo.com para salida legible o dnsscan -json -resolver 1.1.1.1 ejemplo.com para JSON con resolver explícito. El timeout total es configurable (-timeout 10s).

Como servicio HTTP: headerforge-dns escucha en 127.0.0.1:8082 por defecto y acepta POST /v1/scan con JSON body. Misma arquitectura que su proyecto hermano tlsscan: pensado para comunicación interna o reverse proxy, no para exposición directa a internet.

Licencia y uso en productos comerciales

El proyecto tiene licencia MIT. Es el motor DNS de HeaderForge, pero se publica de forma independiente para que cualquiera pueda embeber el análisis de postura de seguridad DNS en sus propios productos sin fricción de licencia. Requiere Go 1.22+ y está disponible en GitHub con un Dockerfile incluido para despliegue containerizado.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP