S/MIME Część 3: Plug and Play dla lokalnej bezpiecznej poczty e-mail

Ptak

1 gru 2019

Email

1 min read

S/MIME Część 3: Plug and Play dla lokalnej bezpiecznej poczty e-mail

Kluczowe Wnioski

    • Integracja S/MIME dla lokalnych MTA: dowiedz się, jak wprowadzać podpisane i zaszyfrowane strumienie e-maili do PowerMTA, Momentum lub SparkPost SMTP, zachowując istniejące ustawienia DKIM i zgodności.

    • Model bezpieczeństwa hybrydowego: połącz S/MIME encryption + DKIM signing, aby zagwarantować zarówno autentyczność wiadomości, jak i prywatność treści w środowiskach regulowanych.

    • Przepływ wdrożenia: skonfiguruj zmienne środowiskowe (SMTP_HOST, dane uwierzytelniające, klucze), uruchom workflow --sign --encrypt --send_smtp i zweryfikuj raporty dostarczenia.

    • Wgląd w wydajność: testy pokazują niemal identyczną prędkość dla SMTP w porównaniu do API injection (~60 ms na wiadomość, 200–280 ms dla większych plików).

    • Najlepsze praktyki bezpieczeństwa: przechowuj klucze prywatne i hasła API w plikach z ograniczeniami (chmod 0700), korzystaj ze STARTTLS i uwierzytelnianych sesji SMTP.

    • Przypadki użycia: przedsiębiorstwa modernizujące starsze systemy pocztowe mogą rozszerzać szyfrowanie end-to-end, nie rezygnując z istniejącej infrastruktury.

Q&A Highlights

  • Dlaczego adaptować S/MIME dla serwerów lokalnych zamiast cloud APIs?

    Wiele regulowanych branż (sektory bankowe i opieki zdrowotnej) musi przechowywać pocztę na miejscu. To podejście pozwala zachować kontrolę nad przepływem wiadomości, jednocześnie dodając nowoczesną ochronę kryptograficzną.

  • Jak działa wstrzykiwanie SMTP z PowerMTA lub Momentum?

    Wstrzykujesz w pełni ukształtowane wiadomości S/MIME do lokalnego nasłuchiwacza (port 25 lub prywatny VLAN). Te MTA następnie obsługują podpisywanie DKIM i dostarczanie jak zwykle.

  • Czy S/MIME jest kompatybilne z DKIM?

    Tak — DKIM podpisuje wiadomość po szyfrowaniu S/MIME, więc uwierzytelnianie i kontrole integralności pozostają nienaruszone.

  • Jak chronić moje dane uwierzytelniające SMTP i klucze?

    Eksportuj zmienne środowiskowe tylko w zablokowanych skryptach i używaj uprawnień do plików, aby ograniczyć dostęp do siebie (chmod 0700 my_envs.sh).

  • Co powinienem monitorować po ukończeniu setup?

    Opóźnienie dostawy (API vs SMTP), wskaźnik sukcesu uzgadniania TLS, wyniki walidacji DKIM/S-MIME oraz dzienniki błędów dla „relaying denied” lub brakującego uwierzytelnienia.

  • Kto najbardziej korzysta z tej konfiguracji?

    Organizacje prowadzące samodzielnie hostowane bramy pocztowe wymagające szyfrowania zgodnego z normami, a jednocześnie chcące narzędzi plug-and-play bez potrzeby przepisania kanałów pocztowych.

W tej części przyjrzymy się, jak narzędzie można dostosować do wstrzykiwania strumieni mailowych do lokalnych platform, takich jak PowerMTA i Momentum.

W części 1 odbyliśmy krótką wycieczkę po S/MIME, przyglądając się podpisywaniu i szyfrowaniu naszych strumieni wiadomości w różnych klientach pocztowych. Dla organizacji wdrażających szyfrowanie S/MIME zrozumienie, jak efektywnie zbierać klucze publiczne odbiorców, staje się kluczowe dla skalowalnych, bezpiecznych operacji email. Część 2 przeprowadziła nas przez proste narzędzie wiersza poleceń do podpisywania i szyfrowania emaili, a następnie wysyłania ich przez SparkPost.

W tej części przyjrzymy się, jak narzędzie można dostosować do wprowadzania strumieni wiadomości do platform lokalnych, takich jak Port25 PowerMTA i Momentum.

OK – zaczynajmy!

1. Wprowadzenie

