Inhaltsverzeichnis

SASL-Authentifizierung beim MailTransferAgent Postfix 3.x unter CentOS 7

Zur Authentifizierung unserer Mail-Clients gegenüber unserem Mailserver wollen wir SMTP-Auth1) einsetzen. Da SMTP-Auth nicht regelt, wie der Mailserver auf die eigentliche Userdatenbank zugreifen kann, benötigen wir Unterstützung durch SASL2). Mit Hilfe von SASL kann für verschiedene Protokolle, wie z.B. SMTP, IMAP oder POP3, im Internet eine Benutzerauthentifizierung relativ einfach realisiert werden, da SASL hierzu eine standardisierte Vermittlungsschicht zur Verfügung stellt. Weitere Informationen findet man auf der Wikipedia SASL Seite, im RFC 4422, oder auf der Webseite der IANA.

Postfix unterstützt zwei verschiedene SASL-Implementierungen, die je nach Betrachtung mehr oder minder kompliziert bei der Installation und Konfiguration anmuten.

Beide Lösungen sind vom Grundsatz her gleich aufgebaut - basieren doch beide auf grundlegende folgende Struktur.

SASL-LayerAuthentication InterfaceMechanismenMethoden / Password Verification ServicesClientrequest

Folgende Funktionen werden durch die entsprechenden Layer zur Verfügung gestellt:

Auf dieses abstrakte Schaubild werden wir speziell bei der cyrus-sasl-Variante genauer eingehen.

SASL mit cyrus-sasl

Grundlagen

Bild: cyrus-sasl Logo Die älteste und auch sehr verbreitete Cyrus SASL Library, kann verschiedene Authentifizierungsmethoden zur Verfügung stellen, wie z.B. Plain, CRAM-MD5, Digest-MD5, PAM oder NTLM. Die scheinbare Komplexität schreckt viele Mailserver-Administratoren ab.

Dass dies nicht unbedingt stimmt, wollen wir uns an Hand des nachfolgenden Konfigurationsbeispiels genauer ansehen. Werfen wir als erstes noch einmal kurz einen Blick auf das zuvor gezeigte Schaubild - zum besseren Verständnis, welche Teile welche Aufgaben wahrnehmen und wo diese Teile ggf. konfiguriert werden, wurde dieses etwas erweitert.

Mail-Client des AbsendersSASL-LayerAuthentication InterfaceSASL RequestDer Mail-User-Agent "MUA" willsich authentifizieren, da ereine eMail an einen externenEmpfänger senden will. (relaying)MechanismenPLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLMMethoden / Password Verification ServicesSMTP-DaemonAnnahme der ankommenden Verbindungsowie Durchführung der Authentifizierungund ggf. Annahme der NachrichtmySQL Datenbankpostfix-adminDatenbanktabelle /etc/sysconfig/saslauthd├── SOCKETDIR=/run/saslauthd├── MECH=pam└── FLAGS=  /etc/sasl2/smtpd.conf└── mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM  /etc/sasl2/smtpd.conf├── pwcheck_method: auxprop├── auxprop_plugin: sql├── sql_engine: mysql├── sql_hostnames: mysql.dmz.nausch.org├── sql_database: postfix├── sql_user: postfix_user├── sql_passwd: rbBgeM2b2btx9iMHfzd├── sql_select: SELECT password FROM mailbox WHERE username='%u@%r' AND active = '1'├── sql_usessl: no└── mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM  /etc/postfix/main.cf├── smtpd_sasl_auth_enable = yes├── smtpd_sasl_type = cyrus├── smtpd_sasl_path = smtpd├── broken_sasl_auth_clients = yes├── smtpd_sasl_security_options = noanonymous└── smtpd_sasl_tls_security_options = $smtpd_sasl_security_options 

Installation

Die Installation der Cyrus-SASL-Library und der benötigten Mechanismen erfolgt mit Hilfe des Paketverwaltungs-Programms yum.

 # yum install cyrus-sasl

Was genau uns dieses Paket mitbrachte, erkunden wir mit Hilfe des folgenden Aufrufs.

 # rpm -qil cyrus-sasl
Name        : cyrus-sasl
Version     : 2.1.26
Release     : 23.el7
Architecture: x86_64
Install Date: Sat 09 Feb 2019 08:54:17 PM CET
Group       : System Environment/Libraries
Size        : 144492
License     : BSD with advertising
Signature   : RSA/SHA256, Wed 25 Apr 2018 12:56:39 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : cyrus-sasl-2.1.26-23.el7.src.rpm
Build Date  : Wed 11 Apr 2018 06:20:59 AM CEST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : The Cyrus SASL library
Description :
The cyrus-sasl package contains the Cyrus implementation of SASL.
SASL is the Simple Authentication and Security Layer, a method for
adding authentication support to connection-based protocols.
/etc/sysconfig/saslauthd
/run/saslauthd
/usr/lib/systemd/system/saslauthd.service
/usr/sbin/pluginviewer
/usr/sbin/saslauthd
/usr/sbin/testsaslauthd
/usr/share/doc/cyrus-sasl-2.1.26
/usr/share/doc/cyrus-sasl-2.1.26/LDAP_SASLAUTHD
/usr/share/man/man8/pluginviewer.8.gz
/usr/share/man/man8/saslauthd.8.gz
/usr/share/man/man8/sasldblistusers2.8.gz
/usr/share/man/man8/saslpasswd2.8.gz
/usr/share/man/man8/testsaslauthd.8.gz

Da wir zur Benutzerverwaltung die WEB-Anwendung postfix.admin und die dazu nötige mySQL-Datenbank verwenden, benötigen wir noch den SQL auxprop Support für Cyrus SASL.

 # yum install cyrus-sasl-sql

Den Inhalt des Authentifizierungs-Plugin zeigt uns der der Befehl rpm -qil cyrus-sasl-sql.

 # rpm -qil cyrus-sasl-sql
Name        : cyrus-sasl-sql
Version     : 2.1.26
Release     : 23.el7
Architecture: x86_64
Install Date: Sat 09 Feb 2019 08:55:43 PM CET
Group       : System Environment/Libraries
Size        : 28336
License     : BSD with advertising
Signature   : RSA/SHA256, Wed 25 Apr 2018 12:56:57 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : cyrus-sasl-2.1.26-23.el7.src.rpm
Build Date  : Wed 11 Apr 2018 06:20:59 AM CEST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : SQL auxprop support for Cyrus SASL
Description :
The cyrus-sasl-sql package contains the Cyrus SASL plugin which supports
using a RDBMS for storing shared secrets.
/usr/lib64/sasl2/libsql.so
/usr/lib64/sasl2/libsql.so.3
/usr/lib64/sasl2/libsql.so.3.0.0

Die einzelnen SASL-Mechanismen hat der Paket-Maintainer in separate RPMs ausgelagert.

 # yum search cyrus-sasl- | grep support | grep x86_64
