S/MIME del 3: Plug and Play för lokal säker e-post

S/MIME del 3: Plug and Play för lokal säker e-post

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

Dec 1, 2019

Publicerad av

Publicerad av

Bird

Bird

Kategori:

Kategori:

E-post

Email

Ready to see Bird
in action?

Ready to see Bird
in action?

S/MIME del 3: Plug and Play för lokal säker e-post

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

I den här delen tittar vi på hur verktyget kan anpassas för att injicera e-postströmmar i lokala plattformar som Port25 PowerMTA och Momentum.

OK - nu sätter vi igång!

1. Komma igång

Att installera verktyget, hämta nycklar etc. är exakt samma sak som tidigare. Om du använder ett lokalt e-postsystem som PowerMTA eller Momentum, är du redan ansvarig för att konfigurera sändningsdomäner, DKIM-nycklar etc. Vad vi behöver göra nu är att tillhandahålla något sätt att injicera de fullständigt formade S/MIME-meddelandena i dina servrar.

2. SMTP-injektion mot Port25 PowerMTA

PowerMTA stöder olika metoder för meddelandeinjektion, inklusive en fil "pickup"-katalog, SMTP och ett API. SMTP är den metod som används här.

För att illustrera den enklaste möjliga installationen installerar vi S/MIME-verktygen på samma server som PowerMTA. Vi injicerar meddelanden till lyssnaren, som är öppen som standard på TCP-port 25 och endast accepterar lokal trafik.

export SMTP_HOST=localhost

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

Vi har redan avsändarens privata nyckel (steve@thetucks.com.pem) och mottagarens offentliga nyckel (steve.tuck@sparkpost.com.crt). De första raderna i meddelandefilen är:

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

Vi skickar meddelandet med:

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

Vi ser:

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

Meddelandet kommer snabbt fram till inbox och rapporteras i Mac Mail som signerat och krypterat.

Bonusfunktion: DKIM med PowerMTA

DKIM är ganska lätt att konfigurera och fungerar utmärkt tillsammans med S/MIME. Stegen är följande:

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

DNS-posten checkar ut OK via MX Toolbox och DKIM är nu aktivt.


3. SMTP-injektion mot Momentum

Momentum stöder olika metoder för meddelandeinjektion, inklusive API och SMTP. SMTP är den metod som används här, mot en värd som redan kör Momentum. Vi lämnar dess konfiguration oförändrad, eftersom den redan har kapacitet att acceptera inkommande injektioner från andra godkända värdar.

Detta är en mindre version av en produktionsinstallation, där "generationsnoder" och MTA-noder är separata, men ändå nära kopplade via ett privat VLAN och lastbalanserare, som transporterar intern SMTP-injektionstrafik.


S/MIME-verktygen installeras som tidigare och vi kommer att injicera meddelanden till adressen för SMTP-värden (MTA):

export SMTP_HOST=xx.xx.xx.xx # ange din egen MTA/VIP-adress här

Som tidigare har vi avsändarens privata nyckel (steve@thetucks.com.pem) och mottagarens offentliga nyckel (steve.tuck@sparkpost.com.crt) som redan finns på "generation"-noden. De första raderna i meddelandefilen matchar dessa adresser.

Vi skickar meddelandet från noden "generation" med exakt samma kommando som tidigare, och meddelandet dyker upp i 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-signering.

4. SMTP-injektion mot SparkPost

In del 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-hostad tjänst then set SMTP_HOST as smtp.eu.sparkpostmail.com.
(Se här for more options – for example you can inject on port 2525 rather than 587.)

Utdata nedan visar att STARTTLS används, tillsammans med användarnamn och lösenord.

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

Du kommer att få se:

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

Lösenordet skrivs ut med ersättande ***-tecken, så att du inte äventyrar sekretessen för din nyckel om någon tittar dig över axeln.

Säkra dina autentiseringsuppgifter

Observera att miljövariabler kan ställas in i en skalskriptfil eller liknande, för att slippa skriva om dem. Om du gör det bör du ta hand om dina lösenord/API-nycklar genom att begränsa åtkomsten till den filen till endast dig själv. Till exempel, om din autentiseringsinställningsfil heter my_envs.sh, kör sedan:

chmod 0700 min_envs.sh

SMTP-relaterade varningar som du kan se

SparkPosts SMTP-injektion är ganska strikt, som man kan förvänta sig av en offentlig tjänst. Om du inte har angett SMTP-portnumret kommer du att se en varning:

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

Om du inte har angett SMTP-användarnamnet eller lösenordet visas följande:

(530, b'5.7.1 Tillstånd krävs. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')

Dessa felmeddelanden rapporteras helt enkelt som de är från Pythons SMTP-bibliotek, därav formateringen.

Vilket är snabbast - SMTP eller API?

Ärligt talat är det osannolikt att S/MIME kommer att användas i stora volymer, men att ha samma verktyg med två utmatningsalternativ var bara att be om att vi skulle köra ett race!

Testfilen för e-postmeddelandet "Avocado" som används här är ca 19 KB. Upprepning av testerna 10 gånger via en bash-loop visade att de genomsnittliga tiderna var liknande för SMTP och API, cirka 60 millisekunder per meddelande, vilket är ganska snabbt. I det här fallet injicerade vi från en medium EC2-instans i samma värdregion som SparkPost.com, vilket är ett bra sätt att hålla rundgångstiderna i nätverket låga.

Om vi upprepar detta med en större testfil (577 KB) tar API:n ungefär 200 millisekunder, medan SMTP tar 280 millisekunder per meddelande - fortfarande imponerande för en filstorlek som är 30 gånger större. Naturligtvis kan din upplevelse variera beroende på plats, internetbelastning etc, men prestanda kommer sannolikt inte att vara ett problem.

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 bästa praxis för överföring recommendations – e.g. from a supervisor task.

Sammanfattningsvis ...

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

Det var allt för den här gången! Trevlig sändning.

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

Den right message -> till right person -> vid right time.

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

Den right message -> till right person -> vid right time.