Instalacja narzędzia, uzyskiwanie kluczy itd. jest dokładnie taka sama jak wcześniej. Kiedy używasz systemu pocztowego na miejscu, takiego jak PowerMTA lub Momentum, jesteś już odpowiedzialny za konfigurację domen wysyłających, kluczy DKIM itd. Organizacje korzystające z systemów na miejscu często muszą również rozwiązywać wyzwania związane z systemem archiwizacji e-maili w celu zgodności z przepisami i wymaganiami dotyczącymi przechowywania danych. To, co musimy teraz zrobić, to zapewnić jakiś sposób wprowadzenia w pełni uformowanych wiadomości S/MIME do Twoich serwerów.

2. SMTP injekcja w kierunku Port25 PowerMTA

PowerMTA obsługuje różne środki wstrzykiwania wiadomości, w tym katalog „pickup” plików, SMTP i API. SMTP jest tu używaną metodą.

Aby zilustrować najprostsze możliwe ustawienie, zainstalujemy narzędzia S/MIME na tym samym serwerze co PowerMTA. Wstrzykujemy wiadomości do nasłuchiwacza, który jest domyślnie otwarty na porcie TCP 25, akceptując tylko ruch lokalny.

export SMTP_HOST=localhost

(Jeśli zapomnisz o tym kroku, zobaczysz: „Environment var SMTP_HOST not set – stopping” kiedy próbujesz uruchomić.)

Mamy już klucz prywatny nadawcy (steve@thetucks.com.pem) i klucz publiczny odbiorcy (steve.tuck@sparkpost.com.crt). Pierwsze kilka wierszy pliku wiadomości to:

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

Wysyłamy wiadomość z:

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

Widzimy:

Opened SMTP connection (plain)  
Host: 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

Wiadomość szybko trafia do skrzynki odbiorczej i jest raportowana w Mac Mail jako podpisana i zaszyfrowana.

Email from Avocado showing a marketing message with security features enabled, displayed in Mac Mail as signed and encrypted.

Bonus feature: DKIM z PowerMTA

DKIM jest dość łatwy do skonfigurowania i szczęśliwie współistnieje z S/MIME. Kroki to:

  • Użyj witryny PowerMTA DKIM Wizard do stworzenia klucza prywatnego domeny wysyłającej (w moim przypadku, mypmta.thetucks.com.pem) i zawartości rekordu TXT DNS publicznego.

  • Ustaw rekord TXT DNS, z wybranym selektorem. Na przykład, użyłem selektora pmta201811. Prawidłowe znaki selektora są zdefiniowane tutaj.

  • Umieść plik mypmta.thetucks.com.pem na serwerze w katalogu /etc/pmta .

  • Dodaj następujące do mojego /etc/pmta/config i zrestartuj usługę pmta. (Tutaj, te dyrektywy są napisane w globalnym zasięgu; w systemie produkcyjnym, możesz zdecydować się dodać je pod wirtualnym-mta zamiast tego.)

host-name thetucks.com
domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem
<domain *>
  dkim-sign yes
</domain>

Rekord DNS wypada OK za pomocą MX Toolbox, a DKIM jest teraz aktywny.

MX Toolbox interface showing successful DKIM record verification with all tests passing for email authentication security.

PowerMTA obsługuje różne środki wstrzykiwania wiadomości, w tym katalog „pickup” plików, SMTP i API. SMTP jest tu używaną metodą.

Aby zilustrować najprostsze możliwe ustawienie, zainstalujemy narzędzia S/MIME na tym samym serwerze co PowerMTA. Wstrzykujemy wiadomości do nasłuchiwacza, który jest domyślnie otwarty na porcie TCP 25, akceptując tylko ruch lokalny.

export SMTP_HOST=localhost

(Jeśli zapomnisz o tym kroku, zobaczysz: „Environment var SMTP_HOST not set – stopping” kiedy próbujesz uruchomić.)

Mamy już klucz prywatny nadawcy (steve@thetucks.com.pem) i klucz publiczny odbiorcy (steve.tuck@sparkpost.com.crt). Pierwsze kilka wierszy pliku wiadomości to:

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

Wysyłamy wiadomość z:

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

Widzimy:

Opened SMTP connection (plain)  
Host: 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

Wiadomość szybko trafia do skrzynki odbiorczej i jest raportowana w Mac Mail jako podpisana i zaszyfrowana.

Email from Avocado showing a marketing message with security features enabled, displayed in Mac Mail as signed and encrypted.

Bonus feature: DKIM z PowerMTA

