Suscríbete para recibir notificaciones de nuevas publicaciones:

Cómo hemos desarrollado DMARC Management con Cloudflare Workers

2023-03-17

7 min de lectura
Esta publicación también está disponible en English, 繁體中文, Français, Deutsch, 日本語, 한국어 y 简体中文.

Qué son los informes DMARC

How we built DMARC Management

DMARC son las siglas de "Domain-based Message Authentication, Reporting, and Conformance" y hace referencia a la autenticación de mensajes, informes y conformidad basada en dominios. Es un protocolo de autenticación del correo electrónico que ayuda con la protección contra el phishing y la suplantación del correo electrónico.

Cuando se envía un correo electrónico, DMARC permite que el propietario del dominio configure un registro DNS que especifica qué métodos de autenticación, como por ejemplo SPF (Sender Policy Framework) y DKIM (DomainKeys Identified Mail), se utilizan para verificar la autenticidad del correo electrónico. Cuando el correo electrónico no pasa estas comprobaciones de autenticación, DMARC indica al proveedor de correo electrónico del remitente cómo manejar el mensaje, bien poniéndolo en cuarentena, bien rechazándolo.

Hoy en día, la importancia de DMARC está en aumento en Internet, donde los ataques de phishing y de suplantación del correo electrónico son cada vez más sofisticados y frecuentes. Mediante la implementación de DMARC, los propietarios de dominios pueden proteger su marca y a sus clientes contra las repercusiones negativas de estos ataques, como la pérdida de confianza, los daños a la reputación y las pérdidas financieras.

Además de proteger contra los ataques de phishing y de suplantación, DMARC también proporciona prestaciones de informes. Los propietarios de dominios pueden recibir informes sobre la actividad de autenticación del correo electrónico. Estos informes incluyen qué mensajes han pasado las comprobaciones de DMARC y cuáles no, así como el origen de estos mensajes.

La gestión de DMARC implica la configuración y el mantenimiento de políticas DMARC para un dominio. Una gestión de DMARC eficaz requiere la supervisión y el análisis continuados de la actividad de autenticación del correo electrónico, así como la capacidad de realizar ajustes y actualizaciones a las políticas DMARC según las necesidades.

Estos son algunos de los componentes principales de una gestión de DMARC eficaz:

  • Configuración de políticas DMARC: implica configurar el registro DMARC del dominio para especificar los métodos de autenticación y las políticas adecuados para manejar los mensajes que no pasen las comprobaciones de autenticación. Este es el aspecto de un registro DNS DMARC:

v=DMARC1; p=reject; rua=mailto:[email protected]

Especifica que utilizaremos DMARC versión 1, que nuestra política rechazará los correos electrónicos si no pasan las comprobaciones de DMARC, y la dirección de correo electrónico a la que los proveedores deben enviar los informes DMARC.

  • Supervisión de la actividad de autenticación del correo electrónico: los informes DMARC son una herramienta importante para que los propietarios de dominios puedan garantizar la seguridad y la capacidad de entrega del correo electrónico, así como la conformidad con los estándares y las normativas del sector. Mediante la supervisión y el análisis periódicos de los informes DMARC, los propietarios de dominios pueden identificar las amenazas de correo electrónico, optimizar las campañas de correo electrónico y mejorar la autenticación del correo electrónico a nivel global.

  • Realización de los ajustes necesarios: en función de los análisis de los informes DMARC, los propietarios de dominios pueden realizar ajustes en los métodos de autenticación o en las políticas DMARC para garantizar la autenticación y la protección adecuadas de los mensajes de correo electrónico contra los ataques de phishing y de suplantación.

  • Colaboración con proveedores de correo electrónico y externos: una gestión de DMARC eficaz puede requerir la colaboración con proveedores de correo electrónico y externos para garantizar la implementación y la aplicación adecuadas de las políticas DMARC.

Hoy, anunciamos el lanzamiento de la solución DMARC Management. Así es cómo la hemos desarrollado.

Cómo la hemos desarrollado

Como uno de los principales proveedores de soluciones de seguridad y rendimiento basadas en la nube, en Cloudflare adoptamos un enfoque determinado para probar nuestros productos. Somos los primeros usuarios en probar nuestros propios servicios y herramientas, lo que significa que los utilizamos para llevar nuestro negocio. Esto nos ayuda a identificar los problemas o errores antes de que afecten a nuestros usuarios.

