Schlagwort-Archive: Postfix Mail Transfer Agent

Postfix ist ein Mail Transfer Agent für Unix und Unix-Derivate. Die Software sollte zum Entwicklungszeitpunkt eine kompatible Alternative zu Sendmail sein.

E-Mail ohne eigenen Mail-Server versenden mit SSMTP

E-Mail ohne eigenen Mail-Server versenden mit sSMTP Client zum Senden mit SMTP und SMTPS

Systeme verwenden in der Regel ein Mail Transfer Agent (MTA) wie Postfix oder Exim für den Versand von E-Mails.

E-Mail ohne eigenen Mail-Server versenden mit SSMTP

MTAs wie Postfix verfügen über einen mächtigen Funktionsumfang, was sich auch in einer komplexen Konfiguration wieder findet.

In Situationen bei diesen ein Linux Host E-Mails nicht direkt über ein Mail-Server versenden sollen, beispielsweise von Cron-Task, dieser im Fall von Fehler den Status per Mail versendet, oder ein Webserver mit einem Ticket oder einem Shop System, dieses mittels PHP Mails zustellt. Dafür aber extra ein kompletten MTA mit Postfix aufbauen zu komplex wäre. Auch sind kleine Netzwerke ohne eigenen MTA, ohne gültiges CA-Zertifikat und ohne fixe IP-Adresse ohnehin nicht in der Lage, E-Mails direkt versenden zu können, die meisten Mailserver werden den Empfang von diesen Servern ablehnen. Für solche Szenarien ist daher die weiterleitung von E-Mails an einen SMTP-Smarthost die probate Lösung, hierzu diesen Prozess das Tool ssmtp übernehmen kann.

sSMTP Mail Submission STARTTLS

ssmtp ist kein vollwertiger MTA (Mail-Transfer-Agent) wie Postfix oder Exim, viel mehr ist es ein einfaches Tool das E-Mails zu einem autorisierten MTA Smarthost weiterleitet. sSMTP unterstützt die Mail Submission Authentifizierung und STARTTLS.

Die sSMTP Installation

Die Installation von ssmtp hier auf RHEL als root wie folgt:

$ yum install ssmtp -y

Die Installation auf einer Debian basierten Distribution ist:

$ apt-get -y install ssmtp

E-Mails über Office 365 aus CLI versenden

Nach der Installation gibt es die zwei Konfigurationsdateien /etc/ssmtp/ssmtp.conf und /etc/ssmtp/revaliases, diese an die eigene Anforderung angepasst werden. Hier wird die Konfiguration erstellt, um E-Mails über ein Office 365 Konto zu verschicken.

$ vi /etc/ssmtp/ssmtp.conf

root=shop@domain.com
mailhub=smtp.office365.com:587
useSTARTTLS=YES
AuthUSER=shop@domain.com
AuthPass=password
RewriteDomain=domain.com
Hostname=domain.com
UseTLS=YES
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt

  Anstelle des Platzhalter shop@domain.com wird der entsprechende Benutzer verwendet dieser bei Office 365 erstellt wurde, bei password ist das zum Benutzer gehörende Passwort einzutragen, bei domain.com kann die eigene Domain oder outlook.com eingetragen werden. Natürlich funktioniert es auch mit anderen Anbieter, wie Goolge Mail (smtp.gmail.com). Dabei soll nicht unerwähnt sein, das der Zugriff auf das Google-Konto Zugriff durch weniger sichere Apps aktiviert sein muss.

Nun legt man fest welche User den Mailserver nutzen dürfen. Dies wird über die Datei revaliases festgelegt, reverse aliases ist die umgekehrte Version von aliases, dazu editiert man /etc/ssmtp/revaliases.

$ vi /etc/ssmtp/revaliases

root:shop@domain.com:smtp.office365.com:587
john:shop@domain.com:smtp.office365.com:587

Es darf root und der User john direkt vom Host senden.