DKIM jest dość łatwy do skonfigurowania i szczęśliwie współistnieje z S/MIME. Kroki to:

  • Użyj witryny PowerMTA DKIM Wizard do stworzenia klucza prywatnego domeny wysyłającej (w moim przypadku, mypmta.thetucks.com.pem) i zawartości rekordu TXT DNS publicznego.

  • Ustaw rekord TXT DNS, z wybranym selektorem. Na przykład, użyłem selektora pmta201811. Prawidłowe znaki selektora są zdefiniowane tutaj.

  • Umieść plik mypmta.thetucks.com.pem na serwerze w katalogu /etc/pmta .

  • Dodaj następujące do mojego /etc/pmta/config i zrestartuj usługę pmta. (Tutaj, te dyrektywy są napisane w globalnym zasięgu; w systemie produkcyjnym, możesz zdecydować się dodać je pod wirtualnym-mta zamiast tego.)

host-name thetucks.com
domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem
<domain *>
  dkim-sign yes
</domain>

Rekord DNS wypada OK za pomocą MX Toolbox, a DKIM jest teraz aktywny.

MX Toolbox interface showing successful DKIM record verification with all tests passing for email authentication security.

PowerMTA obsługuje różne środki wstrzykiwania wiadomości, w tym katalog „pickup” plików, SMTP i API. SMTP jest tu używaną metodą.

Aby zilustrować najprostsze możliwe ustawienie, zainstalujemy narzędzia S/MIME na tym samym serwerze co PowerMTA. Wstrzykujemy wiadomości do nasłuchiwacza, który jest domyślnie otwarty na porcie TCP 25, akceptując tylko ruch lokalny.

export SMTP_HOST=localhost

(Jeśli zapomnisz o tym kroku, zobaczysz: „Environment var SMTP_HOST not set – stopping” kiedy próbujesz uruchomić.)

Mamy już klucz prywatny nadawcy (steve@thetucks.com.pem) i klucz publiczny odbiorcy (steve.tuck@sparkpost.com.crt). Pierwsze kilka wierszy pliku wiadomości to:

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

Wysyłamy wiadomość z:

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

Widzimy:

Opened SMTP connection (plain)  
Host: 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

Wiadomość szybko trafia do skrzynki odbiorczej i jest raportowana w Mac Mail jako podpisana i zaszyfrowana.

Email from Avocado showing a marketing message with security features enabled, displayed in Mac Mail as signed and encrypted.

Bonus feature: DKIM z PowerMTA

DKIM jest dość łatwy do skonfigurowania i szczęśliwie współistnieje z S/MIME. Kroki to:

  • Użyj witryny PowerMTA DKIM Wizard do stworzenia klucza prywatnego domeny wysyłającej (w moim przypadku, mypmta.thetucks.com.pem) i zawartości rekordu TXT DNS publicznego.

  • Ustaw rekord TXT DNS, z wybranym selektorem. Na przykład, użyłem selektora pmta201811. Prawidłowe znaki selektora są zdefiniowane tutaj.

  • Umieść plik mypmta.thetucks.com.pem na serwerze w katalogu /etc/pmta .

  • Dodaj następujące do mojego /etc/pmta/config i zrestartuj usługę pmta. (Tutaj, te dyrektywy są napisane w globalnym zasięgu; w systemie produkcyjnym, możesz zdecydować się dodać je pod wirtualnym-mta zamiast tego.)

host-name thetucks.com
domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem
<domain *>
  dkim-sign yes
</domain>

Rekord DNS wypada OK za pomocą MX Toolbox, a DKIM jest teraz aktywny.

MX Toolbox interface showing successful DKIM record verification with all tests passing for email authentication security.

3. SMTP Injection w kierunku Momentum

Momentum obsługuje różne sposoby wprowadzania wiadomości, w tym API i SMTP. SMTP jest metodą używaną tutaj, w kierunku hosta już uruchomionego z Momentum. Zostawimy jego konfigurację bez zmian, ponieważ już ma zdolność do przyjmowania wejściowych wstrzyknięć z innych zatwierdzonych hostów.

To jest mniejsza wersja konfiguracji produkcyjnej, gdzie węzły „generation” i węzły MTA są oddzielne, ale ściśle powiązane za pomocą prywatnego VLAN i balansujących obciążenie, przenosząc wewnętrzny ruch wstrzykiwania SMTP.


Diagram showing email flow from a generation server to on-premises MTA (Mail Transfer Agent) via SMTP protocol.


Narzędzia S/MIME są zainstalowane jak wcześniej, i wprowadzimy wiadomości na adres hosta SMTP (MTA):

export SMTP_HOST=xx.xx.xx.xx # ustaw tutaj swój własny adres MTA / VIP