Utilizamos nuestros productos internamente, como por ejemplo Cloudflare Workers, una plataforma sin servidor que permite a los desarrolladores ejecutar su código en nuestra red global. Desde su lanzamiento en 2017, el ecosistema de Workers ha crecido de manera notable. Hoy en día, miles de desarrolladores desarrollan e implementan aplicaciones en la plataforma. La eficacia del ecosistema de Workers radica en su capacidad de permitir a los desarrolladores desarrollar sofisticadas aplicaciones cuya ejecución tan cerca de los clientes antes resultaba imposible o poco práctica. Workers se puede utilizar para desarrollar las API, para generar contenido dinámico, para optimizar imágenes, para realizar proceso en tiempo real y mucho más. Las posibilidades son prácticamente infinitas. Hemos utilizado Workers para servicios como Radar 2.0 o para paquetes de software como Wildebeest.

Recientemente, nuestro producto Email Routing se unió a Workers, lo que permite procesar los correos electrónicos entrantes mediante scripts de Workers. Como indica la documentación: "Con Workers de correo electrónico puedes utilizar la eficacia de Cloudflare Workers para implementar cualquier lógica que necesites para procesar tus correos electrónicos y crear reglas complejas. Estas reglas determinan qué sucede cuando recibes un correo electrónico". Tanto las reglas como las direcciones verificadas se pueden configurar mediante nuestra API.

Este es el aspecto de un Worker de correo electrónico sencillo:

Muy claro, ¿no?

export default {
  async email(message, env, ctx) {
    const allowList = ["[email protected]", "[email protected]"];
    if (allowList.indexOf(message.headers.get("from")) == -1) {
      message.setReject("Address not allowed");
    } else {
      await message.forward("inbox@corp");
    }
  }
}

Con la capacidad de procesar mediante programación los correos electrónicos entrantes in situ, parece la manera perfecta de manejar los correos electrónicos de informes DMARC entrantes de forma escalable y eficaz, dejando que Email Routing y Workers se encarguen de la pesada tarea de recibir un número ilimitado de correos electrónicos de todo el mundo. Aquí tienes una descripción general de las tareas que necesitábamos hacer:

  1. Recibir el correo electrónico y extraer el informe

  2. Publicar los detalles relevantes en la plataforma de análisis

  3. Almacenar el informe sin procesar

Los Workers de correo electrónico nos permiten realizar fácilmente la primera tarea. Solo debemos crear un worker con un controlador email(). Este recibirá los elementos de sobre SMTP, una versión preanalizada de los encabezados de correo electrónico y una secuencia para leer todo el correo electrónico sin procesar.

Para la segunda tarea, también podemos recurrir a la plataforma Workers, donde encontraremos Workers Analytics Engine. Solo debemos definir un esquema adecuado, que depende tanto de lo que incluyan los informes como de las consultas que tengamos previsto realizar posteriormente. A continuación, podemos consultar los datos mediante la API GraphQL o SQL.

Para la tercera tarea, simplemente podemos utilizar nuestro almacenamiento de objetos R2. El acceso a R2 desde un Worker es extremadamente sencillo. Una vez extraídos los informes del correo electrónico, los almacenaremos en R2 para la posteridad.

Hemos desarrollado esta solución como un servicio administrado que puedes activar en tu zona. También hemos añadido una interfaz de panel de control para tu comodidad. No obstante, en realidad dispones de todas las herramientas para implementar tu propio procesador de informes DMARC en Cloudflare Workers, en tu propia cuenta, sin tener que preocuparte por los servidores, la escalabilidad o el rendimiento.

Arquitectura

Workers de correo electrónico es una función de nuestro producto Email Routing, que se ejecuta en todos nuestros nodos, por lo que cualquiera de ellos puede procesar el correo entrante. Esto es importante porque anunciamos el prefijo BGP de entrada de correo electrónico desde todos nuestros centros de datos. El envío de correos electrónicos a un Worker de correo electrónico es tan fácil como establecer una regla en el panel de control de Email Routing.

Cuando el componente Email Routing recibe un correo electrónico que coincide con una regla para su entrega a un Worker, se pondrá en contacto con nuestra versión interna del tiempo de ejecución de workerd, que hace poco pasó a ser de código abierto, y que también se ejecuta en todos los nodos. El esquema RPC que controla esta interacción se define en un esquema Capnproto, y permite la transmisión del cuerpo del correo electrónico a Edgeworker al leerlo. Si el script de worker decide reenviar este correo electrónico, Edgeworker se pondrá en contacto con Email Routing mediante una función enviada en la solicitud original.

En el contexto de los informes DMARC, manejamos los correos electrónicos entrantes así:

