S/MIME Parte 3: Plug and Play para el correo electrónico seguro local

S/MIME Parte 3: Plug and Play para el correo electrónico seguro local

S/MIME Parte 3: Plug and Play para el correo electrónico seguro local

Dec 1, 2019

Publicado por

Publicado por

Bird

Bird

-

Categoría:

Categoría:

Email

Email

Ready to see Bird
in action?

Ready to see Bird
in action?

S/MIME Part 3: Plug and Play for On-Premises Secure Email

In parte 1, we had a quick tour of S/MIME, looking at signing and encryption of our message streams across a range of mail clients. Parte 2 took us through a simple command-line tool to sign and encrypt emails, then send them through SparkPost.

En esta parte, veremos cómo se puede adaptar la herramienta para inyectar flujos de correo en plataformas locales como Port25 PowerMTA y Momentum.

Bien, empecemos.

1. 1. Primeros pasos

Instalar la herramienta, obtener las claves, etc. es exactamente igual que antes. Si utiliza un sistema de correo electrónico local como PowerMTA o Momentum, ya es responsable de configurar los dominios de envío, las claves DKIM, etc. Lo que tenemos que hacer ahora es proporcionar alguna forma de inyectar los mensajes S/MIME completamente formados en tus servidores.

2. Inyección SMTP hacia el puerto 25 PowerMTA

PowerMTA soporta varios medios de inyección de mensajes, incluyendo un directorio de "recogida" de archivos, SMTP y una API. SMTP es el método utilizado aquí.

Para ilustrar la configuración más sencilla posible, instalaremos las herramientas S/MIME en el mismo servidor que PowerMTA. Inyectaremos mensajes al listener, que está abierto por defecto en el puerto TCP 25, aceptando sólo tráfico local.

export SMTP_HOST=localhost

(If you forget that step, you’ll see: “Environment var SMTP_HOST not set – stopping” when you try to run.)

Ya tenemos la clave privada del remitente (steve@thetucks.com.pem) y la clave pública del destinatario (steve.tuck@sparkpost.com.crt). Las primeras líneas del fichero de mensajes son:

To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: This is a message created using HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit

Enviamos el mensaje con:

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

Ya vemos:

Opened SMTP connection (plain) to localhost, port 25, user="", password="" Sending tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 seconds

El mensaje llega rápidamente a inbox y aparece en Mac Mail como firmado y cifrado.

Función adicional: DKIM con PowerMTA

DKIM es bastante fácil de configurar y coexiste felizmente con S/MIME. Los pasos son:

  • Use the PowerMTA Asistente DKIM site to create sending domain private key (in my case, mypmta.thetucks.com.pem) and public DNS TXT record contents.

  • Set up the DNS TXT record, with a chosen selector. For example, I used selector pmta201811. Valid selector characters are defined here.

  • Put mypmta.thetucks.com.pem file on the server in directory /etc/pmta .

  • Add the following to my /etc/pmta/config and restart the pmta service. (Here, these directives are written at global scope; on a production system, you might prefer to add them under a virtual-mta instead.)

host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *>    dkim-sign yes </domain>

El registro DNS se comprueba correctamente a través de MX Toolbox, y DKIM está ahora activo.


3. Inyección SMTP Hacia Momentum

Momentum soporta varios medios de inyección de mensajes, incluyendo API y SMTP. SMTP es el método utilizado aquí, hacia un host que ya ejecuta Momentum. Dejaremos su configuración sin cambios, puesto que ya tiene capacidad para aceptar inyecciones entrantes de otros hosts aprobados.

Se trata de una versión reducida de una configuración de producción, en la que los nodos de "generación" y los nodos MTA están separados, aunque estrechamente acoplados a través de una VLAN privada y equilibradores de carga, que transportan el tráfico interno de inyección SMTP.


Las herramientas S/MIME están instaladas como antes, e inyectaremos mensajes a la dirección del host SMTP (MTA):

export SMTP_HOST=xx.xx.xx.xx # establezca aquí su propia dirección MTA / VIP

