Dies ist eine alte Version des Dokuments!


SASL-Authentifizierung beim Postfix MTA 2.11 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 verschiede 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 sind.

Beide Lösungen sind vom Grundsatz her gleich aufgebaut - liegt doch beiden folgende Struktur zu Grunde. <uml width=300 center title=„Die 3 SASLayer“>

skinparam defaultFontName Courier
state "Client" as request
request :   request 
state "SASL-Layer" as layer {
  state "Authentication Interface" as auth_int 
  state "Mechanismen" as mech 
  state "Methoden / Password Verification Services" as method 
  }
request -right-> auth_int
auth_int -down-> mech
mech -up-> auth_int
mech --> method
method --> mech

</uml>

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

  • Authentication Interface: Hauptaufgabe des Authentication Interfaces ist es, dem Client mitzuteilen, ob Authentifizierung angeboten wird und wenn ja, welche Mechanismen dabei genutzt werden können.
  • Mechanismen: Ein Mechanismus definiert, welche Daten zur Authentifizierung benötigt werden, z.B. Usernamen und Passwort oder z.B. ein Clientzertifikat und wie die Anmeldedaten übermittelt oder transportiert werden müssen (z.B. TLS transportverschlüsselt).
  • Methoden / Password Verification Service: Dies ist die eigentliche Kernfunktion von SASL, führen diese doch die eigentliche Überprüfung der der Anmeldedaten am Authentication-Backend (z.B. /etc/passwd, LDAP oder mySQL) durch. Der unterschied zwischen den Methoden und den Password Verification Services ist, dass bei den Methoden die benötigten Funktionen in einer Art plugin nachgeladen werden und bei den Password Verification Services dies durch eigenständige (Unter-)Programmteile realisiert wird.

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

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 nocheinmal 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.

<uml width=900 center title=„SASL-Implementierung mit Hilfe der Cyrus SASL Library“>

skinparam defaultFontName Courier

state MUA as „Mail-Client des Absenders“ {

state "SASL Request" as request
request : Der Mail-User-Agent "MUA" will
request : sich authentifizieren, da er 
request : eine eMail an einen externen
request : Empfänger senden will. (relaying)

}

state "SASL-Layer" as layer {
  state "Authentication Interface" as auth_int {
    state "SMTP-Daemon" as smtpd
    smtpd : Annahme der ankommenden Verbindung
    smtpd : sowie Durchführung der Authentifizierung
    smtpd : und ggf. Annahme der Nachricht 
  }
  state "Mechanismen" as mech 
  mech : PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM
  state "Methoden / Password Verification Services" as method 
  }

state „mySQL Datenbank“ as mysql

mysql : postfix-admin  
mysql : Datenbanktabelle
request -right-> smtpd
auth_int -down-> mech
mech -up-> auth_int
mech --> method
method --> mech
method -down-> mysql
mysql -up-> method

note left of layer

/etc/sysconfig/saslauthd
├── SOCKETDIR=/run/saslauthd
├── MECH=pam
└── FLAGS=

end note

note right of mech

/etc/sasl2/smtpd.conf
└── mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM

end note

note right of method

/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

end note

note right of smtpd

/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

end note

</uml>

 # systemctl reload postfix
 # telnet ::1 25
Trying ::1...
Connected to ::1.
Escape character is '^]'.
220 mx01.nausch.org ESMTP Postfix
EHLO foo
250-mx01.nausch.org
250-PIPELINING
250-SIZE 52428800
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-ENHANCEDSTATUSCODES
250 8BITMIME
quit
221 2.0.0 Bye
Connection closed by foreign host.
 # swaks --to django@nausch.org --from michael@nausch.org --auth CRAM-MD5 --auth-user michael@nausch.org --header-X-Test "test email" --server 10.0.0.87
 Password: DAx1d13g31l354u!
=== Trying 10.0.0.87:25...
=== Connected to 10.0.0.87.
<-  220 mx01.nausch.org ESMTP Postfix
 -> EHLO vml000087.dmz.nausch.org
<-  250-mx01.nausch.org
<-  250-PIPELINING
<-  250-SIZE 52428800
<-  250-ETRN
<-  250-STARTTLS
<-  250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
<-  250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
<-  250-ENHANCEDSTATUSCODES
<-  250-8BITMIME
<-  250 DSN
 -> AUTH CRAM-MD5
<-  334 PDk2Mjk5MjQ4Njc5ODA2FucKMzQuMTQxNxNzE1M0B2bWwMAwNzcuZG16Lm5hdXNjaC5vcmc+
 -> bWljaGFlbEBuYXVzY2gub3JnIDg5Y0uOTQzNjAyMmM0NWM2NT0NDc2ZGQMzg0ZmI2WVl
<-  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: Mon, 27 Oct 2014 14:39:08 +0100
 -> To: django@nausch.org
 -> From: michael@nausch.org
 -> Subject: test Mon, 27 Oct 2014 14:39:08 +0100
 -> X-Mailer: swaks v20130209.0 jetmore.org/john/code/swaks/
 -> X-Test: test email
 -> 
 -> This is a test mailing
 -> 
 -> .
<-  250 2.0.0 Ok: queued as 02E93C00088
 -> QUIT
<-  221 2.0.0 Bye
=== Connection closed with remote host.
 # less /var/log/maillog
Oct 27 14:39:13 vml000087 postfix/smtpd[23030]: connect from vml000087.dmz.nausch.org[10.0.0.87]
Oct 27 14:39:14 vml000087 postfix/smtpd[23030]: 02E93C00088: client=vml000087.dmz.nausch.org[10.0.0.87], sasl_method=CRAM-MD5, sasl_username=michael@nausch.org
Oct 27 14:39:14 vml000087 postfix/cleanup[23034]: 02E93C00088: message-id=<20141027133914.02E93C00088@mx01.nausch.org>
Oct 27 14:39:14 vml000087 postfix/qmgr[22988]: 02E93C00088: from=<michael@nausch.org>, size=502, nrcpt=1 (queue active)
Oct 27 14:39:14 vml000087 postfix/smtpd[23030]: disconnect from vml000087.dmz.nausch.org[10.0.0.87]
Oct 27 14:39:14 vml000087 postfix/lmtp[23035]: 02E93C00088: to=<django@nausch.org>, relay=10.0.0.77[10.0.0.77]:24, delay=0.27, delays=0.08/0.06/0.04/0.09, dsn=2.0.0, status=sent (250 2.0.0 <django@nausch.org> vCxFCAJLTlTpXAAArK2B9Q Saved)
Oct 27 14:39:14 vml000087 postfix/qmgr[22988]: 02E93C00088: removed
 # firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.0.0.87/32" port protocol="tcp" port="3659" destination address="10.0.0.77/32" accept"
 # firewall-cmd --reload
 # 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.87            10.0.0.77            tcp dpt:3659 ctstate NEW
    0     0 ACCEPT     tcp  --  *      *       10.0.0.87            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

1)
SMTP-Authentication
2)
Simple Authentication and Security Layer
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • centos/mail_c7/mta_8.1414520847.txt.gz
  • Zuletzt geändert: 28.10.2014 18:27.
  • von django