cyrus-sasl-gs2.x86_64 : GS2 support for Cyrus SASL
cyrus-sasl-gssapi.x86_64 : GSSAPI authentication support for Cyrus SASL
cyrus-sasl-ldap.x86_64 : LDAP auxprop support for Cyrus SASL
cyrus-sasl-md5.x86_64 : CRAM-MD5 and DIGEST-MD5 authentication support for Cyrus
cyrus-sasl-ntlm.x86_64 : NTLM authentication support for Cyrus SASL
cyrus-sasl-plain.x86_64 : PLAIN and LOGIN authentication support for Cyrus SASL
cyrus-sasl-scram.x86_64 : SCRAM auxprop support for Cyrus SASL
cyrus-sasl-sql.x86_64 : SQL auxprop support for Cyrus SASL

Für unsere Kunden mit Ihren MUA3)s wollen wir anbieten:

Wir installieren also die drei benötigten RPMs cyrus-sasl-plain, cyrus-sasl-md5 und cyrus-sasl-ntlm.

 # yum install cyrus-sasl-plain cyrus-sasl-md5 cyrus-sasl-ntlm

Den Inhalt der einzelnen RPMs können wir uns bei Bedarf jeweils mit rpm -qil <paketname> anzeigen lassen.

 # rpm -qil cyrus-sasl-plain
Name        : cyrus-sasl-plain
Version     : 2.1.26
Release     : 23.el7
Architecture: x86_64
Install Date: Sat 09 Feb 2019 08:56:50 PM CET
Group       : System Environment/Libraries
Size        : 39992
License     : BSD with advertising
Signature   : RSA/SHA256, Wed 25 Apr 2018 12:56:54 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : cyrus-sasl-2.1.26-23.el7.src.rpm
Build Date  : Wed 11 Apr 2018 06:20:59 AM CEST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : PLAIN and LOGIN authentication support for Cyrus SASL
Description :
The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
PLAIN and LOGIN authentication schemes.
/usr/lib64/sasl2/liblogin.so
/usr/lib64/sasl2/liblogin.so.3
/usr/lib64/sasl2/liblogin.so.3.0.0
/usr/lib64/sasl2/libplain.so
/usr/lib64/sasl2/libplain.so.3
/usr/lib64/sasl2/libplain.so.3.0.0
 # rpm -qil cyrus-sasl-md5
Name        : cyrus-sasl-md5
Version     : 2.1.26
Release     : 23.el7
Architecture: x86_64
Install Date: Sat 09 Feb 2019 08:56:50 PM CET
Group       : System Environment/Libraries
Size        : 82064
License     : BSD with advertising
Signature   : RSA/SHA256, Wed 25 Apr 2018 12:56:50 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : cyrus-sasl-2.1.26-23.el7.src.rpm
Build Date  : Wed 11 Apr 2018 06:20:59 AM CEST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : CRAM-MD5 and DIGEST-MD5 authentication support for Cyrus SASL
Description :
The cyrus-sasl-md5 package contains the Cyrus SASL plugins which support
CRAM-MD5 and DIGEST-MD5 authentication schemes.
/usr/lib64/sasl2/libcrammd5.so
/usr/lib64/sasl2/libcrammd5.so.3
/usr/lib64/sasl2/libcrammd5.so.3.0.0
/usr/lib64/sasl2/libdigestmd5.so
/usr/lib64/sasl2/libdigestmd5.so.3
/usr/lib64/sasl2/libdigestmd5.so.3.0.0
 # rpm -qil cyrus-sasl-ntlm
Name        : cyrus-sasl-ntlm
Version     : 2.1.26
Release     : 23.el7
Architecture: x86_64
Install Date: Sat 09 Feb 2019 08:56:50 PM CET
Group       : System Environment/Libraries
Size        : 36808
License     : BSD with advertising
Signature   : RSA/SHA256, Wed 25 Apr 2018 12:56:52 PM CEST, Key ID 24c6a8a7f4a80eb5
Source RPM  : cyrus-sasl-2.1.26-23.el7.src.rpm
Build Date  : Wed 11 Apr 2018 06:20:59 AM CEST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem <http://bugs.centos.org>
Vendor      : CentOS
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
Summary     : NTLM authentication support for Cyrus SASL
Description :
The cyrus-sasl-ntlm package contains the Cyrus SASL plugin which supports
the NTLM authentication scheme.
/usr/lib64/sasl2/libntlm.so
/usr/lib64/sasl2/libntlm.so.3
/usr/lib64/sasl2/libntlm.so.3.0.0

Konfiguration

Die Konfiguration von cyrus-sasl erfolgt nun mit Hilfe von zwei Dateien. Die erste Datei /etc/sysconfig/saslauthd benötigt keine besondere Beachtung für unseren Anwendungsfall.

 # less /etc/sysconfig/saslauthd
/etc/sysconfig/saslauthd
# 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 weitere wichtige Stelle, an der wir nun die SASL-Mechanismen und die SASL Methoden & Password Verification Services konfigurieren müssen, ist /etc/sasl2/smtpd.conf. Diese Datei wurde uns bereits bei der Installation von Postfix selbst auf unseren Server gestellt.

 # rpm -qf /etc/sasl2/smtpd.conf 
postfix-3.3.2-1.el7.x86_64

Diese Konfigurationsdatei bearbeiten wir nun mit dem editor unserer wahl, z.B. vim.

# vim /etc/sasl2/smtpd.conf

/etc/sasl2/smtpd.conf
# Django : 2019-02-09 - Fehler, fehlerhafte Authentifizierungen und Warnungen loggen
# default: log_level: 1
log_level: 3
 
# Django : 2019-02-09 - Das Auxiliary Property plugin für die Anbindung an das Datenbankbackend mysql 
#          verwenden
# default: pwcheck_method: saslauthd
pwcheck_method: auxprop
 
# Django : 2019-02-09 - Die Mechanismen PLAIN, LOGIN, CRAM-MD5, DIGEST-MD5 und NTLM anbieten
# default: mech_list: plain login
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
 
# Django : 2019-02-09 - Definition der Datenbankanbindung an unseren mySQL-Datenbankserver
# default: unset
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: mysql.dmz.nausch.org
sql_database: postfix
sql_user: postfix_user
sql_passwd: rbBgeM2b2btx9iMHfzd
sql_select: SELECT password FROM mailbox WHERE username='%u@%r' AND active = '1'
sql_usessl: no

manueller Start von Cyrus-SASL

Da wir die Konfiguration von Cyrus-SASL erfolgreich beendet haben, können wir nun den zugehörigen Service starten.

 # systemctl start saslauthd.service

Den erfolgreichen Start des Daemon können wir wie folgt abfragen.

 # systemctl status saslauthd.service