Anschliessend wird eine Datei mit Parameter für ssmtp im richtigen Format erstellt, im Editor deiner wahl durch  Copy Past die nachstehenden Zeilen einfügen, inklusive Punkt am Ende:

$ vi ~/testmail.txt

To:touser@domain.net
From:shop@domain.com
Subject: Test Mail

This is a test mail.
.

  Anstelle To:touser@domain.net die eigentliche Empfänger Email eintragen, und bei From:shop@domain.com die korrekte Absender Email. Sollen weitere Empfänger erreicht werden, können dazu einfach weitere Zeilen To: mit den gewünschten Adressen eingetragen werden.

Testmail senden

Jetzt wird getestet, wir senden mit folgendem Command.

ssmtp -vvv -t < ~/testmail.txt

Es wird als der angemeldete Benutzer gesendet, ist john eingeloggt kann dieser Mails versenden weil er in revaliases eingetragen ist.

Die verbose Ausgabe in der Console dann etwa wie folgt:

[<-] 220 GV0P275CC0026.outlook.office365.com Microsoft ESMTP MAIL Service ready at Wed, 15 Jul 2020 05:37:09 +0000
[->] EHLO 12.34.56.78.dynamic.wline.res.cust.isp.net
[<-] 250 SMTPUTF8
[->] STARTTLS
[<-] 220 2.0.0 SMTP server ready
[->] EHLO 12.34.56.78.dynamic.wline.res.cust.isp.net
[<-] 250 SMTPUTF8
[->] AUTH LOGIN
[<-] 334 VCMlbm6hbXU7
[->] c3hvcECtb3VobC6jaA==
[<-] 334 UAFzc3dxcmQ7
[<-] 235 2.7.0 Authentication successful
[->] MAIL FROM:<shop@domain.com>
[<-] 250 2.1.0 Sender OK
[->] RCPT TO:<touser@domain.net>
[<-] 250 2.1.5 Recipient OK
[->] DATA
[<-] 354 Start mail input; end with <CRLF>.<CRLF>
[->] Received: by 12.34.56.78.dynamic.wline.res.cust.isp.net (sSMTP sendmail emulation); Wed, 15 Jul 2020 07:37:10 +0200
[->] Date: Wed, 15 Jul 2020 07:37:10 +0200
[->] To:touser@domain.net
[->] From:shop@domain.com
[->] Subject: Test Mail
[->]
[->] This is a test mail.
[->] .
[<-] 250 2.0.0 OK <DB8PR08MB3323E3B68DF12935DBECFADAB87E0@DC8PR09MB3123.eurprd09.prod.outlook.com> [Hostname=DB8PR08MB3123.eurprd09.prod.outlook.com]
[->] QUIT
[<-] 221 2.0.0 Service closing transmission channel

Im maillog sollte die ausgabe etwa wie diese zu finden sein.

Jul 14 20:51:16 fedora sSMTP[25809]: Creating SSL connection to host
Jul 14 20:51:16 fedora sSMTP[25809]: SSL connection using ECDHE-RSA-AES256-GCM-SHA384
Jul 14 20:51:19 fedora sSMTP[25809]: Sent mail for user@domain.com (221 2.0.0 Service closing transmission channel) uid=0 username=root outbytes=531

Damit nun auch beim Empfänger anstatt root, die eigentliche Absenderadresse erscheint, kann /etc/passwd angepasst werden.

$ grep "root:x" /etc/passwd
root:x:0:0:root:/root:/bin/bash

Hier kann das Finger Command chfn angewendet werden.

chfn -f 'here I am' root

Der mit Finger chfn geänderte full name in passwd weist danach folgenden Inhalt aus:

$ grep "root:x" /etc/passwd
root:x:0:0:here I am,,,,:/root:/bin/bash

Sollen E-Mail nur als root versendet werden, kann auf diese Konfiguration verzichtet werden, dabei wird über ssmtp.conf ermöglicht das eine Absenderadresse übergeben werden kann.

