
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 mieliśmy krótką wycieczkę po S/MIME, przyglądając się podpisywaniu i szyfrowaniu naszych strumieni wiadomości w różnych klientach poczty. Dla organizacji wdrażających szyfrowanie S/MIME zrozumienie, jak efektywnie zbierać klucze publiczne odbiorców, staje się kluczowe dla skalowalnych operacji bezpiecznej poczty e-mail. Część 2 poprowadziła nas przez prostą narzędzia wiersza poleceń do podpisywania i szyfrowania e-maili, a następnie wysyłała je przez SparkPost.
W tej części zajmiemy się, jak to narzędzie można dostosować do wstrzykiwania strumieni poczty 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 środki wstrzykiwania wiadomości, w tym API i SMTP. SMTP jest metodą używaną tutaj, w kierunku hosta, który już działa na Momentum. Pozostawimy jego konfigurację bez zmian, ponieważ ma już możliwość przyjmowania przychodzących 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 połączone za pomocą prywatnej sieci VLAN i load-balancerów, które przenoszą wewnętrzny ruch wstrzykiwania SMTP.

Narzędzia S/MIME są zainstalowane jak wcześniej, a my wstrzykujemy 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 już węzeł z kluczem prywatnym nadawcy (steve@thetucks.com.pem) oraz węzłem z kluczem publicznym odbiorcy (steve.tuck@sparkpost.com.crt) na węźle „generation”. Pierwsze linie pliku wiadomości odpowiadają tym adresom.
Wysyłamy wiadomość z węzła „generation” dokładnie tą samą komendą, co wcześniej, a wiadomość pojawia się w inboxie.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Tak jak się spodziewasz, S/MIME również z radością współistnieje z DKIM signing w Momentum.
4. SMTP injection towards SparkPost
W części 2 użyliśmy REST API transmisji SparkPost do wprowadzania wiadomości. Oczywiście możliwe jest również wprowadzanie wiadomości do SparkPost za pomocą SMTP. Ustawiliśmy zmienne środowiskowe w następujący sposób:
export SMTP_PASSWORD=<<YOUR API KEY HERE>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Jeśli używasz usługi hostowanej w UE SparkPost, ustaw SMTP_HOST na smtp.eu.sparkpostmail.com.
(Zobacz tutaj dla więcej opcji – na przykład możesz wstrzyknąć na porcie 2525 zamiast 587.)
Poniższe wyjście pokazuje, że używano STARTTLS, wraz z nazwą użytkownika i hasłem.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Zobaczysz:
Otworzono połączenie SMTP (STARTTLS) do smtp.sparkpostmail.com, port 587, użytkownik="SMTP_Injection", hasło="****************************************" Wysyłanie tests/fancy-HTML-to-smt.eml Od: Steve <steve@thetucks.com> Do: SteveT <steve.tuck@sparkpost.com> OK - w 0.057 sekund
Hasło jest drukowane z zastępczymi znakami ***, więc nie naruszasz prywatności swojego klucza, jeśli ktoś zagląda ci przez ramię.
Zabezpieczanie twoich danych uwierzytelniających
Zwróć uwagę, że zmienne środowiskowe można ustawić w pliku skryptu powłoki lub podobnym, aby zapisać ponowne wpisywanie. Jeśli to zrobisz, proszę pilnuj swoich haseł/kluczy API, ograniczając dostęp do tego pliku tylko do siebie. Na przykład, jeśli twój plik ustawień danych uwierzytelniających nosi nazwę my_envs.sh, uruchom:
chmod 0700 my_envs.sh
Ostrzeżenia SMTP, które możesz zobaczyć
SMTP injection SparkPost jest dość restrykcyjny, co można by się spodziewać po publicznej usłudze. 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 nie ustawiłeś 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 raportowane w taki sposób, w jaki pojawiają się w bibliotece 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.