[Postfixbuch-users] Postfix mit SMTP-AUTH klappt nicht.

Marcus Frings iam-est-hora-surgere at despammed.com
Di Mai 23 22:32:42 CEST 2006


* Patrick Ben Koetter <p at state-of-mind.de> wrote:
> * Marcus Frings <iam-est-hora-surgere at despammed.com>:

>> ,----[ /etc/postfix/main.cf ]
>> | # smtpd_sasl_local_domain = $myhostname
>> | smtpd_sasl_local_domain =
>> `----

>> ,----[ /etc/postfix/sasl/smtpd.conf ]
>> | pwcheck_method: auxprop

> Füg mal noch hinzu:
> auxprop_plugin: sasldb

Habe ich gemacht.

>> /etc/sasldb2, nach Erstellen der User-Einträge, habe ich in
>> /var/spool/postfix/etc/ hineinkopiert:

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

>> 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?

>> 2) saslpasswd2 -c -u `postconf -h myhostname` test2

> Hmmm, das ist ja in Deinem Fall NULL

Was meinst Du mit NULL?

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

>> 3) saslpasswd2 -c test3

> Das wird sein, was der HOSTNAME Deines Servers ist.

Und sasldblistusers2 ergibt dann hier:

test3 at mein: userPassword

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

>> ,----[ 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
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)?

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.

> Die Frage ist, ob $myhostname == HOSTNAME ist...

,----
| postconf -h myhostname
| mein.example.net
| 
| echo $HOSTNAME
| mein
`----

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?

,----[ 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 =
`----

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?

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

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?

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.

Gruß,
Marcus
-- 
Zapp Brannigan: "Leela, I didn't know where else to turn. You're the only woman
                 who's ever loved me."
Leela:          "I never loved you."
Zapp Brannigan: "I mean physically."




Mehr Informationen über die Mailingliste Postfixbuch-users