$ vi /etc/ssmtp/ssmtp.conf

# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
FromLineOverride=YES

E-Mail mit sSMTP ohne installierten Mail-Server versenden

Zu guter Letzt wollen natürlich nicht nur Testmails versendet werden. Für den produktiven Einsatz könnte beispielsweise mit PHP oder einem Shell Script eine Datei mit Parameter für ssmtp erzeugt werden, diese dann automatisiert die gewünschten Informationen dynamisch bereitstellt. Eine E-Mail mit sSMTP ohne installierten Mail-Server versenden mit ssmtp kann auch mit dem folgenden Einzieler ausgeführt werden.

$ echo -e "Subject: Hier ist der Betreff\n\nHier ist ein Text.\n\n." | ssmtp touser@domain.net

Postfix mit SASL-Authentifizierung verwenden

SMTP-Server müssen entscheiden, ob ein SMTP-Client autorisiert ist E-Mails zu versenden, für die der Server selbst zuständig ist.

Simple Authentication and Security Layer (SASL) Integration Postfix


Diese Anleitung beschreibt, wie man ein MTA (Mail Transport Agent) Postfix unter CentOS 7 mit CyrusSASL zur SMTP-Authentifizierung (SMTP-Auth) erweitert. Danach können Clients E-Mails mittels SMTP-Auth versenden. Diese Anleitung ist geprüft unter CentOS Linux release 7.7.1908 (Core), mit Postfix v2.10.1 und Cyrus-SASL 2.1.26. Es wird davon ausgegangen das Postfix bereits konfiguriert ist und TLS (Transport Layer Security) implementiert ist.

Postfix implementiert die SASL Library nicht selbst, sondern verwendet vorhandene Implementierungen als Bausteine. Dies bedeutet, dass einige SASL-bezogene Konfigurationsdateien zu Postfix gehören, während andere Konfigurationsdateien zu der spezifischen SASL-Implementierung gehören, die Postfix verwenden wird.

Cyrus-SASL Installation

Als root die Pakete mit folgendem Command installieren:

yum install cyrus-sasl cyrus-sasl-plain -y

Die einzelnen SASL-Mechanismen werden als RPMs installiert.

Es folgt die Einbindung für Postfix, hierzu die modifikation in der Datei /etc/postfix/master.cf vornehmen:

==========================================================================
 service type  private unpriv  chroot  wakeup  maxproc command + args
 (yes)   (yes)   (yes)   (never) (100)
 ==========================================================================
 smtps     inet  n       -       n       -       -       smtpd
   -o syslog_name=postfix/smtps
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes
   -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Damit Postfix mit SASL funktioniert, darf Postfix nicht im chroot-Verzeichnis laufen, Zeile smtps bei Position 5 (n).

SMTP-Auth für lokale Benutzer konfigurieren, wir editieren die Postfix Datei /etc/postfix/main.cf:

smtpd_tls_auth_only = no
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_sasl_auth_enable = yes
smtp_sasl_mechanism_filter = !gssapi, !login, static:all
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_type = cyrus
smtpd_sasl_path = smtpd 

Die Konfiguration von Cyrus-SASL erfolgt durch zwei Dateien. Die erste Datei /etc/sysconfig/saslauthd kann übernommen werden:

# Directory in which to place saslauthd's listening socket, pid file, and so
# on.  This directory must already exist.
SOCKETDIR=/run/saslauthd

# Mechanism to use when checking passwords.  Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam

# Additional flags to pass to saslauthd on the command line.  See saslauthd(8)
# for the list of accepted flags.
FLAGS=

Die SASL-Mechanismen PLAIN und LOGIN, CRAM-MD5 und DIGEST-MD5 kommen oft zum Einsatz, hierfür ist die Konfigurationsdatei /etc/sasl2/smtpd.conf zuständig, die bereitstellung wurde ebenfalls bei der Installation durchgeführt:

