En parte 1, tuvimos un recorrido rápido por S/MIME, observando la firma y encriptación de nuestros flujos de mensajes en una variedad de clientes de correo. Parte 2 nos llevó a través de una herramienta simple de línea de comandos para firmar y encriptar correos electrónicos, y luego enviarlos a través de SparkPost.
En esta parte, veremos cómo la herramienta se puede adaptar para inyectar flujos de correo en plataformas locales como Port25 PowerMTA y Momentum.
¡OK – comencemos!
1. Comenzando
La instalación de la herramienta, la obtención de tus claves, etc., es exactamente la misma que antes. Cuando utilizas un sistema de correo electrónico local como PowerMTA o Momentum, ya eres responsable de configurar dominios de envío, claves DKIM, etc. Lo que necesitamos hacer ahora es proporcionar una forma de inyectar los mensajes S/MIME completamente formados en tus servidores.
2. Inyección SMTP hacia Port25 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 simple posible, instalaremos las herramientas S/MIME en el mismo servidor que PowerMTA. Inyectamos mensajes al escucha, que está abierto por defecto en el puerto TCP 25, aceptando solo tráfico local.
export SMTP_HOST=localhost
(Si olvidas ese paso, verás: “Var. de entorno SMTP_HOST no establecida – deteniendo” cuando intentes ejecutar.)
Ya tenemos la clave privada del remitente (steve@thetucks.com.pem) y la clave pública del destinatario (steve.tuck@sparkpost.com.crt) presentes. Las primeras líneas del archivo de mensaje son:
Para: SteveT <steve.tuck@sparkpost.com> De: Steve <steve@thetucks.com> Asunto: Este es un mensaje creado usando HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: es-ES Content-Transfer-Encoding: 7bit
Enviamos el mensaje con:
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Vemos:
Conexión SMTP abierta (plana) a localhost, puerto 25, usuario="", contraseña="" Enviando tests/fancy-HTML-to-smt.eml De: Steve <steve@thetucks.com> Para: SteveT <steve.tuck@sparkpost.com> OK - en 0.028 segundos
El mensaje llega rápidamente a la bandeja de entrada y reporta en Mac Mail como firmado y encriptado.
Característica adicional: DKIM con PowerMTA
DKIM es bastante fácil de configurar y coexiste felizmente con S/MIME. Los pasos son:
Usa el sitio del Asistente DKIM de PowerMTA para crear la clave privada del dominio de envío (en mi caso, mypmta.thetucks.com.pem) y los contenidos del registro DNS TXT público.
Configura el registro DNS TXT, con un selector elegido. Por ejemplo, usé el selector pmta201811. Los caracteres válidos para el selector están definidos aquí.
Pone el archivo mypmta.thetucks.com.pem en el servidor en el directorio /etc/pmta .
Agrega lo siguiente a mi /etc/pmta/config y reinicia el servicio pmta. (Aquí, estas directivas están escritas en el ámbito global; en un sistema de producción, podrías preferir agregarlas bajo un virtual-mta en su lugar.)
host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *> dkim-sign yes </domain>
El registro DNS se verifica correctamente a través de MX Toolbox, y DKIM ahora está 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, ya que ya tiene la capacidad de aceptar inyecciones entrantes de otros hosts aprobados.
Esta es una versión más pequeña de una configuración de producción, donde los nodos de “generación” y los nodos MTA son separados, pero estrechamente acoplados a través de una VLAN privada y balanceadores de carga, llevando tráfico de inyección SMTP interno.
Las herramientas S/MIME están instaladas como antes, y inyectaremos mensajes a la dirección del host SMTP (MTA):
export SMTP_HOST=xx.xx.xx.xx # configura tu propia dirección MTA / VIP aquí
Como antes, ya tenemos la clave privada del remitente (steve@thetucks.com.pem) y la clave pública del destinatario (steve.tuck@sparkpost.com.crt) presentes en el nodo de “generación”. Las primeras líneas del archivo de mensaje coinciden con estas direcciones.
Enviamos el mensaje desde el nodo de “generación” con exactamente el mismo comando que antes, y el mensaje aparece en la bandeja de entrada.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Como esperarías, S/MIME también coexiste felizmente con la firma DKIM de Momentum.
4. Inyección SMTP hacia SparkPost
En parte 2 usamos la API REST de transmisiones de SparkPost para inyectar mensajes. Por supuesto, también es posible inyectar mensajes en SparkPost usando SMTP. Establecemos las variables de entorno así:
export SMTP_PASSWORD=<<TU CLAVE API AQUÍ>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Si estás usando el servicio alojado en la UE de SparkPost, entonces establece SMTP_HOST como smtp.eu.sparkpostmail.com.
(Consulta aquí para más opciones – por ejemplo, puedes inyectar en el puerto 2525 en lugar de 587.)
La salida a continuación 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
Verás:
Conexión SMTP abierta (STARTTLS) a smtp.sparkpostmail.com, puerto 587, usuario="SMTP_Injection", contraseña="****************************************" Enviando tests/fancy-HTML-to-smt.eml De: Steve <steve@thetucks.com> Para: SteveT <steve.tuck@sparkpost.com> OK - en 0.057 segundos
La contraseña se imprime con caracteres de sustitución ***, así que no comprometes la privacidad de tu clave si alguien está mirando por encima de tu hombro.
Asegurando tus Credenciales
Ten en cuenta que las variables de entorno podrían configurarse en un archivo de script shell o similar, para evitar volver a escribir. Si lo haces, cuida tus contraseñas/claves API limitando el acceso a ese archivo solo a ti. Por ejemplo, si tu archivo de configuración de credenciales se llama my_envs.sh, entonces ejecuta:
chmod 0700 my_envs.sh
Advertencias Relacionadas con SMTP que Podrías Ver
La inyección SMTP de SparkPost es bastante estricta, como esperarías de un servicio público. Si no has establecido el número de puerto SMTP, verás una advertencia:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 relaying denied')}
Si no has establecido el nombre de usuario SMTP o no has establecido la contraseña, verás:
(530, b'5.7.1 Authorization required. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
Estos mensajes de error se reportan simplemente tal como están desde la biblioteca SMTP de Python, de ahí el formato.
¿Cuál es más rápido – SMTP o API?
Francamente, S/MIME es poco probable que sea un caso de uso de alto volumen, pero tener la misma herramienta con dos opciones de salida solo pidió que corriéramos una carrera!
El archivo de prueba de correo “Aguacate” utilizado aquí es aproximadamente 19KB. Repetir las pruebas 10 veces a través de un bucle bash mostró que los tiempos promedios son 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 mediana en la misma región de hospedaje que SparkPost.com, lo que es una buena manera de mantener bajos los tiempos de ida y vuelta de la red.
Repitiendo esto con un archivo de prueba más grande (577KB), la API tomó aproximadamente 200 milisegundos, mientras que SMTP tomó 280 milisegundos por mensaje – aún impresionante para un tamaño de archivo 30x mayor. Por supuesto, tu experiencia puede variar dependiendo de la ubicación, la congestión en internet, etc., pero es poco probable que el rendimiento sea un problema.
Si realmente necesitas el máximo rendimiento, un buen punto de partida sería lanzar un número establecido de procesos/sesiones de inyección concurrentes según nuestras mejores prácticas de transmisión – por ejemplo, desde una tarea supervisora.
Resumiendo …
Hemos visto cómo la herramienta basada en API de SparkPost utilizada en Parte 2 se actualiza para soportar la inyección SMTP para apoyar a los MTA locales como Port25 PowerMTA y Momentum en una variedad de configuraciones, así como con SparkPost.
¡Eso es todo por ahora! ¡Feliz envío!