In parte 1, abbiamo fatto un breve tour di S/MIME, esaminando la firma e la crittografia dei nostri flussi di messaggi su un range di client di posta. Parte 2 ci ha portato attraverso un semplice strumento da riga di comando per firmare e crittografare le email, quindi inviarle tramite SparkPost.
In questa parte, esamineremo come lo strumento possa essere adattato per iniettare flussi di posta in piattaforme on-premises come Port25 PowerMTA e Momentum.
OK - iniziamo!
1. Iniziare
Installare lo strumento, ottenere le chiavi ecc. è esattamente lo stesso di prima. Quando si utilizza un sistema di posta elettronica on-premises come PowerMTA o Momentum, sei già responsabile della configurazione dei domini di invio, delle chiavi DKIM ecc. Quello che dobbiamo fare ora è fornire un modo per iniettare i messaggi S/MIME completamente formati nei tuoi server.
2. Iniezione SMTP verso Port25 PowerMTA
PowerMTA supporta vari mezzi di iniezione dei messaggi, incluso un file di directory "pickup", SMTP e un API. SMTP è il metodo utilizzato qui.
Per illustrare la configurazione più semplice possibile, installeremo gli strumenti S/MIME sullo stesso server di PowerMTA. Iniettiamo i messaggi al listener, che è aperto per impostazione predefinita sulla porta TCP 25, accettando solo il traffico locale.
export SMTP_HOST=localhost
(Se dimentichi questo passaggio, vedrai: "Variabile ambiente SMTP_HOST non impostata - arresto" quando proverai a eseguire.)
Abbiamo già presente la chiave privata del mittente (steve@thetucks.com.pem) e la chiave pubblica del destinatario (steve.tuck@sparkpost.com.crt). Le prime righe del file di messaggio sono:
To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: Questo è un messaggio creato usando HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: it-IT Content-Transfer-Encoding: 7bit
Inviamo il messaggio con:
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Vediamo:
Connessione SMTP aperta (plain) a localhost, porta 25, utente="", password="" Inviando tests/fancy-HTML-to-smt.eml Da: Steve <steve@thetucks.com> A: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 secondi
Il messaggio arriva rapidamente nella casella di posta e viene segnalato in Mac Mail come firmato e crittografato.
Funzione bonus: DKIM con PowerMTA
DKIM è abbastanza facile da configurare e coesiste felicemente con S/MIME. I passaggi sono:
Utilizzare il sito DKIM Wizard di PowerMTA per creare la chiave privata del dominio di invio (nel mio caso, mypmta.thetucks.com.pem) e i contenuti del record DNS TXT pubblico.
Impostare il record DNS TXT, con un selettore scelto. Ad esempio, ho usato il selettore pmta201811. I caratteri validi per il selettore sono definiti qui.
Posizionare il file mypmta.thetucks.com.pem nel server nella directory /etc/pmta .
Aggiungere quanto segue alla mia /etc/pmta/config e riavviare il servizio pmta. (Qui, queste direttive sono scritte a livello globale; su un sistema di produzione, potresti preferire aggiungerle sotto un virtual-mta.)
host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *> dkim-sign yes </domain>
Il record DNS è stato verificato correttamente tramite MX Toolbox, e DKIM è ora attivo.
3. Iniezione SMTP Verso Momentum
Momentum supporta vari mezzi di iniezione dei messaggi, inclusi API e SMTP. SMTP è il metodo utilizzato qui, verso un host che sta già eseguendo Momentum. Lasceremo la sua configurazione invariata, poiché ha già la capacità di accettare iniezioni in arrivo da altri host approvati.
Questa è una versione più piccola di una configurazione di produzione, dove i nodi di "generazione" e i nodi MTA sono separati, ma strettamente accoppiati tramite una VLAN privata e bilanciatori di carico, trasportando traffico di iniezione SMTP interno.
Gli strumenti S/MIME sono installati come prima, e inietteremo i messaggi all'indirizzo dell'host SMTP (MTA):
export SMTP_HOST=xx.xx.xx.xx # imposta il tuo MTA / indirizzo VIP qui
Come prima, abbiamo già presente la chiave privata del mittente (steve@thetucks.com.pem) e la chiave pubblica del destinatario (steve.tuck@sparkpost.com.crt) sul nodo di "generazione". Le prime righe del file di messaggio corrispondono a questi indirizzi.
Inviamo il messaggio dal nodo "generazione" con esattamente lo stesso comando di prima, e il messaggio appare nella casella di posta.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Come ti aspetteresti, S/MIME coesiste felicemente anche con la firma DKIM di Momentum.
4. Iniezione SMTP verso SparkPost
In parte 2 abbiamo utilizzato l'API REST delle trasmissioni SparkPost per iniettare messaggi. Naturalmente, è anche possibile iniettare messaggi in SparkPost utilizzando SMTP. Impostiamo le variabili di ambiente in questo modo:
export SMTP_PASSWORD=<<LA TUA CHIAVE API QUI>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Se stai utilizzando il servizio ospitato in UE di SparkPost allora imposta SMTP_HOST come smtp.eu.sparkpostmail.com.
(Vedi qui per ulteriori opzioni - ad esempio puoi iniettare sulla porta 2525 anziché 587.)
L'output sottostante mostra che viene utilizzato STARTTLS, insieme al nome utente e alla password.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Vedrai:
Connessione SMTP aperta (STARTTLS) a smtp.sparkpostmail.com, porta 587, utente="SMTP_Injection", password="****************************************" Inviando tests/fancy-HTML-to-smt.eml Da: Steve <steve@thetucks.com> A: SteveT <steve.tuck@sparkpost.com> OK - in 0.057 secondi
La password è stampata con caratteri * sostitutivi, quindi non stai compromettendo la privacy della tua chiave se qualcuno ti guarda oltre la spalla.
Proteggere le tue credenziali
Nota che le variabili di ambiente possono essere impostate in un file di script shell o simile, per risparmiare la riscrittura. Se lo fai, per favore proteggi le tue password/chiavi API limitando l'accesso a quel file solo a te. Ad esempio, se il tuo file di configurazione delle credenziali si chiama my_envs.sh, allora esegui:
chmod 0700 my_envs.sh
Avvertenze correlate a SMTP che potresti vedere
L'iniezione SMTP di SparkPost è piuttosto rigorosa, come ti aspetteresti da un servizio pubblico. Se non hai impostato il numero di porta SMTP, vedrai un avviso:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 relaying denied')}
Se non hai impostato il nome utente SMTP o non hai impostato la password, vedrai:
(530, b'5.7.1 Autenticazione richiesta. Riferimento https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
Questi messaggi di errore sono semplicemente riportati così come sono dalla libreria SMTP di Python, quindi il formato.
Qual è più veloce - SMTP o API?
Frontalmente, S/MIME è poco probabile che sia un caso d'uso ad alto volume, ma avere lo stesso strumento con due opzioni di output stava semplicemente chiedendo di farci una corsa!
Il file di prova email "Avocado" utilizzato qui è di circa 19KB. Ripetere i test 10 volte tramite un ciclo bash ha mostrato che i tempi medi sono simili per SMTP e API, intorno ai 60 millisecondi per messaggio, il che è piuttosto veloce. In questo caso, abbiamo iniettato da una istanza EC2 media nella stessa regione di hosting di SparkPost.com, che è un buon modo per mantenere bassi i tempi di andata e ritorno della rete.
Ripetendo questo con un file di test più grande (577KB), l'API ha impiegato circa 200 millisecondi, mentre SMTP ha impiegato 280 millisecondi per messaggio - ancora impressionante per una dimensione di file 30 volte più grande. Naturalmente, le tue performance possono variare a seconda della posizione, congestione di internet ecc., ma le prestazioni sono poco probabili siano un problema.
Se hai davvero bisogno di massime prestazioni, un buon punto di partenza sarebbe lanciare un certo numero di processi/sessioni di iniezione concorrenti secondo le nostre raccomandazioni sui migliori pratiche di trasmissione - ad esempio, da un compito supervisore.
Riassumendo ...
Abbiamo visto come lo strumento basato su API di SparkPost utilizzato in Parte 2 è stato aggiornato per supportare l'iniezione SMTP per supportare MTA on-premises come Port25 PowerMTA e Momentum in una varietà di configurazioni, così come con SparkPost.
Questo è tutto per ora! Buona invio.