jsg::Promise<void> ForwardableEmailMessage::forward(kj::String rcptTo, jsg::Optional<jsg::Ref<Headers>> maybeHeaders) {
  auto req = emailFwdr->forwardEmailRequest();
  req.setRcptTo(rcptTo);

  auto sendP = req.send().then(
      [](capnp::Response<rpc::EmailMetadata::EmailFwdr::ForwardEmailResults> res) mutable {
    auto result = res.getResponse().getResult();
    JSG_REQUIRE(result.isOk(), Error, result.getError());
  });
  auto& context = IoContext::current();
  return context.awaitIo(kj::mv(sendP));
}
  1. Obtenemos el destinatario del correo electrónico que se está procesando, es decir, el registro RUA utilizado. El registro RUA es un parámetro de configuración de DMARC que indica dónde se debe notificar la información agregada de proceso de DMARC relativa a un dominio específico. Este destinatario se encuentra en el atributo "to" del mensaje.

    const ruaID = message.to

  2. Puesto que manejamos informes DMARC para un número ilimitado de dominios, utilizamos Workers KV para almacenar información sobre cada uno de ellos y especificar esta información acerca del registro RUA. Esto también nos permite saber si deberíamos recibir estos informes.

    const accountInfoRaw = await env.KV_DMARC_REPORTS.get(dmarc:${ruaID})

  3. En este punto, queremos leer todo el correo electrónico en arrayBuffer para analizarlo. En función del tamaño del informe, podemos encontrarnos con los límites del plan gratuito de Workers. Si sucede esto, te recomendamos que cambies al modelo de recursos Workers Unbound que no tiene esta limitación.

    const rawEmail = new Response(message.raw) const arrayBuffer = await rawEmail.arrayBuffer()

  4. El análisis del correo electrónico sin procesar implica, entre otros, el análisis de sus componentes MIME. Varias bibliotecas disponibles permiten hacerlo. Por ejemplo, podrías utilizar postal-mime:

    const parser = new PostalMime.default() const email = await parser.parse(arrayBuffer)

  5. Una vez analizado el correo electrónico, tenemos acceso a sus archivos adjuntos, que son los propios informes DMARC y pueden estar comprimidos. Lo primero que haremos será almacenarlos en su formato comprimido en R2 para su almacenamiento a largo plazo, ya que pueden ser útiles más adelante para volver a procesar o investigar informes de interés. Para ello, es tan sencillo como llamar a put() en el enlace R2. Para facilitar su posterior recuperación, recomendamos distribuir los archivos de informes en directorios basados en la hora actual.

    await env.R2_DMARC_REPORTS.put( ${date.getUTCFullYear()}/${date.getUTCMonth() + 1}/${attachment.filename}, attachment.content )

  6. Ahora debemos buscar el tipo MIME del archivo adjunto. El formato sin procesar de los informes DMARC es XML, pero pueden estar comprimidos. Si es así, primero debemos descomprimirlos. Los archivos de informes DMARC pueden utilizar varios algoritmos de compresión. Utilizamos el tipo MIME para saber cuál utilizar. Para los informes comprimidos Zlib podemos utilizar pako, mientras que para los archivos comprimidos ZIP, unzipit es una buena opción.

  7. Una vez que hemos obtenido el formato XML sin procesar del informe, fast-xml-parser los ha analizado automáticamente. El formato XML del informe DMARC es el siguiente:

  8. Ahora tenemos todos los datos del informe a nuestra disposición. Lo que hagamos con ellos dependerá mucho de cómo queramos presentarlos. En nuestro caso, el objetivo era mostrar información significativa extraída de ellos en nuestro panel de control. Por lo tanto, necesitábamos una plataforma de análisis donde pudiéramos enviar los datos enriquecidos. Aquí utilizamos Workers Analytics Engine. Analytics Engine es perfecto para esta tarea, puesto que nos permite enviarle datos desde un worker, y expone una GraphQL API para interactuar posteriormente con los datos. Así es cómo obtenemos los datos para que se muestren en nuestro panel de control.

De cara al futuro, también estamos considerando la integración de Queues en el flujo de trabajo para procesar de forma asíncrona el informe y evitar tener que esperar a que el cliente lo complete.

const ruaID = message.to

Hemos conseguido implementar el proyecto de un extremo a otro basándonos exclusivamente en la infraestructura de Workers. Esto demuestra no solo que es posible el desarrollo de aplicaciones complejas sin tener que preocuparse acerca de la escalabilidad, el rendimiento, el almacenamiento y la seguridad, sino que también presenta ventajas.

