S/MIME Teil 3: Plug and Play für sichere E-Mail vor Ort

S/MIME Teil 3: Plug and Play für sichere E-Mail vor Ort

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

Dec 1, 2019

Herausgegeben von

Herausgegeben von

Bird

Bird

-

Kategorie:

Kategorie:

E-Mail

Email

Ready to see Bird
in action?

Ready to see Bird
in action?

S/MIME Teil 3: Plug and Play für sichere E-Mail vor Ort

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

In diesem Teil werden wir uns ansehen, wie das Tool angepasst werden kann, um Mail-Streams in lokale Plattformen wie Port25 PowerMTA und Momentum zu injizieren.

OK - fangen wir an!

1. Erste Schritte

Die Installation des Tools, das Abrufen der Schlüssel usw. ist genau dasselbe wie zuvor. Wenn Sie ein lokales E-Mail-System wie PowerMTA oder Momentum verwenden, sind Sie bereits für die Einrichtung von Sendedomänen, DKIM-Schlüsseln usw. verantwortlich. Was wir jetzt tun müssen, ist, eine Möglichkeit zu schaffen, die vollständig geformten S/MIME-Nachrichten in Ihre Server zu injizieren.

2. SMTP-Injektion auf Port25 PowerMTA

PowerMTA unterstützt verschiedene Möglichkeiten der Nachrichteneinspeisung, darunter ein Datei-"Pickup"-Verzeichnis, SMTP und eine API. SMTP ist die hier verwendete Methode.

Zur Veranschaulichung des einfachsten möglichen Aufbaus installieren wir die S/MIME-Tools auf demselben Server wie PowerMTA. Wir leiten Nachrichten an den Listener weiter, der standardmäßig auf TCP-Port 25 geöffnet ist und nur lokalen Datenverkehr akzeptiert.

export SMTP_HOST=localhost

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

Wir haben den privaten Schlüssel des Absenders (steve@thetucks.com.pem) und den öffentlichen Schlüssel des Empfängers (steve.tuck@sparkpost.com.crt) bereits vorliegen. Die ersten paar Zeilen der Nachrichtendatei lauten:

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

Wir senden die Nachricht mit:

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

Wir sehen:

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

Die Nachricht kommt schnell auf inbox an und wird in Mac Mail als signiert und verschlüsselt gemeldet.

Bonusfunktion: DKIM mit PowerMTA

DKIM ist recht einfach zu konfigurieren und lässt sich problemlos mit S/MIME kombinieren. Die Schritte sind:

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

Der DNS-Eintrag wird von der MX Toolbox als OK eingestuft, und DKIM ist jetzt aktiv.


3. SMTP-Injektion in Richtung Momentum

Momentum unterstützt verschiedene Möglichkeiten der Nachrichteninjektion, darunter API und SMTP. Hier wird SMTP verwendet, und zwar für einen Host, auf dem bereits Momentum läuft. Wir lassen seine Konfiguration unverändert, da er bereits in der Lage ist, eingehende Injektionen von anderen zugelassenen Hosts zu akzeptieren.

Hierbei handelt es sich um eine kleinere Version einer Produktionseinrichtung, bei der die "Generierungs"-Knoten und die MTA-Knoten zwar getrennt, jedoch über ein privates VLAN und Lastverteiler eng miteinander verbunden sind und den internen SMTP-Injektionsverkehr übertragen.


Die S/MIME-Tools werden wie zuvor installiert, und wir werden Nachrichten an die Adresse des SMTP-Hosts (MTA) senden:

export SMTP_HOST=xx.xx.xx.xx # setzen Sie hier Ihre eigene MTA / VIP Adresse

Wie zuvor haben wir den privaten Schlüssel des Absenders (steve@thetucks.com.pem) und den öffentlichen Schlüssel des Empfängers (steve.tuck@sparkpost.com.crt) bereits auf dem Knoten "Generation". Die ersten Zeilen der Nachrichtendatei stimmen mit diesen Adressen überein.

Wir senden die Nachricht vom Knoten "Generation" mit genau demselben Befehl wie zuvor, und die Nachricht erscheint in der 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-Signierung.

4. SMTP-Injektion für SparkPost

In Teil 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 EU-gehosteter Dienst then set SMTP_HOST as smtp.eu.sparkpostmail.com.
(Siehe hier for more options – for example you can inject on port 2525 rather than 587.)

Die folgende Ausgabe zeigt, dass STARTTLS zusammen mit dem Benutzernamen und dem Passwort verwendet wird.

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

Sie werden sehen:

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

Das Passwort wird mit ***-Ersatzzeichen gedruckt, so dass Sie die Privatsphäre Ihres Schlüssels nicht gefährden, wenn Ihnen jemand über die Schulter schaut.

Sicherung Ihrer Berechtigungsnachweise

Beachten Sie, dass Sie die Umgebungsvariablen in einer Shell-Skriptdatei oder ähnlichem einrichten können, um sich die erneute Eingabe zu sparen. Wenn Sie dies tun, achten Sie bitte auf Ihre Passwörter/API-Schlüssel, indem Sie den Zugriff auf diese Datei nur auf sich selbst beschränken. Wenn Ihre Anmeldeinformationsdatei zum Beispiel my_envs.sh heißt, führen Sie Folgendes aus:

chmod 0700 my_envs.sh

SMTP-bezogene Warnungen, die Sie sehen können

Die SMTP-Injektion von SparkPost ist ziemlich streng, wie Sie es von einem öffentlichen Dienst erwarten würden. Wenn Sie die SMTP-Portnummer nicht festgelegt haben, wird eine Warnung angezeigt:

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

Wenn Sie den SMTP-Benutzernamen oder das Kennwort nicht festgelegt haben, wird dies angezeigt:

(530, b'5.7.1 Autorisierung erforderlich. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')

Diese Fehlermeldungen werden von der Python-SMTP-Bibliothek einfach so gemeldet, wie sie sind, daher die Formatierung.

Was ist schneller - SMTP oder API?

Ehrlich gesagt ist es unwahrscheinlich, dass S/MIME in großem Umfang eingesetzt wird, aber ein und dasselbe Tool mit zwei Ausgabeoptionen zu haben, war für uns einfach eine Einladung zum Wettlauf!

Die hier verwendete E-Mail-Testdatei "Avocado" ist ca. 19 KB groß. Die 10-malige Wiederholung der Tests über eine Bash-Schleife zeigte, dass die durchschnittlichen Zeiten für SMTP und API ähnlich sind, etwa 60 Millisekunden pro Nachricht, was ziemlich schnell ist. In diesem Fall haben wir die Injektion von einer mittleren EC2-Instanz in der gleichen Hosting-Region wie SparkPost.com durchgeführt, was eine gute Möglichkeit ist, die Netzwerk-Roundtrip-Zeiten niedrig zu halten.

Bei der Wiederholung dieses Vorgangs mit einer größeren Testdatei (577 KB) benötigte die API etwa 200 Millisekunden, während SMTP 280 Millisekunden pro Nachricht benötigte - immer noch beeindruckend für eine 30 Mal größere Datei. Natürlich kann die Leistung je nach Standort, Internetauslastung usw. variieren, aber die Leistung dürfte kaum ein Problem darstellen.

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 bewährte Praktiken bei der Übertragung recommendations – e.g. from a supervisor task.

Zusammenfassend ...

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

Das war's für heute! Viel Spaß beim Versenden.

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

Die right message -> zum right person -> am right time.

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

Die right message -> zum right person -> am right time.