Subscribe to receive notifications of new posts:

Cómo hemos desarrollado DMARC Management con Cloudflare Workers

2023-03-17

10 min read
How we built DMARC Management

Qué son los informes DMARC

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:

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");
    }
  }
}

Muy claro, ¿no?

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.

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));
}

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

  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
  1. 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})
  1. 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()
  1. 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)
  1. 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
  )
  1. 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.

  2. 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:

<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>
  1. 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.

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.

Código abierto

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

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.

Contribuye, crea tus propias herramientas, estaremos atentos.

Ú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.

We protect entire corporate networks, help customers build Internet-scale applications efficiently, accelerate any website or Internet application, ward off DDoS attacks, keep hackers at bay, and can help you on your journey to Zero Trust.

Visit 1.1.1.1 from any device to get started with our free app that makes your Internet faster and safer.

To learn more about our mission to help build a better Internet, start here. If you're looking for a new career direction, check out our open positions.
Security Week (ES)Email Security (ES)Security (ES)DMARC (ES)Español

Follow on X

André Cruz|@edevil
Cloudflare|@cloudflare

Related posts

March 08, 2024 2:22 AM

Log Explorer supervisa los eventos de seguridad sin almacenamiento de terceros

La eficacia conjunta de nuestros análisis de seguridad y Log Explorer permite a los equipos de seguridad analizar, investigar y supervisar los ataques a la seguridad de forma nativa en Cloudflare. De esta forma, conseguimos reducir el tiempo de resolución y el coste total de propiedad para nuestros...

March 07, 2024 2:02 PM

Cloudflare protege la democracia mundial contra las amenazas de la tecnología emergente en la época de elecciones de 2024

En 2024 se celebrarán más de 80 elecciones nacionales, que afectarán directamente a unos 4200 millones de votantes. En Cloudflare, estamos preparados para apoyar a los protagonistas de los procesos electorales con herramientas de seguridad, rendimiento y fiabilidad para ayudar a facilitar el...