const accountInfoRaw = await env.KV_DMARC_REPORTS.get(dmarc:${ruaID})

Código abierto

const rawEmail = new Response(message.raw)
const arrayBuffer = await rawEmail.arrayBuffer()

Como hemos mencionado anteriormente, hemos desarrollado un servicio administrado que puedes activar y utilizar, y nosotros seremos los encargados de administrarlo. Sin embargo, tú también puedes implementar todo lo que hemos hecho, en tu cuenta, para poder administrar tus propios informes DMARC. Es fácil y gratuito. Para ayudarte, lanzamos una versión de código abierto de un Worker que procesa los informes DMARC de la forma descrita más arriba: https://github.com/cloudflare/dmarc-email-worker

const parser = new PostalMime.default()
const email = await parser.parse(arrayBuffer)

Si no tienes un panel de control donde mostrar los datos, también puedes consultar Analytics Engine desde un Worker. O bien, si quieres almacenarlos en una base de datos relacional, D1 puede ayudarte. Las posibilidades son infinitas. Estamos deseando saber que desarrollarás con estas herramientas.

await env.R2_DMARC_REPORTS.put(
    `${date.getUTCFullYear()}/${date.getUTCMonth() + 1}/${attachment.filename}`,
    attachment.content
  )

Contribuye, crea tus propias herramientas, estaremos atentos.

<feedback>
  <report_metadata>
    <org_name>example.com</org_name>
    <[email protected]</email>
   <extra_contact_info>http://example.com/dmarc/support</extra_contact_info>
    <report_id>9391651994964116463</report_id>
    <date_range>
      <begin>1335521200</begin>
      <end>1335652599</end>
    </date_range>
  </report_metadata>
  <policy_published>
    <domain>business.example</domain>
    <adkim>r</adkim>
    <aspf>r</aspf>
    <p>none</p>
    <sp>none</sp>
    <pct>100</pct>
  </policy_published>
  <record>
    <row>
      <source_ip>192.0.2.1</source_ip>
      <count>2</count>
      <policy_evaluated>
        <disposition>none</disposition>
        <dkim>fail</dkim>
        <spf>pass</spf>
      </policy_evaluated>
    </row>
    <identifiers>
      <header_from>business.example</header_from>
    </identifiers>
    <auth_results>
      <dkim>
        <domain>business.example</domain>
        <result>fail</result>
        <human_result></human_result>
      </dkim>
      <spf>
        <domain>business.example</domain>
        <result>pass</result>
      </spf>
    </auth_results>
  </record>
</feedback>

Últimas palabras

Esperamos que esta publicación te haya permitido entender mejor la plataforma Workers. Actualmente, en Cloudflare aprovechamos esta plataforma para desarrollar la mayoría de nuestros servicios. Creemos que tú deberías hacer lo mismo.

No dudes en contribuir a nuestra versión de código abierto y mostrarnos lo que puedes hacer con ella.

También estamos trabajando con la solución Email Routing para ampliar la funcionalidad de la API de Workers de correo electrónico. Pronto dedicaremos otra publicación a este tema.

Protegemos redes corporativas completas, ayudamos a los clientes a desarrollar aplicaciones web de forma eficiente, aceleramos cualquier sitio o aplicación web, prevenimos contra los ataques DDoS, mantenemos a raya a los hackers, y podemos ayudarte en tu recorrido hacia la seguridad Zero Trust.

Visita 1.1.1.1 desde cualquier dispositivo para empezar a usar nuestra aplicación gratuita y beneficiarte de una navegación más rápida y segura.

Para saber más sobre nuestra misión para ayudar a mejorar Internet, empieza aquí. Si estás buscando un nuevo rumbo profesional, consulta nuestras ofertas de empleo.
Security Week (ES)Email Security (ES)SeguridadDMARC (ES)

Síguenos en X

André Cruz|@edevil
Cloudflare|@cloudflare

Publicaciones relacionadas

08 de octubre de 2024, 13:00

Cloudflare acquires Kivera to add simple, preventive cloud security to Cloudflare One

The acquisition and integration of Kivera broadens the scope of Cloudflare’s SASE platform beyond just apps, incorporating increased cloud security through proactive configuration management of cloud services. ...

06 de octubre de 2024, 23:00

Enhance your website's security with Cloudflare’s free security.txt generator

Introducing Cloudflare’s free security.txt generator, empowering all users to easily create and manage their security.txt files. This feature enhances vulnerability disclosure processes, aligns with industry standards, and is integrated into the dashboard for seamless access. Strengthen your website's security today!...