W części 1 mieliśmy szybki przegląd S/MIME, przyglądając się podpisywaniu i szyfrowaniu naszych strumieni wiadomości w różnych klientach pocztowych. Część 2 prowadziła nas przez proste narzędzie wiersza poleceń do podpisywania i szyfrowania e-maili, a następnie ich wysyłania przez SparkPost.
W tej części przyjrzymy się, jak narzędzie można dostosować do wstrzykiwania strumieni wiadomości do platform lokalnych, takich jak Port25 PowerMTA i Momentum.
OK – zaczynajmy!
1. Rozpoczęcie
Instalacja narzędzia, zdobycie kluczy itd. jest dokładnie taka sama jak wcześniej. Kiedy używasz lokalnego systemu e-mail, takiego jak PowerMTA lub Momentum, jesteś już odpowiedzialny za konfigurację domen wysyłania, kluczy DKIM itd. To, co musimy teraz zrobić, to zapewnić sposób na wstrzykiwanie w pełni uformowanych wiadomości S/MIME do Twoich serwerów.
2. Wstrzykiwanie SMTP w kierunku Port25 PowerMTA
PowerMTA obsługuje różne metody wstrzykiwania wiadomości, w tym katalog „odbioru” plików, SMTP i API. SMTP jest metodą używaną tutaj.
Aby zilustrować najprostsze możliwe ustawienie, zainstalujemy narzędzia S/MIME na tym samym serwerze co PowerMTA. Wstrzykujemy wiadomości do nasłuchującego, który jest domyślnie otwarty na porcie TCP 25, akceptującym tylko lokalny ruch.
export SMTP_HOST=localhost
(Jeśli zapomnisz o tym kroku, zobaczysz: „Zmienna środowiskowa SMTP_HOST nie jest ustawiona – zatrzymanie” gdy spróbujesz uruchomić.)
Mamy już prywatny klucz nadawcy (steve@thetucks.com.pem) i publiczny klucz odbiorcy (steve.tuck@sparkpost.com.crt). Pierwsze kilka linii pliku wiadomości to:
Do: SteveT <steve.tuck@sparkpost.com> Od: Steve <steve@thetucks.com> Temat: To jest wiadomość utworzona za pomocą HEML MIME-Wersja: 1.0 Typ-treści: text/html; charset=utf-8 Język-treści: en-GB Kodowanie-przenoszenia-treści: 7bit
Wysyłamy wiadomość z:
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Widok:
Otwarto połączenie SMTP (plain) do localhost, port 25, użytkownik="", hasło="" Wysyłanie tests/fancy-HTML-to-smt.eml Od: Steve <steve@thetucks.com> Do: SteveT <steve.tuck@sparkpost.com> OK - w 0.028 sekund
Wiadomość szybko przychodzi do skrzynki odbiorczej i zgłasza się w Mac Mail jako podpisana i zaszyfrowana.
Funkcja dodatkowa: DKIM z PowerMTA
DKIM jest dość łatwy do skonfigurowania i dobrze współistnieje z S/MIME. Kroki są następujące:
Użyj strony DKIM Wizard PowerMTA, aby utworzyć prywatny klucz domeny wysyłającej (w moim przypadku, mypmta.thetucks.com.pem) i publiczne rekordy DNS TXT.
Skonfiguruj rekord DNS TXT, z wybranym selektorem. Na przykład, użyłem selektora pmta201811. Dozwolone 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ą zapisane w zasięgu globalnym; w systemie produkcyjnym możesz wolą dodać je pod wirtualnym MTA.)
host-name thetucks.com domain-key pmta201811,*,/etc/pmta/mypmta.thetucks.com.pem <domain *> dkim-sign yes </domain>
Rekord DNS jest poprawny w MX Toolbox, a DKIM jest teraz aktywny.
3. Wstrzykiwanie SMTP w kierunku Momentum
Momentum obsługuje różne metody wstrzykiwania wiadomości, w tym API i SMTP. SMTP jest metodą używaną tutaj, w kierunku hosta, który już działa Momentum. Pozostawimy jego konfigurację bez zmian, ponieważ już ma zdolność akceptowania przychodzących wstrzyknięć z innych zatwierdzonych hostów.
To jest mniejsza wersja konfiguracji produkcyjnej, gdzie węzły „generacyjne” i węzły MTA są oddzielne, ale blisko powiązane przez prywatną VLAN i load-balancery, przenosząc wewnętrzny ruch wstrzykiwania SMTP.
Narzędzia S/MIME zostały zainstalowane jak wcześniej, a my wstrzykujemy wiadomości do adresu hosta SMTP (MTA):
export SMTP_HOST=xx.xx.xx.xx # ustaw tutaj swój adres MTA / VIP
Jak wcześniej, mamy już prywatny klucz nadawcy (steve@thetucks.com.pem) i publiczny klucz odbiorcy (steve.tuck@sparkpost.com.crt) na węźle „generacyjnym”. Pierwsze kilka linii pliku wiadomości odpowiada tym adresom.
Wysyłamy wiadomość z węzła „generacyjnego” dokładnie tym samym poleceniem, co wcześniej, a wiadomość pojawia się w skrzynce odbiorczej.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Jak można się spodziewać, S/MIME równie dobrze współistnieje z podpisywaniem DKIM Momentum.
4. Wstrzykiwanie SMTP w kierunku SparkPost
W części 2 użyliśmy REST API przesyłania SparkPost, aby wstrzykiwać wiadomości. Oczywiście, możliwe jest również wstrzykiwanie wiadomości do SparkPost za pomocą SMTP. Ustawiamy zmienne środowiskowe w ten sposób:
export SMTP_PASSWORD=<<TWÓJ KLUCZ API TUTAJ>> export SMTP_HOST=smtp.sparkpostmail.com export SMTP_USER=SMTP_Injection export SMTP_PORT=587
Jeśli używasz usługi SparkPost hostowanej w UE, ustaw SMTP_HOST jako smtp.eu.sparkpostmail.com.
(Zobacz tutaj po więcej opcji – na przykład możesz wstrzykiwać na porcie 2525 zamiast 587.)
Poniższe dane wyjściowe pokazują, że używany jest STARTTLS, wraz z nazwą użytkownika i hasłem.
./sparkpostSMIME.py tests/fancy-HTML-to-smt.eml --sign --encrypt --send_smtp
Zobaczysz:
Otwarte 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ąpionymi znakami ***, więc nie kompromitujesz prywatności swojego klucza, jeśli ktoś patrzy przez twoje ramię.
Bezpieczne przechowywanie danych uwierzytelniających
Zauważ, że zmienne środowiskowe mogą być ustawione w pliku skryptu powłoki lub podobnym, aby zaoszczędzić przepisanie. Jeśli to robisz, dbaj o swoje hasła/klucze API, ograniczając dostęp do tego pliku tylko do siebie. Na przykład, jeśli plik konfiguracyjny twoich danych uwierzytelniających nazywa się my_envs.sh, uruchom:
chmod 0700 my_envs.sh
Ostrzeżenia związane z SMTP, które możesz zobaczyć
Wstrzykiwanie SMTP SparkPost jest dość surowe, jak można się spodziewać od publicznej usługi. Jeśli nie ustawiłeś numeru portu SMTP, zobaczysz ostrzeżenie:
{'bob.lumreeker@gmail.com': (550, b'5.7.1 relayowanie zabronione')}
Jeśli nie ustawiłeś nazwy użytkownika SMTP lub nie ustawiłeś hasła, zobaczysz:
(530, b'5.7.1 Wymagana autoryzacja. Ref. https://developers.sparkpost.com/api/index#header-smtp-relay-endpoints', 'steve@thetucks.com')
Te komunikaty o błędach są po prostu raportowane tak, jak są przekazywane z biblioteki Python SMTP, stąd formatowanie.
Która metoda jest szybsza – SMTP czy API?
Kwestionując, S/MIME jest mało prawdopodobną aplikacją o dużym wolumenie, ale posiadanie tego samego narzędzia z dwoma opcjami wyjściowymi właśnie prosiło o wyścig!
Testowy plik e-mail „Avocado”, który tutaj użyto, ma około 19KB. Powtarzając testy 10 razy za pomocą pętli bash pokazano średnie czasy podobne dla SMTP i API, około 60 milisekund na wiadomość, co jest dość szybkie. W tym przypadku wstrzykiwaliśmy z średnią instancji EC2 w tym samym regionie hostingowym, co SparkPost.com, co jest dobrym sposobem na utrzymanie niskich czasów okrążeń sieciowych.
Powtarzając to z większym plikiem testowym (577KB), API zajęło około 200 milisekund, podczas gdy SMTP zajęło 280 milisekund na wiadomość – wciąż imponujące dla pliku 30 razy większego. Oczywiście, Twoje wyniki mogą się różnić w zależności od lokalizacji, zatorów internetowych itd., ale wydajność ma mało prawdopodobne, aby była problemem.
Jeśli naprawdę potrzebujesz maksymalnej wydajności, dobrym punktem wyjściowym byłoby uruchomienie ustalonej liczby równoległych procesów/w sesji wstrzykiwania zgodnie z naszymi zaleceniami najlepszych praktyk dotyczących transmisji – np. z zadania nadzorczego.
Podsumowując …
Zobaczyliśmy, w jaki sposób narzędzie oparte na API SparkPost użyte w Części 2 zostało zaktualizowane, aby obsługiwać wstrzykiwanie SMTP, by wspierać lokalne MTA, takie jak Port25 PowerMTA i Momentum w różnych konfiguracjach, jak również ze SparkPost.
To wszystko na teraz! Szczęśliwego wysyłania.