W tym artykule opiszę najbardziej mininimalistyczny, niezbyt najwyższych lotów setup Mail Transfer Agenta który dostarcza plaintextowy tryb SMTP.
Jeśli pominąć wymaganie trybu plaintext przy autoryzacji temat można zamknąć na OpenSMTPD. invalid listen option: auth requires tls/smtps
to kwestia nie do przeszkoczenia. Poza tym MTA które ma 4 linijkowy konfig jest nieco zbyt małym wyzwaniem 😉
Wymaganie które postawiłem gotowemu setupowi to MTA który umie przesyłać maile od lokalnych użytkowników unixowych zalogowanych zdalnie po SMTP za pomocą auth plain w trybie plaintext, a relay jest zablokowany (żeby serwer nie stał się ofiarą spamerów).
System na którym instalowałem swój serwer to ubuntu, ale konfigi dołączane wydają się być czyste wprost od twórców. Potrzebne są 2 pakiety – postfix (jego zapewne już mamy) i sals2-bin. Pierwszy to właściwe MTA z kilkoma protokołami dostępowymi, a drugi to zestaw narzędzi SASL porzebnych postfixowi do auroryzacji użykowników.
Po instalacji trzeba wprowadzić kilka zmian w domyślnych plikach konfiguracyjnych:
- /etc/postfix/main.cf
- powinien posiadać kilka wpisów zapewniających integrację z SASL:
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
- linijkę pozwającą na wprowadzanie credentiali bez TLSa:
smtpd_tls_auth_only = no
- oraz otwierać się na świat:
inet_interfaces = all
- tu uwaga – nie chcemy zmieniać mynetworks na coś w rodzaju 0.0.0.0/0 – inaczej dopuścimy do relayowania maili przez każdego
- powinien posiadać kilka wpisów zapewniających integrację z SASL:
- nowy plik /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
- /etc/deafult/saslauthd
MECHANISMS="shadow"
Poza trzeba stworzyć jeden symlink który rozwiąże problem wynikający z tego że saslauthd działa jako root a postfix jest jailrootowany. Całość warto opakować zatrzymaniem i wznowieniem usług żeby na pewno sockety się utworzyły i były dostępne.
systemctl stop saslauthd postfix rm -fr /var/run/saslauthd mkdir -p /var/spool/postfix/var/run/saslauthd ln -s /var/spool/postfix/var/run/saslauthd /var/run chgrp sasl /var/spool/postfix/var/run/saslauthd adduser postfix sasl systemctl start saslauthd postfix systemctl enable saslauthd postfix systemctl status saslauthd postfix
Kolejny etap to dodanie lokalnego użytkownika i przetestowanie czy wszystko działa. Tu warto pokazać jak działa auth plain bo jednak nie podajemy tam loginu i hasła gołym tekstem.
perl -MMIME::Base64 -e 'print encode_base64("\0$USERNAME\0$PASSWORD");'
Ciąg autoryzacyjny jak widać wyżej to base64 z ciągu null, użykownik, null i hasło. Jeśli użytkownik ma w nazwie małpę to należy ją wyeacapować. Poniżej przykładowa sesja odpalana „z palca”:
zsh % perl -MMIME::Base64 -e 'print encode_base64("\0uzytkownik\@host\0haslo12345");' AHV6eXRrb3duaWtAaG9zdABoYXNsbzEyMzQ1 zsh % perl -MMIME::Base64 -e 'print encode_base64("\0uzytkownik\0haslo12345");' AHV6eXRrb3duaWsAaGFzbG8xMjM0NQ== zsh % telnet localhost 25 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. 220 example.org ESMTP Postfix ehlo host_albo_i_cokolwiek 250-example.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250-DSN 250 SMTPUTF8 auth plain 334 AHV6eXRrb3duaWsAaGFzbG8xMjM0NQ== 235 2.7.0 Authentication successful mail from: [email protected] 250 2.1.0 Ok rcpt to: [email protected] 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> From: test <[email protected]> Subject: test session test test test . 250 2.0.0 Ok: queued as C57FC1C004E quit 221 2.0.0 Bye Connection closed by foreign host. zsh %
Pokazana tu sesja jest absolutnie minimalna poza linijką Subject. RFC jednak go wymaga. Gmail będzie maile bez niego odrzucał rzucając w mail.log coś takiego:
Apr 30 12:18:21 XXXX postfix/smtp[26482]: C57FC1C004E: [email protected], relay=aspmx.l.google.com[64.233.166.27]:25, delay=28, delays=27/0.01/0.09/0.61, dsn=5.7.1, status=bounced (host aspmx.l.google.com[64.233.166.27] said: 550-5.7.1 [5.9.88.142 11] Our system has detected that this message is not 550-5.7.1 RFC 5322 compliant: 550-5.7.1 'From' header is missing. 550-5.7.1 To reduce the amount of spam sent to Gmail, this message has been 550-5.7.1 blocked. Please visit 550-5.7.1 https://support.google.com/mail/?p=RfcMessageNonCompliant 550 5.7.1 and review RFC 5322 specifications for more information. j192si1309453wmb.131 - gsmtp (in reply to end of DATA command))
Na koniec warto sprawdzić czy bez zalogowania się serwer odrzuci maile wysyłane poza jego domenę podczas połączenia spoza localhosta:
daniel@MJOLNIR:/mnt/c/Users/Daniel$ telnet example.org 25 Trying XXXXXXXXXXXXXXXXXXXXXXXXX... Connected to example.org. Escape character is '^]'. 220 example.org ESMTP Postfix ehlo dupa 250-example.orget //... mail from: [email protected] 250 2.1.0 Ok rcpt to: [email protected] 454 4.7.1 <[email protected]>: Relay access denied rcpt to: [email protected] 250 2.1.5 Ok //...