In deel 1 hebben we een snelle tour gemaakt van S/MIME, waarbij we keken naar ondertekening en versleuteling van onze berichtenstromen over een reeks e-mailclients. Deel 2 bracht ons door een eenvoudige opdrachtregeltool om e-mails te ondertekenen en te versleutelen, en ze vervolgens via SparkPost te verzenden.
In dit deel bekijken we hoe de tool kan worden aangepast om mailstromen te injecteren in lokale platforms zoals Port25 PowerMTA en Momentum.
OK – laten we beginnen!
1. Aan de Slag
Het installeren van de tool, het verkrijgen van jouw sleutels, enzovoort, is precies hetzelfde als voorheen. Als je een lokaal e-mailsysteem gebruikt zoals PowerMTA of Momentum, ben je al verantwoordelijk voor het instellen van verzendende domeinen, DKIM-sleutels enzovoort. Wat we nu moeten doen, is een manier bieden om de volledig gevormde S/MIME-berichten in je servers te injecteren.
2. SMTP-injectie naar Port25 PowerMTA
PowerMTA ondersteunt verschillende methoden van berichtinjectie, waaronder een bestandsmap “pickup”, SMTP en een API. SMTP is de methode die hier wordt gebruikt.
Om de eenvoudigst mogelijke installatie te illustreren, installeren we de S/MIME-tools op dezelfde server als PowerMTA. We injecteren berichten naar de listener, die standaard openstaat op TCP-poort 25 en alleen lokaal verkeer accepteert.
export SMTP_HOST=localhost
(Als je die stap vergeet, zul je zien: “Environment var SMTP_HOST not set – stoppen” wanneer je probeert uit te voeren.)
We hebben al de privésleutel van de zender (steve@thetucks.com.pem) en de publieke sleutel van de ontvanger (steve.tuck@sparkpost.com.crt) aanwezig. De eerste paar regels van het berichtbestand zijn:
To: SteveT <steve.tuck@sparkpost.com> From: Steve <steve@thetucks.com> Subject: Dit is een bericht gemaakt met HEML MIME-Version: 1.0 Content-Type: text/html; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 7bit
We verzenden het bericht met:
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
We zien:
Geopende SMTP-verbinding (plain) naar localhost, poort 25, gebruiker="", wachtwoord="" Verzenden van tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.028 seconden
Het bericht komt snel aan in de inbox en meldt zich in Mac Mail als ondertekend en versleuteld.
Bonusfunctie: DKIM met PowerMTA
DKIM is vrij eenvoudig te configureren en werkt goed samen met S/MIME. De stappen zijn:
Gebruik de PowerMTA DKIM Wizard site om een privésleutel voor het verzendende domein te maken (in mijn geval, mypmta.thetucks.com.pem) en de inhoud van het publieke DNS TXT-record.
Stel het DNS TXT-record in, met een gekozen selector. Bijvoorbeeld, ik gebruikte selector pmta201811. Geldige selectortekens zijn hier gedefinieerd.
Plaats mypmta.thetucks.com.pem-bestand op de server in de map /etc/pmta .
Voeg het volgende toe aan mijn /etc/pmta/config en start de pmta-dienst opnieuw op. (Hier zijn deze richtlijnen geschreven op globale schaal; op een productiesysteem wil je ze misschien liever onder een virtual-mta toevoegen.)
host-naam thetucks.com domein-sleutel pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domein *> dkim-sign ja </domein>
Het DNS-record wordt correct gecontroleerd via MX Toolbox en DKIM is nu actief.
3. SMTP-injectie naar Momentum
Momentum ondersteunt verschillende methoden van berichtinjectie, inclusief API en SMTP. SMTP is de methode die hier wordt gebruikt, naar een host die al Momentum draait. We laten de configuratie ongewijzigd, omdat deze al de mogelijkheid heeft om inkomende injecties van andere goedgekeurde hosts te accepteren.
Dit is een kleinere versie van een productie-installatie, waarbij “generatie” knooppunten en MTA-knooppunten gescheiden zijn, maar nauw verbonden via een privé-VLAN en load-balancers, die interne SMTP-injectieverkeer dragen.
De S/MIME-tools worden zoals voorheen geïnstalleerd en we zullen berichten injecteren naar het adres van de SMTP-host (MTA):
export SMTP_HOST=xx.xx.xx.xx # stel hier je eigen MTA / VIP-adres in
Zoals voorheen hebben we de privésleutel van de afzender (steve@thetucks.com.pem) en de publieke sleutel van de ontvanger (steve.tuck@sparkpost.com.crt) al aanwezig op het “generatie” knooppunt. De eerste paar regels van het berichtbestand komen overeen met deze adressen.
We verzenden het bericht vanuit het “generatie” knooppunt met exact dezelfde opdracht als voorheen, en het bericht verschijnt in de inbox.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Zoals je zou verwachten, werkt S/MIME ook prima samen met Momentum's DKIM-ondertekening.
4. SMTP-injectie naar SparkPost
In deel 2 gebruikten we de SparkPost-transmissies REST API om berichten te injecteren. Natuurlijk is het ook mogelijk om berichten te injecteren in SparkPost met behulp van SMTP. We stellen de omgevingsvariabelen zo in:
export SMTP_PASSWORD=<<JE API SLEUTEL HIER>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Als je SparkPost EU-gehoste dienst gebruikt, stel dan SMTP_HOST in als smtp.eu.sparkpostmail.com.
(Zie hier voor meer opties – bijvoorbeeld kun je injecteren op poort 2525 in plaats van 587.)
De onderstaande uitvoer toont dat STARTTLS wordt gebruikt, samen met de gebruikersnaam en het wachtwoord.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Je zult zien:
Geopende SMTP-verbinding (STARTTLS) naar smtp.sparkpostmail.com, poort 587, gebruiker="SMTP_Injection", wachtwoord="****************************************" Verzending van tests/fancy-HTML-to-smt.eml From: Steve <steve@thetucks.com> To: SteveT <steve.tuck@sparkpost.com> OK - in 0.057 seconden
Het wachtwoord wordt weergegeven met vervangende *** tekens, zodat je de privacy van je sleutel niet in gevaar brengt als iemand over je schouder meekijkt.
Je Inloggegevens Beveiligen
Let op dat omgevingsvariabelen kunnen worden ingesteld in een shellscriptbestand of iets dergelijks om het opnieuw typen te besparen. Als je dat doet, zorg dan voor je wachtwoorden/API-sleutels door de toegang tot dat bestand alleen voor jezelf te beperken. Bijvoorbeeld, als je inloggegevensinstellingsbestand my_envs.sh heet, voer dan uit:
chmod 0700 my_envs.sh
SMTP-gerelateerde Waarschuwingen Die je Kunt Zien
De SMTP-injectie van SparkPost is vrij strikt, zoals je zou verwachten van een openbare dienst. Als je het SMTP-poortnummer niet hebt ingesteld, zie je een waarschuwing:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 relaying denied')}
Als je de SMTP-gebruikersnaam niet hebt ingesteld of het wachtwoord niet hebt ingesteld, zie je:
(530, b'5.7.1 Authorization required. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
Deze foutmeldingen worden gewoon als zodanig gerapporteerd vanuit de Python SMTP-bibliotheek, daarom de opmaak.
Welke is sneller - SMTP of API?
Eerlijk gezegd is S/MIME waarschijnlijk geen gebruik voor hoge volumes, maar het hebben van dezelfde tool met twee uitvoeropties vroeg er gewoon om dat we een race hielden!
Het “Avocado” e-mailtestbestand dat hier wordt gebruikt is ongeveer 19KB. Het herhalen van de tests 10 keer via een bashlus toonde aan dat de gemiddelde tijden vergelijkbaar waren voor SMTP en API, ongeveer 60 milliseconden per bericht, wat behoorlijk snel is. In dit geval injecteerden we vanuit een medium EC2-instance in dezelfde hostingregio als Bird.com, wat een goede manier is om netwerkronde reistijden laag te houden.
Bij het herhalen hiervan met een groter testbestand (577KB), nam de API ongeveer 200 milliseconden in beslag, terwijl SMTP 280 milliseconden per bericht nam – nog steeds indrukwekkend voor een bestandsgrootte 30x groter. Uiteraard kunnen jouw resultaten variëren afhankelijk van locatie, internetcongestie, enzovoort, maar waarschijnlijk is de prestatie geen probleem.
Als je echt maximale prestaties nodig hebt, zou een goed beginpunt zijn om een vast aantal gelijktijdige injectieprocessen/sessies op te starten volgens ons transmissie beste praktijken aanbevelingen – bijvoorbeeld vanuit een supervisortask.
Samenvattend …
We hebben gezien hoe de op de SparkPost API gebaseerde tool die in deel 2 wordt gebruikt, is bijgewerkt om SMTP-injectie te ondersteunen om on-premises MTAs zoals Port25 PowerMTA en Momentum te ondersteunen in een verscheidenheid van configuraties, evenals met SparkPost.
Dat is het voor nu! Veel plezier met versturen.