Como antes, tenemos la clave privada del remitente (steve@thetucks.com.pem) y la clave pública del destinatario (steve.tuck@sparkpost.com.crt) ya presentes en el nodo "generación". Las primeras líneas del archivo de mensajes coinciden con estas direcciones.

Enviamos el mensaje desde el nodo "generación" exactamente con el mismo comando que antes, y el mensaje aparece en inbox.

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

As you’d expect, S/MIME also happily coexists with Momentum’s Firma DKIM.

4. Inyección SMTP hacia SparkPost

In parte 2 we used the SparkPost transmissions REST API to inject messages. Of course, it’s also possible to inject messages into SparkPost using SMTP. We set the environment variables like this:

export SMTP_PASSWORD=<<YOUR API KEY HERE>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587

If you’re using SparkPost Servicio alojado en la UE then set SMTP_HOST as smtp.eu.sparkpostmail.com.
(Ver aquí for more options – for example you can inject on port 2525 rather than 587.)

La siguiente salida muestra que se utiliza STARTTLS, junto con el nombre de usuario y la contraseña.

./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp

Ya lo verás:

Opened SMTP connection (STARTTLS) to smtp.sparkpostmail.com, port 587, user="SMTP_Injection", password="****************************************" Sending tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.057 seconds

La contraseña se imprime con caracteres *** sustitutos, para que no comprometas la privacidad de tu clave si alguien está mirando por encima de tu hombro.

Proteger sus credenciales

Ten en cuenta que las variables de entorno pueden configurarse en un archivo de guión de shell o similar, para ahorrarte tener que volver a escribirlas. Si lo haces, por favor cuida tus contraseñas/claves API limitando el acceso a ese archivo sólo a ti. Por ejemplo, si su archivo de configuración de credenciales se llama mi_envs.sh, entonces ejecute:

chmod 0700 mi_envs.sh

Advertencias relacionadas con SMTP que puede ver

La inyección SMTP de SparkPost es bastante estricta, como cabría esperar de un servicio público. Si no has configurado el número de puerto SMTP, verás una advertencia:

{'bob.lumreeker@gmail.com': (550, b'5.7.1 relaying denied')}

Si no has configurado el nombre de usuario SMTP o no has configurado la contraseña, lo verás:

(530, b'5.7.1 Se requiere autorización. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')

Estos mensajes de error son simplemente reportados tal cual por la librería SMTP de Python, de ahí el formato.

¿Cuál es más rápido, SMTP o API?

Francamente, es poco probable que S/MIME sea un caso de uso de gran volumen, pero tener la misma herramienta con dos opciones de salida era sólo pedir que corriéramos una carrera.

El archivo de prueba de correo electrónico "Avocado" utilizado aquí es de aproximadamente 19 KB. La repetición de las pruebas 10 veces mediante un bucle bash mostró que los tiempos medios eran similares para SMTP y API, alrededor de 60 milisegundos por mensaje, lo que es bastante rápido. En este caso, inyectamos desde una instancia EC2 media en la misma región de alojamiento que SparkPost.com, lo que es una buena forma de mantener bajos los tiempos de ida y vuelta de la red.

Repitiendo esto con un archivo de prueba más grande (577 KB), la API tardó unos 200 milisegundos, mientras que el SMTP tardó 280 milisegundos por mensaje, lo que sigue siendo impresionante para un tamaño de archivo 30 veces mayor. Por supuesto, el kilometraje puede variar dependiendo de la ubicación, la congestión de Internet, etc, pero el rendimiento es poco probable que sea un problema.

If you really need maximum performance, a good starting point would be to launch a set number of concurrent injection processes/sessions as per our buenas prácticas de transmisión recommendations – e.g. from a supervisor task.

Resumiendo...

We’ve seen how the SparkPost API-based tool used in Parte 2 is updated to support SMTP injection to support on-premises MTAs such as Port25 PowerMTA and Momentum in a variety of configurations, as well as with SparkPost.

Eso es todo por ahora. Feliz envío.

Your new standard in Marketing, Pay & Sales. It's Bird

En right message -> a la right person -> en el right time.

Your new standard in Marketing, Pay & Sales. It's Bird

En right message -> a la right person -> en el right time.