pwcheck_method: saslauthd
mech_list: plain login CRAM-MD5 DIGEST-MD5

Nun Cyrus-SASL Library Daemon starten und den systemd autostart aktivieren, anschliessend Postfix re-starten:

systemctl start saslauthd
systemctl enable saslauthd
systemctl restart postfix 

Der SMTP-Submission Support auf Port 587 ist nun aktiviert, überprüfen lässt sich dies mit folgendem Kommando:

ss -tuln4 | grep 587
tcp    LISTEN     0      100       *:587                  *:*

Zur Authentifizierung am SMTP-Gateway wird nun ein Benutzer erstellt, dieser E-Mails über den MTA versenden soll:

adduser -M -s /sbin/nologin User24
passwd User24

Eine lokale UserID ist für unsere Anforderung hier ausreichend, Cyrus-SASL unterstützt weiter LDAP und SQL, um mit beispielweise Kopano oder einem AD Verzeichnisdienst zu interagieren.

Cyrus-SASL SMTP-Auth Testen

Welche Mechanismen zur Authentifizierung innerhalb von STARTTLS unterstützt werden, kann mit OpenSSL überprüft werden:

openssl s_client -connect mail.relayhost.net:587 -starttls smtp

In der Ausgabe von openssl ein EHLO übergeben:

EHLO Hans
 250-mail.relayhost.net
 250-PIPELINING
 250-SIZE 27262976
 250-ETRN
 250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN

Ist OpenSSL nicht vorliegend, kann dazu auch Telnet genutzt werden, es wird zum Gateway mail.relayhost.net über Port 587 eine Verbindnung hergestellt, dazu kann auch PuTTY oder KiTTY verwendet werden.

KiTTY Configuration

Nun möchten wir uns beim Gateway (MTA) Authentifizieren. Der Benutzername und das Passwort muss im base64-codierten Format an das SMTP-Gateway übertragen werden, Hierzu gibt man die folgenden Befehlszeilen ein, um die base64-Codierung für den Benutzername und das Passwort zu erhalten.

echo -en "userxy" | base64
dXNlcnh5
echo -en "password" | base64
cGFzc3dvcmQ=

Die SASL SMTP-Auth Konfiguration und Authentifizierung überprüft man wie folgt mit ausführen der folgenden Zeilen im Terminal, nach Eingabe von AUTH LOGIN der mit Base64 codierte Benutzername und das Passwort einfügen.

AUTH LOGIN
dXNlcnh5
cGFzc3dvcmQ=
$ telnet mail.relayhost.net 25
Trying mail.relayhost.net...
Connected to mail.relayhost.net
Escape character is '^]'.
220 mail.relayhost.net ESMTP MAIL Service ready at  Sat, 12 Mar 2019 09:26:12
EHLO smtp.example.com
250-smtp.example.com Hello
250-AUTH=LOGIN
250-AUTH LOGIN
250-TURN
250-SIZE 2097152
250-ETRN
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-8bitmime
250-BINARYMIME
250-CHUNKING
250-VRFY
250 OK
AUTH LOGIN
334 VXClcm5hbWU6
dXNlcnh5
334 UGFzc4dvcmQ8
cGFzc3dvcmQ=
235 2.7.0 Authentication successful

Die Ausgabe SMTP-Auth von Postfix mit Cyrus-SASL.

Die oben kodierten Credentials bei den 334 Prompts einfügen, hier bei Zeile 24 als userxy und bei Zeile 26 unser password.

  Ein 250 STARTTLS in der Ausgabe zeigt die Voraussetzungen, das Klartext-Benutzernamen mit Passwort durch STARTTLS geschützt an das SMTP-Gateway übermittelt werden.

Eine weitere einfache Möglichkeit gibt es mit SMTPConsole ein SMTP-Gateway zu testen.

Mit SMTP Console testen
SMTPConsole