[Postfixbuch-users] Postfix mit SMTP-AUTH klappt nicht.
Patrick Ben Koetter
p at state-of-mind.de
Di Mai 23 23:06:49 CEST 2006
* Marcus Frings <iam-est-hora-surgere at despammed.com>:
> > Hmmm, gefällt mir nicht, das gleich so komplex zu machen. Hast Du es mal ohne
> > den smtpd im chroot zu haben und mit sasldb an der default location probiert?
>
> Es klappt auch, wenn smtpd im chroot läuft und dann die sasldb2 in
> /var/spool/postfix/etc benutzt. Mehr dazu siehe unten.
Gut.
> >> Ich gebe zu, dass mir die ganze Geschichte mit REALM nicht ganz klar
> >> ist, deshalb habe ich testweise drei User auf unterschiedliche Arten
> >> angelegt:
>
> >> 1) saslpasswd2 -c -u `postconf -h myhostname` -a smtpauth test1
>
> > Nee...
>
> Warum nee? Wegen des "-a"-Parameters?
>
Ja. Der Service wäre ein von der IANA (IIRC legt sie das fest, aber Nagel mich
nicht darauf fest...) festgelegter Service-Name. Für SMTP eben "smtp" und
nicht "smtpauth".
> >> 2) saslpasswd2 -c -u `postconf -h myhostname` test2
>
> > Hmmm, das ist ja in Deinem Fall NULL
>
> Was meinst Du mit NULL?
Mein Fehler. Ich hatte "smtpd_sasl_local_domain" gelesen und nicht
"myhostname". $myhostname ergibt natürlich einen Wert. Für
$smtpd_sasl_local_domain hattest Du explizit NULL angegeben.
> Sagen wir mal, $myhostname in main.cf sei "mein.example.net". Dann
> ergibt obiges Kommando laut sasldlistusers2 folgende Ausgabe:
>
> test2 at mein.example.net: userPassword
Ja.
> >> 3) saslpasswd2 -c test3
>
> > Das wird sein, was der HOSTNAME Deines Servers ist.
>
> Und sasldblistusers2 ergibt dann hier:
>
> test3 at mein: userPassword
Hmmm, dann ist HOSTNAME nur die kurzversion Deines FQDN? Oder ist kein FQDN
gesetzt?
> >> Nach erneutem Einlesen der Konfiguration mache ich remote ein telnet auf
> >> den Mailserver und nach Senden des EHLO bekomme ich:
>
> >> ,----
> >> | 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
> >> | 250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
> >> `----
>
> >> Scheint also schon einmal zu funktionieren.
>
> > Kann auch nur zufällig eine Liste aller vier installierten Mechanismen sein.
> > Nimm einen Mech in /etc/postfix/sasl/smtpd.conf raus und wenn Du recht hast,
> > dann fehlt der nach einem Reload bei einem telnet.
>
> Ja, wenn ich etwas rausnehme und die Konfiguration neu einlese, fehlt das
> auch nach einem telnet. Soweit also alles in Ordnung.
Perfekt. Können wir also als Fehlerquelle ausschliessen.
> >> ,----[ mail.info ]
> >> | postfix/smtpd[31516]: smtpd_sasl_authenticate: sasl_method PLAIN, init_response $BASE64-PASSWORT
> >> | postfix/smtpd[31516]: smtpd_sasl_authenticate: decoded initial response test2
>
> > Hier fehlt ein @ und ein REALM...
> > Setz als REALM mal das ein, was Du durch ein sasldblistusers2 als "domain"
> > erhältst und achte beim erstellen des BASE64 Strings darauf, das @ zu escapen.
>
> Okay, habe ich jetzt gemacht (Eintrag 2 oben) und so klappt es auch:
>
> perl -MMIME::Base64 -e 'print encode_base64("test2\@mein.example.net\0test2\@mein.example.net\0passwort");'
>
> Mit dem generierten String kann ich mich mittels AUTH PLAIN anmelden und
Sehr gut!
> bekomme auch ein "235 Authentication successful", und zwar unabhängig
> davon, ob ich "smtpd_sasl_local_domain = $myhostname" oder
> "smtpd_sasl_local_domain =" verwende. Soll das tatsächlich so sein
> (Konfiguration habe ich natürlich zwischenzeitlich neu eingelesen)?
Das liegt daran, dass Postfix den $smtpd_sasl_local_domain nur dann anhängt
wenn der client keinen domainpart gesendet hat. In beiden Fällen hast Du aber
den domainpart mit Deinem Teststring gesendet und so kam
$smtpd_sasl_local_domain nie zur Anwendung...
> Und mit
>
> perl -MMIME::Base64 -e 'print encode_base64("test3\@mein\0test3\@mein\0passwort");'
> (das entspricht ja Eintrag 3 von oben)
>
> und
>
> perl -MMIME::Base64 -e 'print encode_base64("test3\0test3\0passwort");'
>
> funktioniert es wie vorher nicht. Aber das scheint ja auch okay zu sein,
> wenn ich Dich richtig verstanden habe.
Ja, es ist richtig, dass das so nicht klappt.
> > Die Frage ist, ob $myhostname == HOSTNAME ist...
>
> ,----
> | postconf -h myhostname
> | mein.example.net
> |
> | echo $HOSTNAME
> | mein
> `----
Bingo! Da liegt Dein Problem. Lösung kommt weiter unten... ;)
> Das ist doch richtig, oder? Zumindest hat das ja mit dem AUTH PLAIN mit
> Eintrag 2 so oben geklappt.
>
> Okay, mit "test2 at mein.example.net" als User klappt es also, aber wie
> kann ich postfix/sasl nun so konfigurieren, dass ich keinen REALM
> brauche und lediglich den ganz normalen Usernamen + Passwort bei der
> Authentifizierung verwende?
Du musst als $smtpd_sasl_local_domain den Wert setzen, der in der sasldb als
"-u"-Wert eingetragen wurde. Dann sollte es klappen, wenn die clients "nur"
den localpart senden. Postfix wird dann $smtpd_sasl_local_domain als
domainpart mit anhängen...
> ,----[ http://postfix.state-of-mind.de/patrick.koetter/smtpauth/sasldb_configuration.html ]
> | If you set smtpd_sasl_local_domain = $myhostname, then you will always
> | have to submit the REALM that equals $myhostname when you pass the
> | username to SASL.
> |
> | If you don't want to pass a REALM, then you must leave this parameter
> | empty, but still you need to set it:
> |
> | smtpd_sasl_local_domain =
> `----
Mißverständlich. Zeit, dass ich endlich mal dazu komme, es zu überarbeiten...
> Wenn ich diesen Wert leer lasse, sollte der Spaß doch ganz ohne REALM
> funktionieren, aber warum klappt es bei mir nicht wenn ich dann
> lediglich
>
> perl -MMIME::Base64 -e 'print encode_base64("test3\0test3\0passwort");'
>
> nehme?
Nee, weil sasldb eben einen eingetragen hat und erwartet, dass der auch
benutzt wird. Frei nach dem Motto: "Welchen User meinst Du denn? test at mein
oder test at mein.example.net? In meiner DB sind beide..."
> Und dann vorerst noch eine abschließende Frage: Mein lokaler postfix
> soll natürlich mein.example.net als SMTP-Relay mit Authentifizierung
> nutzen. Welchen Mechanismus nimmt der lokale postfix als Default?
Den stärksten und er wird keine plaintext und keine anonymous Mechs benutzen.
Kannst Du selber mit postconf rausfinden.
$ /usr/sbin/postconf -d smtp_sasl_security_options
smtp_sasl_security_options = noplaintext, noanonymous
> Ich habe hier lokal
>
> "smtp_sasl_password_maps = hash:/etc/postfix/smtp_auth"
>
> Nimmt er damit dann automatisch PLAIN oder wovon ist das abhängig? Ich
> werde postfix ohnehin noch TLS beibringen, damit PLAIN eben doch nicht
> im Klartext übertragen wird.
Die SASL library ist für die Wahl des Mechs zuständig. Sie wird immer den
besten (read: sichersten) Mech wählen. Wenn Du CRAM-MD5 und/oder DIGEST-MD5
anbietest, wird sie diese PLAIN oder LOGIN vorziehen.
> Wenn ich dann dem postfix auf mein.example.net TLS beibringe und
> folgendes aktiviere
>
> ,----
> | smtpd_use_tls = yes
> | # smtpd_tls_auth_only = yes
> `----
>
> verwendet mein lokaler Postfix dann automatisch Verschlüsselung bei der
> Übertragung von User+Passwort?
Nein. smtpd_tls_auth_only legt fest, dass der SMTP-Server (!) AUTH nur dann
anbietet, wenn der SMTP client eine TLS-Session etabliert hat.
Wenn du PLAIN und LOGIN nur unter TLS anbieten willst, dann mach folgendes im
SMTP-Server:
smtpd_sasl_security_options = noplaintext, noanonymous
smtpd_tls_sasl_security_options = noanonymous
So werden plaintext Mechanismen nur bei TLS gestattet...
> Durch Auskommentieren von "# smtpd_tls_auth_only = yes" kann ich das
> zwar erzwingen und Klartextübertragung generell verbieten, aber IIRC
> stand geschrieben, dass das Probleme verursachen kann und nicht immer
> empfohlen wird.
Es ist nicht elegant, sagen wir es mal so. Damit bestrafst Du alle Clients,
die bessere Mechanismen wie Shared-Secret- oder Kerberos-Mechanismen
beherrschen. Ich würde es wie oben mit den ..._security_options beschrieben
machen. So müssen nur die Clients, die maue Mechanismen können, gezwungen
"höher zu springen". ;)
p at rick
--
Das Postfix-Buch
<http://www.postfix-buch.com>
saslfinger (debugging SMTP AUTH):
<http://postfix.state-of-mind.de/patrick.koetter/saslfinger/>
Mehr Informationen über die Mailingliste Postfixbuch-users