S/MIME Deel 3: Plug and Play voor on-premises beveiligde e-mail

S/MIME Deel 3: Plug and Play voor on-premises beveiligde e-mail

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

Dec 1, 2019

Gepubliceerd door

Gepubliceerd door

MessageBird

MessageBird

-

Categorie:

Categorie:

E-mail

Email

Ready to see Bird
in action?

Ready to see Bird
in action?

S/MIME Deel 3: Plug and Play voor on-premises beveiligde e-mail

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

In dit deel bekijken we hoe de tool kan worden aangepast om mailstromen te injecteren in on-premises platforms zoals Port25 PowerMTA en Momentum.

OK - laten we beginnen!

1. Aan de slag

Het installeren van de tool, het verkrijgen van je sleutels enz. is precies hetzelfde als voorheen. Als je een on-premises e-mailsysteem zoals PowerMTA of Momentum gebruikt, ben je al verantwoordelijk voor het instellen van verzenddomeinen, 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 poort 25 PowerMTA

PowerMTA ondersteunt verschillende manieren om berichten te injecteren, waaronder een bestands-"pickup" map, SMTP en een API. SMTP is de methode die hier wordt gebruikt.

Om de eenvoudigst mogelijke opstelling te illustreren, installeren we de S/MIME tools op dezelfde server als PowerMTA. We injecteren berichten naar de listener, die standaard open staat op TCP poort 25 en alleen lokaal verkeer accepteert.

export SMTP_HOST=localhost

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

De private sleutel van de verzender (steve@thetucks.com.pem) en de publieke sleutel van de ontvanger (steve.tuck@sparkpost.com.crt) zijn al aanwezig. De eerste paar regels van het berichtenbestand zijn:

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

We sturen de boodschap met:

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

Dat zien we:

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

Het bericht komt snel aan op inbox en meldt zich in Mac Mail als ondertekend en versleuteld.

Bonusfunctie: DKIM met PowerMTA

DKIM is vrij eenvoudig te configureren en bestaat naast S/MIME. De stappen zijn:

  • Use the PowerMTA DKIM Wizard 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>

Het DNS record is OK via MX Toolbox, en DKIM is nu actief.


3. SMTP-injectie naar Momentum

Momentum ondersteunt verschillende manieren om berichten te injecteren, waaronder API en SMTP. SMTP is de methode die hier wordt gebruikt, naar een host waarop Momentum al 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 productieopstelling, waarbij "generatie"-knooppunten en MTA-knooppunten gescheiden zijn, maar nauw gekoppeld via een privé VLAN en load-balancers, die intern SMTP-injectieverkeer vervoeren.


De S/MIME tools worden geïnstalleerd zoals voorheen, en we zullen berichten injecteren naar het adres van de SMTP host (MTA):

export SMTP_HOST=xx.xx.xx.xx # stel hier uw eigen MTA / VIP-adres in

Zoals voorheen hebben we de private sleutel van de verzender (steve@thetucks.com.pem) en de publieke sleutel van de ontvanger (steve.tuck@sparkpost.com.crt) al op het "generatie"-knooppunt. De eerste paar regels van het berichtenbestand komen overeen met deze adressen.

We versturen het bericht vanaf het knooppunt "generatie" met precies hetzelfde commando als eerder, en het bericht verschijnt in de 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 DKIM ondertekening.

4. SMTP-injectie naar SparkPost

In deel 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 Door de EU gehoste dienst then set SMTP_HOST as smtp.eu.sparkpostmail.com.
(Zie hier for more options – for example you can inject on port 2525 rather than 587.)

De onderstaande uitvoer laat zien 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 het zien:

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

Het wachtwoord wordt afgedrukt met vervangende *** tekens, zodat u de privacy van uw sleutel niet in gevaar brengt als iemand over uw schouder meekijkt.

Uw geloofsbrieven beveiligen

Merk op dat omgevingsvariabelen kunnen worden ingesteld in een shellscriptbestand of iets dergelijks, om overtypen te besparen. Als u dat doet, zorg dan voor uw wachtwoorden/API-sleutels door de toegang tot dat bestand te beperken tot uzelf. Bijvoorbeeld, als uw inloggegevens instellingsbestand my_envs.sh heet, voer dan uit:

chmod 0700 my_envs.sh

SMTP-gerelateerde waarschuwingen die u kunt zien

De SMTP injectie van SparkPost is behoorlijk streng, zoals je zou verwachten van een publieke dienst. Als je het SMTP poortnummer niet hebt ingesteld, krijg je een waarschuwing te zien:

{'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 Autorisatie vereist. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints", "steve@thetucks.com")

Deze foutmeldingen worden gewoon als zodanig gerapporteerd door de Python SMTP-bibliotheek, vandaar de opmaak.

Wat is sneller - SMTP of API?

Eerlijk gezegd is het onwaarschijnlijk dat S/MIME in grote hoeveelheden zal worden gebruikt, maar hetzelfde instrument met twee uitvoeropties was gewoon vragen om een race!

Het hier gebruikte "Avocado" e-mailtestbestand is ongeveer 19KB. Door de tests 10 keer te herhalen via een bash-lus bleek dat de gemiddelde tijden vergelijkbaar waren voor SMTP en API, ongeveer 60 milliseconden per bericht, wat behoorlijk snel is. In dit geval injecteerden we vanaf een middelgrote EC2 instance in dezelfde hosting regio als SparkPost.com, wat een goede manier is om de netwerk round-trip tijden laag te houden.

Bij herhaling met een groter testbestand (577KB) nam de API ongeveer 200 milliseconden in beslag, terwijl SMTP 280 milliseconden per bericht in beslag nam - nog steeds indrukwekkend voor een 30x zo groot bestand. Natuurlijk kan uw situatie variëren, afhankelijk van locatie, internetcongestie enz., maar het is onwaarschijnlijk dat de prestaties een probleem vormen.

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 beste praktijken voor transmissie recommendations – e.g. from a supervisor task.

Samenvattend...

We’ve seen how the SparkPost API-based tool used in Deel 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.

Dat is het voor nu! Gelukkige verzending.

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

De right message -> naar de right person -> aan de right time.

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

De right message -> naar de right person -> aan de right time.