Jak wcześniej, mamy klucz prywatny nadawcy (steve@thetucks.com.pem) i klucz publiczny odbiorcy (steve.tuck@sparkpost.com.crt) już obecne na węźle „generation”. Pierwsze kilka linii pliku wiadomości odpowiada tym adresom.

Wysyłamy wiadomość z węzła „generation” dokładnie tym samym poleceniem co wcześniej, a wiadomość pojawia się w Inbox.

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

Jak można się spodziewać, S/MIME również szczęśliwie współistnieje z DKIM signing Momentum.

4. SMTP injection towards SparkPost

W części 2 użyliśmy REST API transmisji SparkPost do wstrzykiwania wiadomości. Oczywiście, jest również możliwe wstrzykiwanie wiadomości do SparkPost za pomocą SMTP. Ustawiamy zmienne środowiskowe w następujący sposób:

export SMTP_PASSWORD=<<YOUR_API_KEY_HERE>

Jeśli używasz usługi EU-hosted SparkPost, ustaw SMTP_HOST jako smtp.eu.sparkpostmail.com.
(Zobacz tutaj dla więcej opcji – na przykład możesz wstrzykiwać na porcie 2525 zamiast 587.)

Wyjście poniżej pokazuje użycie STARTTLS, wraz z nazwą użytkownika i hasłem.

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

Zobaczysz:

Opened SMTP connection (STARTTLS)  
Host: 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

Hasło jest wydrukowane z podstawnymi znakami ***, więc nie narażasz prywatności swojego klucza, jeśli ktoś patrzy ci przez ramię.

Zabezpieczanie Twoich Poświadczeń

Zauważ, że zmienne środowiskowe mogłyby być ustawiane w pliku skryptu powłoki lub podobnym, aby zaoszczędzić ponowne wpisywanie. Jeśli to zrobisz, dbaj o swoje hasła/klucze API, ograniczając dostęp do tego pliku tylko do siebie. Na przykład, jeśli plik z ustawieniami poświadczeń nazywa się my_envs.sh, uruchom:

chmod 0700 my_envs.sh

Ostrzeżenia związane z SMTP, które możesz zobaczyć

SMTP injection SparkPost jest dość restrykcyjne, jak można się spodziewać po usłudze publicznej. Jeśli nie ustawiłeś numeru portu SMTP, zobaczysz ostrzeżenie:

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

Jeśli nie ustawiłeś nazwy użytkownika SMTP lub hasła, zobaczysz:

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

Te komunikaty o błędach są po prostu zgłaszane jak jest z biblioteki Python SMTP, stąd takie formatowanie.

Który jest szybszy – SMTP czy API?

Szczerze mówiąc, S/MIME prawdopodobnie nie będzie przypadkiem użycia o dużej objętości, ale posiadanie tego samego narzędzia z dwiema opcjami wyjścia to był niemalże wyścig!

Plik testowy e-mail „Avocado” używany tutaj ma około 19KB. Powtarzanie testów 10 razy za pomocą pętli bash wykazało, że średnie czasy były podobne dla SMTP i API, około 60 milisekund na wiadomość, co jest całkiem szybkie. W tym przypadku zainicjowaliśmy z medium instancji EC2 w tym samym regionie hostingowym co SparkPost.com, co jest dobrym sposobem na utrzymanie niskich czasów podróży sieciowej.

Powtarzając to z większym plikiem testowym (577KB), API zajęło około 200 milisekund, podczas gdy SMTP potrzebowało 280 milisekund na wiadomość – wciąż imponujące przy pliku 30 razy większym. Oczywiście, wydajność może się różnić w zależności od lokalizacji, przeciążenia internetu itp., ale wydajność raczej nie będzie problemem.

Jeśli naprawdę potrzebujesz maksymalnej wydajności, dobrym punktem wyjścia byłoby uruchomienie określonej liczby równoczesnych procesów/sesji wstrzykiwania zgodnie z naszymi najlepszymi praktykami transmisji – np. z zadania nadzorującego.

Podsumowując ...

Widzieliśmy, jak narzędzie oparte na SparkPost API użyte w Część 2 jest aktualizowane, aby obsługiwać wstrzykiwanie SMTP, aby wspierać lokalne MTA, takie jak Port25 PowerMTA i Momentum w różnych konfiguracjach, a także z SparkPost.

To na razie wszystko! Szczęśliwego wysyłania.

Inne wiadomości

Czytaj więcej z tej kategorii

A person is standing at a desk while typing on a laptop.

Kompletna, natywna dla AI platforma, która rośnie wraz z Twoim biznesem.

A person is standing at a desk while typing on a laptop.

Kompletna, natywna dla AI platforma, która rośnie wraz z Twoim biznesem.