S/MIME Część 3: Plug and Play dla lokalnej bezpiecznej poczty e-mail
Ptak
1 gru 2019
1 min read

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
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.

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:
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:
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:
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.