saslauthd.service - SASL authentication daemon.
   Loaded: loaded (/usr/lib/systemd/system/saslauthd.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2019-02-09 21:02:11 CET; 6s ago
  Process: 25780 ExecStart=/usr/sbin/saslauthd -m $SOCKETDIR -a $MECH $FLAGS (code=exited, status=0/SUCCESS)
 Main PID: 25781 (saslauthd)
   CGroup: /system.slice/saslauthd.service
           ├─25781 /usr/sbin/saslauthd -m /run/saslauthd -a pam
           ├─25782 /usr/sbin/saslauthd -m /run/saslauthd -a pam
           ├─25783 /usr/sbin/saslauthd -m /run/saslauthd -a pam
           ├─25784 /usr/sbin/saslauthd -m /run/saslauthd -a pam
           └─25785 /usr/sbin/saslauthd -m /run/saslauthd -a pam

Feb 09 21:02:11 vml000080.dmz.nausch.org systemd[1]: Starting SASL authentication daemon....
Feb 09 21:02:11 vml000080.dmz.nausch.org saslauthd[25781]: detach_tty      : master pid is: 25781
Feb 09 21:02:11 vml000080.dmz.nausch.org systemd[1]: Started SASL authentication daemon..
Feb 09 21:02:11 vml000080.dmz.nausch.org saslauthd[25781]: ipc_init        : listening on socket: /run/saslauthd/mux

automatischer Start des Cyrus-SASL Daemon beim Systemstart

Wollen wir den Daemon beim Hochfahren des Systems automatisch starten, greifen wir auf den Befehl systemctl zurück.

 # systemctl enable saslauthd.service
 
 ln -s '/usr/lib/systemd/system/saslauthd.service' '/etc/systemd/system/multi-user.target.wants/saslauthd.service'

Möchten wir uns vergewissern, ob der Daemon beim Systemstart gestartet wird oder nicht, erfahren wir ebenfalls mit dem Befehl systemctl.

 # systemctl is-enabled saslauthd.service
 enabled

Startet der Server nicht automatisch, wird uns ein „disabled“ zurückgemeldet.

Postfix-Konfiguration

Die Konfiguration von SASL-Auth beim Postfix MTA gestaltet sich sehr einfach im Vergleich zu den Vorbereitungen auf Seiten von cyrus-sasl. Detailierte Hinweise hierzu finden wir in der entsprechenden SASL-Dokumentation von Postfix.

Wir legen uns eine eigene Sektion in der Postfix-Konfigurationsdatei /etc/postfix/main.cf an.

...
 
################################################################################
## SASL-Authentifizierung
#
# Django : 2019-02-09 SASL Authentifizierung aktivieren
#          http://www.postfix.org/SASL_README.html
# default: smtpd_sasl_auth_enable = no
smtpd_sasl_auth_enable = yes
 
# Django : 2019-02-09 Statt des Default SASL-Mechanismus "cyrus" wollen wir die
#          SALS-Implementierung von Dovecot nutzen.
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_type
# default: smtpd_sasl_type = cyrus
 
# Django : 2019-02-09 Definition wie Postfix das Authentifizierungsbackend
#          erreichen kann; dies ist entweder eine Datei mit weiteren 
#          Konfigurationsdetails oder ein UNIX oder TCP-Socket
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_path
# default: smtpd_sasl_path = smtpd
 
# Django : 2019-02-09 Obsolete Authentifizierungsbefehle (RFC 4954) unter-
#          stützen, um so Clients wie z.B. MicroSoft Outlook Express version 4
#          oder MicroSoft Exchange Version 5.0 die Authentifizierungsmöglichkeit
#          zur Verfügung zu stellen.
#          http://www.postfix.org/postconf.5.html#broken_sasl_auth_clients
# default: broken_sasl_auth_clients = no
broken_sasl_auth_clients = yes
 
# Django : 2019-02-09 Definition des Namen des lokalen SASL Authentifizierungs
#          Realm.
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_local_domain
# default: smtpd_sasl_local_domain =
 
# Django : 2019-02-09 Postfix SMTP Daemon SASL Sicherheitsoptionen
#          Welche Authentifizierungsmechanismen soll der Postfix SMTP-Daemon
#          den Clients anbieten?
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_security_options
# default: smtpd_sasl_security_options = noanonymous
 
# Django : 2019-02-09 SASL Authentifizierung Sicherheitsoptionen, die er
#          SMTP-Daemon für TLS verschlüsselte SMTP-Verbindungen nutzen soll.
#          http://www.postfix.org/postconf.5.html
# default: smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
 
...

Der Wert yes beim Konfigurationsparameter broken_sasl_auth_clients bewirkt, dass auch Clients wie z.B. MicroSoft Outlook Express Version 4 oder MicroSoft Exchange version 5.0, die die obsoleten Authentifizierungsbefehle (RFC 4954) unterstützen, sich authentifizieren können. Man erkennt die gesetzte Option an der zweiten Zeile 250-AUTH=PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM bei den ESMTP-Rückmeldungen beim SMTP-Dialog nach dem sich der Client mit EHLO <hostname> gemeldet hat.

Zur Aktivierung unserer Konfigurationsänderungen führen wir nun einen Reload unseres Daemon durch.

 # systemctl reload postfix

Nachdem wir die Konfiguration von cyrus-sasl und unseres postfix-Daemon erfolgreich abgeschlossen haben, können wir uns daran machen, die Installation zu testen.

SASL mit Dovecot

Dovecot-Logo Der IMAP-Server DOVECOT findet immer mehr Anhänger im Postmaster-Umfeld. Dies nicht zuletzt wegen der Robustheit und der einfachen Konfigurationsmöglichkeiten. Letzteres gilt natürlich auch für das Thema SASL!

Wie auch die Cyrus SASL Library, kann Dovecot verschiedene Authentifizierungsmethoden zur Verfügung stellen, wie z.B. Plain, CRAM-MD5, Digest-MD5, PAM oder NTLM.

Werfen wir auch hier erst einen Blick auf das Eingangs gezeigte Schaubild - zum besseren Verständnis, welche Teile welche Aufgaben wahrnehmen und wo diese Teile ggf. konfiguriert werden, wurde auch dieses entsprechend erweitert.

Mail-Client des AbsendersSASL-LayerAuthentication InterfaceSASL RequestDer Mail-User-Agent "MUA" willsich authentifizieren, da ereine eMail an einen externenEmpfänger senden will. (relaying)MechanismenPLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLMMethoden / Password Verification ServicesSMTP-DaemonAnnahme der ankommenden Verbindungsowie Durchführung der Authentifizierungund ggf. Annahme der NachrichtSASL-DaemonSASL-Socket/Port desDOVECOT-IMAP-ServermySQL Datenbankpostfix-adminDatenbanktabelle /etc/dovecot/conf.d/10-auth.conf└── !include auth-sql.conf.ext  /etc/postfix/main.cf├── service auth {├── smtpd_sasl_type = dovecot├── smtpd_sasl_path = inet:10.0.0.77:3659├── broken_sasl_auth_clients = yes├── smtpd_sasl_security_options = noanonymous└── smtpd_sasl_tls_security_options = $smtpd_sasl_security_options  /etc/dovecot/conf.d/10-master.conf├── service auth {├──── inet_listener {├──── address = imap.dmz.nausch.org├──── port = 3659├─── }└── }  /etc/dovecot/conf.d/10-auth.conf└── auth_mechanisms = plain login digest-md5 cram-md5 ntlm 

Konfiguration

Hinweise zur Konfiguration findet man in der Dokuseite von Dovecot.

Die Auswahl der SASL-Mechanismen erfolgt beim Dovecot-IMAP-Server in der Konfigurationsdatei /etc/dovecot/conf.d/10-auth.conf. Die dort hinterlegten SASL-Mechanismen gelten sowohl für den IMAP/POP3-Daemon, wie auch für den SASL-Proxy, der für Postfix die Authentifikationsschnittstelle zur Verfügung stellt.

 # vim /etc/dovecot/conf.d/10-auth.conf
...
 
# Space separated list of wanted authentication mechanisms:
#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
#   gss-spnego
# NOTE: See also disable_plaintext_auth setting.
# Django : 2019-02-09
# default: auth_mechanisms = plain
auth_mechanisms = plain login digest-md5 cram-md5 ntlm
 
...

Wie auch schon bei den SASL-Mechanismen greifen wir bei den Methoden / Password Verification Service auf die Konfigurationen des Dovecot-IMAP-Servers zurück. Wir brauchen daher nichts weiter gesondert konfigurieren, sondern greifen auf die Dovecot, Authentifizierungs-Konfiguration zurück.

 # less /etc/dovecot/conf.d/10-auth.conf
...

# Django : 2019-02-09
# Auswahl des Authentifizierungsmechanismus
# default: !include auth-system.conf.ext
#!include auth-system.conf.ext
!include auth-sql.conf.ext

Was uns eigentlich an Konfiguration auf Seiten des Dovecot-Servers noch fehlt ist die Schnittstelle des SASL-Proxies, also dem Punkt an dem der Postfix Mailserver die Authentifizierungsanfrage an den Dovecot-Server stellen kann. Diese Konfiguration erfolgt mit Hilfe der Konfigurationsdatei /etc/dovecot/conf.d/10-master.conf.

 # vim /etc/dovecot/conf.d/10-master.conf
...
 
service auth {
  # auth_socket_path points to this userdb socket by default. It's typically
  # used by dovecot-lda, doveadm, possibly imap process, etc. Users that have
  # full permissions to this socket are able to get a list of all usernames and
  # get the results of everyone's userdb lookups.
  #
  # The default 0666 mode allows anyone to connect to the socket, but the
  # userdb lookups will succeed only if the userdb returns an "uid" field that
  # matches the caller process's UID. Also if caller's uid or gid matches the
  # socket's uid or gid the lookup succeeds. Anything else causes a failure.
  #
  # To give the caller full permissions to lookup all users, set the mode to
  # something else than 0666 and Dovecot lets the kernel enforce the
  # permissions (e.g. 0777 allows everyone full permissions).
  unix_listener auth-userdb {
    # Django : 2019-02-09
    # Authentication Socket für userdb-Anfragen bei Nutzung von shared folders
    # default: #mode = 0666
    #          #user = 
    #          #group =
    user = vmail
    group = vmail
  }
 
  # Postfix smtp-auth
  #unix_listener /var/spool/postfix/private/auth {
  #  mode = 0666
  #}
 
  # Auth process is run as this user.
  #user = $default_internal_user
 
  # Django : 2019-02-09
  # default: unset
  # Authentifizierungsport 3659 für Postfix Frontend-Mailserver definiert
    inet_listener {
     address = 10.0.0.77
     port = 3659
  }
}
 
...

Dies ist vermutlich der Grund, warum viele Administratoren der Dovecot-SASL Implementierung der Cyrus-SASL Implementierung vorziehen.

Zur Aktivierung unserer Konfigurationsänderungen führen wir nun einen Reload des Dovecot-Daemon durch.

 # systemctl reload dovecot.service

Paketfilter

Damit unser Postfix-MTA (smtp.dmz.nausch.org) auch Authentifizierungsanfragen an unseren Dovecot-MDA (imap.dmz.nausch.org) stellen kann, muss dieser den Authentifizierungs-Port 3659 erreichen können. Wir erstellen also eine passende Regel bei unserem Paketfilter/Firewall.

 # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.80/32" port protocol="tcp" port="3659" destination address="10.0.0.77/32" accept"

Zur Aktivierung führen wir einen Reload des Firewall-Daemon durch.

 # firewall-cmd --reload

Wollen wir überprüfen, ob die Regel entsprechend aktiv ist, fragen wir unsere Firewall ab.

 # iptables -nvL IN_public_allow
Chain IN_public_allow (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       10.0.0.80            10.0.0.77            tcp dpt:3659 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *       10.0.0.80            10.0.0.77            tcp dpt:24 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW

Postfix-Konfiguration

Die Konfiguration von SASL-Auth beim Postfix MTA gestaltet sich ähnlich einfach, wie beim zuvor vorgestellten Konfigurationsbeispiel bei der Cyrus-SASL-Implementierung. Detailierte Hinweise hierzu finden wir in der entsprechenden SASL-Dokumentation von Postfix.

Wir legen uns eine eigene Sektion in der Postfix-Konfigurationsdatei /etc/postfix/main.cf an.

...
 
################################################################################
## SASL-Authentifizierung
#
# Django : 2019-02-09 SASL Authentifizierung aktivieren
#          http://www.postfix.org/SASL_README.html
# default: smtpd_sasl_auth_enable = no
smtpd_sasl_auth_enable = yes
 
# Django : 2019-02-09 Statt des Default SASL-Mechanismus "cyrus" wollen wir die
#          SALS-Implementierung von Dovecot nutzen.
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_type
# default: smtpd_sasl_type = cyrus
smtpd_sasl_type = dovecot
 
# Django : 2019-02-09 Definition wie Postfix das Authentifizierungsbackend
#          erreichen kann; dies ist entweder eine Datei mit weiteren 
#          Konfigurationsdetails oder ein UNIX oder TCP-Socket
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_path
# default: smtpd_sasl_path = smtpd
smtpd_sasl_path = inet:imap.dmz.nausch.org:3659
 
# Django : 2019-02-09 Obsolete Authentifizierungsbefehle (RFC 4954) unter-
#          stützen, um so Clients wie z.B. MicroSoft Outlook Express version 4
#          oder MicroSoft Exchange Version 5.0 die Authentifizierungsmöglichkeit
#          zur Verfügung zu stellen.
#          http://www.postfix.org/postconf.5.html#broken_sasl_auth_clients
# default: broken_sasl_auth_clients = no
broken_sasl_auth_clients = yes
 
# Django : 2019-02-09 Definition des Namen des lokalen SASL Authentifizierungs
#          Realm.
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_local_domain
# default: smtpd_sasl_local_domain =
 
# Django : 2019-02-09 Postfix SMTP Daemon SASL Sicherheitsoptionen
#          Welche Authentifizierungsmechanismen soll der Postfix SMTP-Daemon
#          den Clients anbieten?
#          http://www.postfix.org/postconf.5.html#smtpd_sasl_security_options
# default: smtpd_sasl_security_options = noanonymous
 
# Django : 2019-02-09 SASL Authentifizierung Sicherheitsoptionen, die er
#          SMTP-Daemon für TLS verschlüsselte SMTP-Verbindungen nutzen soll.
#          http://www.postfix.org/postconf.5.html
# default: smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
 
...

Der Wert yes beim Konfigurationsparameter broken_sasl_auth_clients bewirkt, dass auch Clients wie z.B. MicroSoft Outlook Express Version 4 oder MicroSoft Exchange version 5.0, die die obsoleten Authentifizierungsbefehle (RFC 4954) unterstützen, sich authentifizieren können. Man erkennt die gesetzte Option an der zweiten Zeile 250-AUTH=PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM bei den ESMTP-Rückmeldungen beim SMTP-Dialog nach dem sich der Client mit EHLO <hostname> gemeldet hat.

Zur Aktivierung unserer Konfigurationsänderungen führen wir nun einen Reload unseres Daemon durch.

 # systemctl reload postfix

Nachdem wir die Konfiguration von cyrus-sasl und unseres postfix-Daemon erfolgreich abgeschlossen haben, können wir uns daran machen, die Installation zu testen.

SASL und Submission/Relaying

Damit nun unsere authentifizierten Nutzer, wie auch Clients aus unserem eigenen Netz oder auch z.B. der Backupmailserver auch über unseren Server, Empfänger fremder Maildomains Nachrichten schicken können (relayen) passen wir noch die Konfiguration unseres Mailservers an.

Relaying

In der Hauptkonfigurationsdatei /etc/postfix/main.cf legen wir eine neue Section SMTP Relay Restrictions an.

 # vim /etc/postfix/main.cf
... 
 
################################################################################
## SMTP Relay Restrictions
#
# Django : 2019-02-09 - Definition, wer über unseren MX relayen darf oder nicht. 
#          http://www.postfix.org/postconf.5.html#smtpd_relay_restrictions
# default: smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
#
smtpd_relay_restrictions =
# Unsere eigenen Nutzer zulassen-/erlauben
           permit_sasl_authenticated
           permit_mynetworks
# Backupserver (MX) erlauben
           permit_mx_backup
# alles andere an relaying verbieten, d.h. mit einem finalen error 550 abweisen
           reject_unauth_destination
 
...

Submission

Auch bei Submission auf Port 587 setzen wir die Option permit_sasl_authenticated.

 # vim /etc/postfix/master.cf
...
 
# Django : 2019-02-09 Submission auf Port 587 geöffnet
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_etrn_restrictions=reject
  #-o smtpd_client_restrictions=$mua_client_restrictions
  #-o smtpd_helo_restrictions=$mua_helo_restrictions
  #-o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
  -o mydestination=lists.nausch.org,fax.nausch.org
 
...

Testen

Zum leichteren Testen der Authentifizierung greifen wir auf das „Schweitzer Taschenmesser für SMTP“ kurz SWAKS zurück. Vor allem beim Testen der Challenge-Response-Authentifizierung unterstützt uns swaks ebenso, wie beim Tippen der einzelnen SMTP-Befehle.

Authentifizierungsoptionen

Als erstes testen wir, ob und ggf. welche SASL-Mechanismen unser Postfix SMTP-Server nun anbietet. Dazu geben wir beim nachfolgenden Programmaufruf bewusst erst einmal ein falsches Passwort an, da wir unseren Blick erst einmal auf die angebotenen SASL-Mechanismen werfen wollen.

 # swaks --to django@nausch.org --from django@nausch.org --auth CRAM-MD5 --auth-user django@nausch.org \
         --auth-password youcanfullytrustyourgovernment! --protocol ESMTPS --header-X-Test "test email" --server 10.0.0.80:587
=== Trying 10.0.0.80:587...
=== Connected to 10.0.0.80.
<-  220 mx1.nausch.org ESMTP Postfix
 -> EHLO vml000080.dmz.nausch.org
<-  250-mx1.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250 SMTPUTF8
 -> STARTTLS
<-  220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
=== TLS no local certificate set
=== TLS peer DN="/OU=Domain Control Validated/CN=*.nausch.org"
 ~> EHLO vml000080.dmz.nausch.org
<~  250-mx1.nausch.org
<~  250-PIPELINING
<~  250-SIZE 52428800
<~  250-ETRN
<~  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-ENHANCEDSTATUSCODES
<~  250-8BITMIME
<~  250-DSN
<~  250 SMTPUTF8
 ~> AUTH CRAM-MD5
<~  334 PDI1NTEzNjUyNDE3Njk3MDguMTU0OTc4MzcyN0B2bWwwMDAwNzcuZG16Lm5hdXNjaC5vcmc+
 ~> ZGphbmdvQG1haWxzZXJ2ZXIuZ3VydSA4NTEzMzE4M2YxZjhiZDRjNzc2N2Q2MGM2ODc4ODhmYw==
<~* 535 5.7.8 Error: authentication failed: PDI1NTEzNjUyNDE3Njk3MDguMTU0OTc4MzcyN0B2bWwwMDAwNzcuZG16Lm5hdXNjaC5vcmc+. Contact your postmaster/admin for technical assistance. He can achieve our postmaster via email: postmaster@nausch.org or via fax: +49 8121 883179. In any case, please provide the following information in your problem report: This error message, time (Feb 10 08:28:49), client (10.0.0.80) and server (mx1.nausch.org).
*** No authentication type succeeded
 ~> QUIT
<~  221 2.0.0 Bye
=== Connection closed with remote host.

Natürlich wird der erfolglose Verbindungsaufbau auch entsprechend mit einem warning im Maillog protokolliert.

Feb 10 08:28:47 vml000080 postfix/submission/smtpd[27078]: connect from vml000080.dmz.nausch.org[10.0.0.80]
Feb 10 08:28:47 vml000080 postfix/submission/smtpd[27078]: Anonymous TLS connection established from vml000080.dmz.nausch.org[10.0.0.80]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Feb 10 08:28:49 vml000080 postfix/submission/smtpd[27078]: warning: vml000080.dmz.nausch.org[10.0.0.80]: SASL CRAM-MD5 authentication failed: PDI1NTEzNjUyNDE3Njk3MDguMTU0OTc4MzcyN0B2bWwwMDAwNzcuZG16Lm5hdXNjaC5vcmc+
Feb 10 08:28:49 vml000080 postfix/submission/smtpd[27078]: disconnect from vml000080.dmz.nausch.org[10.0.0.80] ehlo=2 starttls=1 auth=0/1 quit=1 commands=4/5

Unser Server bietet uns also folgende Authentifizierungs-Mechanismen an:

An der zweiten Zeile 250-AUTH=PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM bei den ESMTP-Rückmeldungen beim SMTP-Dialog, nach dem sich der Client mit EHLO <hostname> gemeldet hat, sehen wir den gesetzten broken_sasl_auth_clients = yes. Der Wert yes beim Konfigurationsparameter broken_sasl_auth_clients bewirkt, dass auch Clients wie z.B. MicroSoft Outlook Express Version 4 oder MicroSoft Exchange version 5.0, die die obsoleten Authentifizierungsbefehle (RFC 4954) unterstützen, sich authentifizieren können.

Test der Authentifizierung

Nun testen wir die unterschiedlichen Authentifizierungsvarianten, die der Server unseren Clients anbietet.

Bei den einzelnen Tests geben wir aber das Passwort nicht als Option in der Befehlszeile mit, schließlich wollen wir ja nicht, dass in der bash-History dieses entsprechend auffindbar ist!

PLAIN

Als erstes testen wir den PLAIN-Mechanismus: Nach Aufruf von swaks werden wir nach dem zugehörigen Passwort gefragt. Anschließend sehen wir den SMTP-Dialog zwischen dem Client „swaks“ und dem Server „postfix“.

 # swaks --to django@nausch.org --from michael@nausch.org --auth PLAIN --auth-user michael@nausch.org --protocol ESMTPS \\
         --header-X-Test "test email" --server 10.0.0.80:587
Password: DAx1d13g31l354u!
=== Trying 10.0.0.80:587...
=== Connected to 10.0.0.80.
<-  220 mx1.nausch.org ESMTP Postfix
 -> EHLO vml000080.dmz.nausch.org
<-  250-mx1.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250 SMTPUTF8
 -> STARTTLS
<-  220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
=== TLS no local certificate set
=== TLS peer DN="/OU=Domain Control Validated/CN=*.nausch.org"
 ~> EHLO vml000080.dmz.nausch.org
<~  250-mx1.nausch.org
<~  250-PIPELINING
<~  250-SIZE 52428800
<~  250-ETRN
<~  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-ENHANCEDSTATUSCODES
<~  250-8BITMIME
<~  250-DSN
<~  250 SMTPUTF8
 ~> AUTH PLAIN AG1pY2hhZWxAbmF1c2NoLm9yZwBEQXgxZDEzZzMxbDM1NHUh
<~  235 2.7.0 Authentication successful
 ~> MAIL FROM:<michael@nausch.org>
<~  250 2.1.0 Ok
 ~> RCPT TO:<django@nausch.org>
<~  250 2.1.5 Ok
 ~> DATA
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Sun, 10 Feb 2019 09:40:26 +0100
 ~> To: django@nausch.org
 ~> From: michael@nausch.org
 ~> Subject: test Sun, 10 Feb 2019 09:40:26 +0100
 ~> Message-Id: <20190210094026.027182@vml000080.dmz.nausch.org>
 ~> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
 ~> X-Test: test email
 ~> 
 ~> This is a test mailing
 ~> 
 ~> .
<~  250 2.0.0 Ok: queued as 0F3B560008B
 ~> QUIT
<~  221 2.0.0 Bye
=== Connection closed with remote host.

Im Maillog wird die erfolgreiche Authentifizierung und die weitere Verarbeitung unserer Mail entsprechend dokumentiert.

 # less /var/log/maillog
Feb 10 09:40:35 vml000080 postfix/submission/smtpd[27183]: connect from vml000080.dmz.nausch.org[10.0.0.80]
Feb 10 09:40:36 vml000080 postfix/submission/smtpd[27183]: Anonymous TLS connection established from vml000080.dmz.nausch.org[10.0.0.80]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Feb 10 09:40:36 vml000080 postfix/submission/smtpd[27183]: 0F3B560008B: client=vml000080.dmz.nausch.org[10.0.0.80], sasl_method=PLAIN, sasl_username=michael@nausch.org
Feb 10 09:40:36 vml000080 postfix/cleanup[27187]: 0F3B560008B: message-id=<20190210094026.027182@vml000080.dmz.nausch.org>
Feb 10 09:40:36 vml000080 postfix/qmgr[26334]: 0F3B560008B: from=<michael@nausch.org>, size=527, nrcpt=1 (queue active)
Feb 10 09:40:36 vml000080 postfix/submission/smtpd[27183]: disconnect from vml000080.dmz.nausch.org[10.0.0.80] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8

LOGIN

Als nächstes testen wir die Variante LOGIN - hier wird im Gegensatz zum vorheringen Auth-Mechanismus PLAIN die Anmeldekennung und das zugehörige Passwort zusammen in einem String sondern separat übergeben.

 # swaks --to django@nausch.org --from michael@nausch.org --auth PLAIN --auth-user michael@nausch.org --protocol ESMTPS \\
         --header-X-Test "test email" --server 10.0.0.80:587
Password: DAx1d13g31l354u!
=== Trying 10.0.0.80:587...
=== Connected to 10.0.0.80.
<-  220 mx1.nausch.org ESMTP Postfix
 -> EHLO vml000080.dmz.nausch.org
<-  250-mx1.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250 SMTPUTF8
 -> STARTTLS
<-  220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
=== TLS no local certificate set
=== TLS peer DN="/OU=Domain Control Validated/CN=*.nausch.org"
 ~> EHLO vml000080.dmz.nausch.org
<~  250-mx1.nausch.org
<~  250-PIPELINING
<~  250-SIZE 52428800
<~  250-ETRN
<~  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-ENHANCEDSTATUSCODES
<~  250-8BITMIME
<~  250-DSN
<~  250 SMTPUTF8
 ~> AUTH LOGIN
<~  334 VXNlcm5hbWU6
 ~> bWljaGFlbEBuYXVzY2gub3Jn
<~  334 UGFzc3dvcmQ6
 ~> REF4MWQxM2czMWwzNTR1IQ==
<~  235 2.7.0 Authentication successful
 ~> MAIL FROM:<michael@nausch.org>
<~  250 2.1.0 Ok
 ~> RCPT TO:<django@nausch.org>
<~  250 2.1.5 Ok
 ~> DATA
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Sun, 10 Feb 2019 10:02:32 +0100
 ~> To: django@nausch.org
 ~> From: michael@nausch.org
 ~> Subject: test Sun, 10 Feb 2019 10:02:32 +0100
 ~> Message-Id: <20190210100232.027213@vml000080.dmz.nausch.org>
 ~> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
 ~> X-Test: test email
 ~> 
 ~> This is a test mailing
 ~> 
 ~> .
<~  250 2.0.0 Ok: queued as 27AC960008B
 ~> QUIT
<~  221 2.0.0 Bye
=== Connection closed with remote host.

Im Maillog wird die erfolgreiche Authentifizierung und die weitere Verarbeitung unserer Mail entsprechend dokumentiert.

 # less /var/log/maillog
Feb 10 10:02:39 vml000080 postfix/submission/smtpd[27214]: connect from vml000080.dmz.nausch.org[10.0.0.80]
Feb 10 10:02:39 vml000080 postfix/submission/smtpd[27214]: Anonymous TLS connection established from vml000080.dmz.nausch.org[10.0.0.80]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Feb 10 10:02:39 vml000080 postfix/submission/smtpd[27214]: 27AC960008B: client=vml000080.dmz.nausch.org[10.0.0.80], sasl_method=LOGIN, sasl_username=michael@nausch.org
Feb 10 10:02:39 vml000080 postfix/cleanup[27218]: 27AC960008B: message-id=<20190210100232.027213@vml000080.dmz.nausch.org>
Feb 10 10:02:39 vml000080 postfix/qmgr[26334]: 27AC960008B: from=<michael@nausch.org>, size=527, nrcpt=1 (queue active)
Feb 10 10:02:39 vml000080 postfix/submission/smtpd[27214]: disconnect from vml000080.dmz.nausch.org[10.0.0.80] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8
Feb 10 10:02:40 vml000080 postfix/smtp[27221]: 27AC960008B: to=<django@nausch.org>, relay=10.0.0.67[10.0.0.67]:10024, delay=0.86, delays=0.03/0.03/0.01/0.8, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[10.0.0.87]:10025): 250 2.0.0 Ok: queued as F078AC0008A)
Feb 10 10:02:40 vml000080 postfix/qmgr[26334]: 27AC960008B: removed

DIGEST-MD5

Als nächstes testen wir die Variante DIGEST-MD5 - hier wird im Gegensatz zu den beiden vorherigen Varianten nicht mehr der Anmeldenamen und das Passwort BASE64 kodiert übertragen, sondern ein mit einem Einmalhashwert codiert übertragen.

 # swaks --to django@nausch.org --from michael@nausch.org --auth DIGEST-MD5 --auth-user michael@nausch.org --protocol ESMTPS \\
         --header-X-Test "test email" --server 10.0.0.80:587
Password: DAx1d13g31l354u!
=== Trying 10.0.0.80:587...
=== Connected to 10.0.0.80.
<-  220 mx1.nausch.org ESMTP Postfix
 -> EHLO vml000080.dmz.nausch.org
<-  250-mx1.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250 SMTPUTF8
 -> STARTTLS
<-  220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
=== TLS no local certificate set
=== TLS peer DN="/OU=Domain Control Validated/CN=*.nausch.org"
 ~> EHLO vml000080.dmz.nausch.org
<~  250-mx1.nausch.org
<~  250-PIPELINING
<~  250-SIZE 52428800
<~  250-ETRN
<~  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-ENHANCEDSTATUSCODES
<~  250-8BITMIME
<~  250-DSN
<~  250 SMTPUTF8
 ~> AUTH DIGEST-MD5
<~  334 cmVhbG09IiIsbm9uYGYtOCIsYWx2U9Inh0MUNJbmlwR0VNamNySmN2NndO9wPSJhdXRoIixjaGFyc2V0PSJ1dnb3JpdGhtPSJtZDUtc2dXc9PSIscWVzcyI=
 ~> Y2hhcnNldD11dm9uY2U9IjgGYtOCxjbwNzJkMTcwNDMxYTlkODkwMGE4Yjk5ZDdhNDQ5YjY4IixkaWtdXJpPSJzbXRwLdlc3QzEwLjAuMC44MCIsbmM9MDAwMDAwMDEsbm9uY2U9Inh0MUNJbmlwR0VNdOdXc9PSIscW9wPWF1dGgscmVhbG09IiIscmVzcG9uc2U9M2U2MTJhODc5MTgzZjNiZmRhYTdkY2EyMzZkNTdhZDYsdXNlcm5hbWU9Im1pY2hhZWxAbmF1c2NoLm9yZyamNySmN2NnI=
<~  334 cYXV0anNwD0zMWE1ZDQzMWQwOTMjUzMJiYTU2ZjcwjcyZDIzMjg0Yg==
 ~> 
<~  235 2.7.0 Authentication successful
 ~> MAIL FROM:<michael@nausch.org>
<~  250 2.1.0 Ok
 ~> RCPT TO:<django@nausch.org>
<~  250 2.1.5 Ok
 ~> DATA
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Sun, 10 Feb 2019 10:11:45 +0100
 ~> To: django@nausch.org
 ~> From: michael@nausch.org
 ~> Subject: test Sun, 10 Feb 2019 10:11:45 +0100
 ~> Message-Id: <20190210101145.027224@vml000080.dmz.nausch.org>
 ~> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
 ~> X-Test: test email
 ~> 
 ~> This is a test mailing
 ~> 
 ~> .
<~  250 2.0.0 Ok: queued as 4EC6160008B
 ~> QUIT
<~  221 2.0.0 Bye
=== Connection closed with remote host.

Im Maillog wird die erfolgreiche Authentifizierung und die weitere Verarbeitung unserer Mail entsprechend dokumentiert.

 # less /var/log/maillog
Feb 10 10:11:51 vml000080 postfix/submission/smtpd[27226]: connect from vml000080.dmz.nausch.org[10.0.0.80]
Feb 10 10:11:51 vml000080 postfix/submission/smtpd[27226]: Anonymous TLS connection established from vml000080.dmz.nausch.org[10.0.0.80]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Feb 10 10:11:51 vml000080 postfix/submission/smtpd[27226]: 4EC6160008B: client=vml000080.dmz.nausch.org[10.0.0.80], sasl_method=DIGEST-MD5, sasl_username=michael@nausch.org
Feb 10 10:11:51 vml000080 postfix/cleanup[27230]: 4EC6160008B: message-id=<20190210101145.027224@vml000080.dmz.nausch.org>
Feb 10 10:11:51 vml000080 postfix/qmgr[26334]: 4EC6160008B: from=<michael@nausch.org>, size=527, nrcpt=1 (queue active)
Feb 10 10:11:51 vml000080 postfix/submission/smtpd[27226]: disconnect from vml000080.dmz.nausch.org[10.0.0.80] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8

CRAM-MD5

Nun testen wir die Variante CRAM-MD5 einem Authentifizierungsverfahren nach dem Challenge-Response-Prinzip auf der Basis des MD5-HMAC-Algorithmus.

 # swaks --to django@nausch.org --from michael@nausch.org --auth PLAIN --auth-user michael@nausch.org --protocol ESMTPS \\
         --header-X-Test "test email" --server 10.0.0.80:587
Password: DAx1d13g31l354u!
=== Trying 10.0.0.80:587...
=== Connected to 10.0.0.80.
<-  220 mx1.nausch.org ESMTP Postfix
 -> EHLO vml000080.dmz.nausch.org
<-  250-mx1.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250 SMTPUTF8
 -> STARTTLS
<-  220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
=== TLS no local certificate set
=== TLS peer DN="/OU=Domain Control Validated/CN=*.nausch.org"
 ~> EHLO vml000080.dmz.nausch.org
<~  250-mx1.nausch.org
<~  250-PIPELINING
<~  250-SIZE 52428800
<~  250-ETRN
<~  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-ENHANCEDSTATUSCODES
<~  250-8BITMIME
<~  250-DSN
<~  250 SMTPUTF8
 ~> AUTH CRAM-MD5
<~  334 PDk1MDgTcywMzE4OMTkzMjIuMTU0B2bWwwMDAwNzcuZG16Lm0OTc5MDUyM5hdXNjaC5vcmc+
 ~> bGFlbEWljaBuYXVzY2gub3JnIGI2ZhODEyNmJlODY4MDM2YTZmY2YTM1OGQyMzJmNWFk
<~  235 2.7.0 Authentication successful
 ~> MAIL FROM:<michael@nausch.org>
<~  250 2.1.0 Ok
 ~> RCPT TO:<django@nausch.org>
<~  250 2.1.5 Ok
 ~> DATA
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Sun, 10 Feb 2019 10:21:54 +0100
 ~> To: django@nausch.org
 ~> From: michael@nausch.org
 ~> Subject: test Sun, 10 Feb 2019 10:21:54 +0100
 ~> Message-Id: <20190210102154.027237@vml000080.dmz.nausch.org>
 ~> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
 ~> X-Test: test email
 ~> 
 ~> This is a test mailing
 ~> 
 ~> .
<~  250 2.0.0 Ok: queued as 5F28060008B
 ~> QUIT
<~  221 2.0.0 Bye
=== Connection closed with remote host.

Im Maillog wird die erfolgreiche Authentifizierung und die weitere Verarbeitung unserer Mail entsprechend dokumentiert.

 # less /var/log/maillog
Feb 10 10:22:03 vml000080 postfix/submission/smtpd[27238]: connect from vml000080.dmz.nausch.org[10.0.0.80]
Feb 10 10:22:03 vml000080 postfix/submission/smtpd[27238]: Anonymous TLS connection established from vml000080.dmz.nausch.org[10.0.0.80]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Feb 10 10:22:03 vml000080 postfix/submission/smtpd[27238]: 5F28060008B: client=vml000080.dmz.nausch.org[10.0.0.80], sasl_method=CRAM-MD5, sasl_username=michael@nausch.org
Feb 10 10:22:03 vml000080 postfix/cleanup[27242]: 5F28060008B: message-id=<20190210102154.027237@vml000080.dmz.nausch.org>
Feb 10 10:22:03 vml000080 postfix/qmgr[26334]: 5F28060008B: from=<michael@nausch.org>, size=527, nrcpt=1 (queue active)
Feb 10 10:22:03 vml000080 postfix/submission/smtpd[27238]: disconnect from vml000080.dmz.nausch.org[10.0.0.80] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8

NTLM

Zu guter Letzt testen wir nun noch die Variante NTLM einer weiteren Variante nach dem Challenge-Response-Verfahren.

 # swaks --to django@nausch.org --from michael@nausch.org --auth NTLM --auth-user michael@nausch.org --protocol ESMTPS \\
         --header-X-Test "test email" --server 10.0.0.80:587
Password: DAx1d13g31l354u!
=== Trying 10.0.0.80:587...
=== Connected to 10.0.0.80.
<-  220 mx1.nausch.org ESMTP Postfix
 -> EHLO vml000080.dmz.nausch.org
<-  250-mx1.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250-DSN
<-  250 SMTPUTF8
 -> STARTTLS
<-  220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256
=== TLS no local certificate set
=== TLS peer DN="/OU=Domain Control Validated/CN=*.nausch.org"
 ~> EHLO vml000080.dmz.nausch.org
<~  250-mx1.nausch.org
<~  250-PIPELINING
<~  250-SIZE 52428800
<~  250-ETRN
<~  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5 NTLM
<~  250-ENHANCEDSTATUSCODES
<~  250-8BITMIME
<~  250-DSN
<~  250 SMTPUTF8
 ~> AUTH NTLM
<~  334 
 ~> TlNTUAABAARMTVAAB6IAAAAAAAAAAAAAAAAAAAAAAAA=
<~  334 TlRMTVNTAAMAAUAACAAwADAAAAAFAoIA5Q0rDZLB/vMAAAAAgAAAAdgBtAAAAAADgAOABGwAMAAwADAAMAA3ADcALgBkAG0AegAuAG4AYQB1AHMAYwBoAC4AbwByAGcAAwAwAHYAAMAAwbQBsADAADAANwA3AC4AZABtAHoALgBuAGEAdQBzAGMAaAAuAG8AcgBnAAAAAAA=
 ~> TlRMTVNTUAAYAEAADAAAAGAAAAAYABgAWAAAADAAMABwAAAAJAAkAKAAAAAkACQAxAAAAAAAAACoAAAABJSaXkYUsXiQKCAMmxYEq5Ym+GwRwCtYI1znaLYKVgk5jYxd5ICe6NxyXV0+t2oEFNVuxwA3AC4AZABHYAbQBsADAAMAAwADAANtAHoALgBuAGEAdQBzAGMAaAAuAG8AcgBnAG0AaQBjAGgAYQBlAGwAQABuAGEAdQBz8AcgBnAG0AaQBjAGgAYQBlAGwAQABuAGEAdQBzAGMAaAAuAG8AcgBAGMAaAAuAGnAA==
<~  235 2.7.0 Authentication successful
 ~> MAIL FROM:<michael@nausch.org>
<~  250 2.1.0 Ok
 ~> RCPT TO:<django@nausch.org>
<~  250 2.1.5 Ok
 ~> DATA
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Sun, 10 Feb 2019 10:29:20 +0100
 ~> To: django@nausch.org
 ~> From: michael@nausch.org
 ~> Subject: test Sun, 10 Feb 2019 10:29:20 +0100
 ~> Message-Id: <20190210102920.027248@vml000080.dmz.nausch.org>
 ~> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
 ~> X-Test: test email
 ~> 
 ~> This is a test mailing
 ~> 
 ~> .
<~  250 2.0.0 Ok: queued as 5BB7E60008B
 ~> QUIT
<~  221 2.0.0 Bye
=== Connection closed with remote host.

Auch dieser erfolgreiche Vebindungsaufbau wird im Maillog entsprechend protokolliert.

 # less /var/log/maillog
Feb 10 10:29:27 vml000080 postfix/submission/smtpd[27250]: connect from vml000080.dmz.nausch.org[10.0.0.80]
Feb 10 10:29:27 vml000080 postfix/submission/smtpd[27250]: Anonymous TLS connection established from vml000080.dmz.nausch.org[10.0.0.80]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
Feb 10 10:29:27 vml000080 postfix/submission/smtpd[27250]: 5BB7E60008B: client=vml000080.dmz.nausch.org[10.0.0.80], sasl_method=NTLM, sasl_username=michael@nausch.org
Feb 10 10:29:27 vml000080 postfix/cleanup[27254]: 5BB7E60008B: message-id=<20190210102920.027248@vml000080.dmz.nausch.org>
Feb 10 10:29:27 vml000080 postfix/qmgr[26334]: 5BB7E60008B: from=<michael@nausch.org>, size=527, nrcpt=1 (queue active)
Feb 10 10:29:27 vml000080 postfix/submission/smtpd[27250]: disconnect from vml000080.dmz.nausch.org[10.0.0.80] ehlo=2 starttls=1 auth=1 mail=1 rcpt=1 data=1 quit=1 commands=8

Links

1)
SMTP-Authentication
2)
Simple Authentication and Security Layer
3)
Mail User Agent