OpenBSD MTA client setup mit sendmail und cyrus-sasl2 (SMTP-AUTH)

lantis

Sascha Retzki
Zielgruppe:
Du bist ein Mensch, der pine, evolution oder aehnliches nicht mag. Der gerne einen MTA hat, einen MDA und einen MUA? Du magst evtl mutt oder bsd-mail, und willst soviel aus der base verwenden wie irgend möglich. Hier ist dein MTA-setup, wenn du dich per SMTP-AUTH bei einen smarthost (smtp relay) authentifizieren willst (musst), wie z.b. von gmail, gmx, und andere Angeboten.

Versionen und andere Eckdaten:
OpenBSD 3.7
cyrus-sasl 2.1.20p3 (aus de ports, security/cyrus-sasl2/)
sendmail aus base. Man muss das gute Stück neu kompilieren, also braucht man auch die Quellen.


Was hier nicht besprochen wird:
MDA und MUA setups jeglicher Art. Ein paar googlewords: entweder du nimmst mutt (z.b. wenn du deine mails von POP3 abhohlst ist der prima) oder du nimmst fetchmail/procmail und als MUA bsd-mail (oder was anderes, oder mutt).

Vorgehen:
1.) Zunächst braucht unser sendmail SASL support. Also erstmal ports/security/cyrus-sasl2 installieren. Es gibt versch. flavors, wir nehmen "das normale" was vollkommen Ausreichend ist. Das binärpacket sollte auch tun.


Dann laden wir uns den src.tar.gz unserer openbsd version runter, mkdir /usr/src, mv src.tar.gz /usr/src und entpacken. (Ganz tolle Geschichte nebenbei: Ich komme von NetBSD, und bin es gewöhnt das tarbälle sich selbst ein subdir anlegen, und entpackte die quellen in /usr, was problematisch ist, wenn die hälfte deiner lib*/ sachen mit anderem Zeugs überschrieben werden ;) ).
Wir werden nun nur sendmail neu kompilieren, und dessen Dependencies natürlich. "Es" befindet sich in gnu/usr.sbin/sendmail. Vorher müssen wir sagen, das wir sasl haben wollen, dazu gibt es angenehmerweise eine make-direktive, also schreiben wir in /etc/mk.conf:
Code:
WANT_SMTPAUTH=yes
Dann ein beherztes "make && make install clean" in oben besagtem dir. Als root, selbstredent. Anders als bei der Installation von MTAs aus dem Packetverwaltungssystem brauchen wir nicht mit dem Mailwrapper (/etc/mailer.conf) spielen, da wir das originale sendmail überschreiben werden (/usr/libexec/sendmail/sendmail).

Ich persönlich musste dann noch die Gruppe der sendmail-executable auf smmsp setzen und sie group-setuid setzen:
Code:
chgrp smmsp /usr/libexec/sendmail/sendmail
chmod g+s /usr/libexec/sendmail/sendmail
ls -l /usr/libexec/sendmail/sendmail
-r-xr-sr-x  1 root smmsp  623332 May 26 20:39 sendmail
Das ist notwendig, sodaß auch user in TrustedUsers das ding überhaupt ausführen dürfen. (Kommt gleich)


2.) Wir konfigurieren nun erstmal sendmail. Wer sendmail so noch nicht kennt, "es" verwendet m4 (eine Art sprache ;) ) für die Konfiguration. Wir legen in /etc/mail/ mal so eine Datei an (hier: myconf.mc):
Code:
include(`/usr/share/sendmail/m4/cf.m4')
OSTYPE(`bsd4.4')
define(`SMART_HOST',`mail.myprovider.net')
define(`confAUTH_MECHANISMS'.`DIGEST-MD5 CRAM-MD5')
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5')
dnl Dies ist ein Kommentar.
dnl Folgendes ist optional. Es wird festgelegt welche user ihre FROM: line ändern dürfen oder anderweitig previligiert sind:
define(`confTRUSTED_USERS',`dewd foo bar')
define(`confTRUSTED_USER',`dewd bar')
FEATURE(`use_ct_file')
dnl Jetzt wirds wieder nicht-optional
FEATURE(`authinfo,`hash /etc/mail/client-info.db')
MAILER(`smtp')

Übersetzt werden solche "mc" Dateien dann mit m4 im Stile von:
Code:
m4 myconfig.mc >submit.cf
OpenBSD hat drei .cf dateien in /etc/mail, Ich kenne es mit zwei. Kurze erklärung ist, das die Dateien abhängig davon benutzt werden, wie sendmail aufgerufen wurde. Wenn du *immer* über deinen relay verschicken willst, dann kannst du einfach die beiden anderen symlinken, e.g.:
Code:
rm sendmail.cf localhost.cf
ln -sf submit.cf sendmail.cf
ln -sf submit.cf localhost.cf


Meine config hat noch ein paar kleine andere Sachen, aber imho sollte das so funktionieren. Wenn nicht => post it, baby.

Natürlich muss der SMART_HOST auf euren server-namen angepasst werden. Wenn es MX-probleme gibt, also das ihr z.b. über mail.m00.org relayen *müsst*, aber der Server eigentlich mail.m00net.org heißt oder was weiß ich, setzt den hostnamen einfach in eckige klammern. [mail.m00.org]

Eine Datei namens /etc/mail/trusted-users ( feature use_ct_file, war optional) möge auch eine Liste von Benutzern beinhalten. Wie gesagt, optional.

Wenn euer lokaler Username von eurem remote abweicht (und das passiert recht schnell weil diese <censored> es toll finden "bla@m00.org" als usernamen zu verwenden) so verwendet man dafür die genericstable-datei.
Code:
foo    bar@m00.org
Nun wollen wir unsere login-daten Spezifizieren. In die client-info (oben steht .db, ich weiß. machen wir gleich. Die Datei heißt "client-info" und nicht "client-info.db"):
Code:
AuthInfo:mail.m00.org "U:f00" "I:bar@m00.org" "P:leetpasswd" "M:DIGEST-MD5 CRAM-MD5"
Der M-part ist optional, iirc.
Nun müssen wir die genericstable in ein genericstable.db format übertragen, dasselbe gilt für unsere client-info.
OpenBSD hat eine Makefile für soetwas, aber es gibt zwei probleme: 1.) Die Makefile weiß nichts von unserer client-info datei (ich glaube traditionel heißt die auch anders :P) und 2.) Man fühlt sich sowieso nicht männlich genug wenn man nur make eintippert.
Code:
makemap hash genericstable <genericstable
makemap hash client-info <client-info
Nun solltest du auch eine client-info.db sehen. Wenn nicht => antwort-post.


3.)
Cyrus-Sasl konfigurieren unser nächster Schritt ist. Eigentlich sollte es ausreichen, in dem Verzeichnis, wo die sasl2/ -libraries sind, namentlich $prefix/lib/sasl2/ oder absolut /usr/local/lib/sasl2/ , eine Datei namens Sendmail.conf anzulegen:
Code:
pwcheck_method: getpwent
mech_list: LOGIN PLAIN DIGEST-MD5 CRAM-MD5
minimum_layer: 55
getpwent (ihr habt ne manpage dafür) ist die native unix/bsd methode der (lokalen) Password-authentifizierung, also das was login(1) und co auch verwenden.
Aufmerksamen Lesern mag evtl ins Gesicht springen, das ich überall explizit auf *-MD5 algos gestellt hatte, aber hier auch noch die (unsicheren) LOGIN PLAIN "algorithmen" mit reinnehme: Das ist richtig. Als ich heute morgen aufhörte zu denken, packte ich diese mit hinein, und *puff*: Es funktionierte. Davor hatte ich Einträge wie "no mechs found" oder "no mechs suitable" oder so (syslog). Kommt noch. Da allerdings in Zeile Drei gesagt wird, das algorithmen die unter einer SFS (weiß gar nimmer ob das wirklich so hieß bzw was es hieß ;) .. man denke sich eine Art Zahl die Aussagt wie stark/gut der algo ist) von (hier:) 55 liegen als unsicher anzusehen sind. *-MD5 hat 128. Wer nen SSL-Tunnel baut und mit EXTERNAL arbeitet hat iirc 512. Aber wird hier eher nicht der fall sein ;) .

4.) Troubleshooting und Testing.
Ich lege jedem Nahe zu lernen wie man mit sendmail testmails verwendet; Wenn man den $MUA_of_choice verwendet hat man zwei mögliche Probleme. 1.) Mag dieser nicht so gesprächig sein (mutt ist da ein kandidat, er sagt *immer* "Mail sent") und 2.) Man ist wie ich so schön zu sagen pflege evtl "fucked by frontend", will heißen, man hat einen weiteren layer draufgepackt, und hat evtl Probleme des MUAs und macht den MTA verantwortlich oder was-weiß-ich.
Man versende an sich selbst oder einen zweiten Account via:
Code:
$ sendmail -v lantis@second_mail.org
der text der in der mail steht, abgeschlossen durch einen
.
Nun fängt sendmail an zu senden. Sachen die sendmail sendet sollten mit ">>> " prefixed sein. Nach einen EHLO <bla>, STARTTLS und einem zweiten EHLO sollte er "AUTH CRAM-MD5" oder ähnliches schreiben. Wenn nicht: logs checken. es gibt unter OpenBSD by default
Code:
/var/log/maillog 
/var/log/authlog
Wenn alles glattläuft seht ihr allerdings ne Menge Buchstaben, dann
Code:
 235 "go ahead"
>>> MAIL FROM: bar@m00.org AUTH=bar@m00.org"
250 "ok"
>>> RCPT To testmail@m00.org
250 "ok"
>>> DATA"
354 "go ahead"
>>> .
250 Message accepted

5.) Klassiker
- Sendmail will einen FQDN. Mit dynamischer IP wird das schwer. Man trage "mein_hostname.local" in die /etc/hosts ein, falls sendmail soetwas sagt wie "my unqualified hostname bla could not be resolved" oder so. Eigentlich reicht es hinter den lokalen namen in der hosts-datei einen Punkt zu machen...

6.) Anderes OS, andere Karten?
Ja. Z.B. NetBSD (da offiziell aus den USA komment) wird kein SSL haben, welches für STARTTLS gebraucht wird.
Die logfiles mögen anders sein, aber sich mit syslog auseinanderzu setzen hat noch keinem geschadet ;)
Die grobe Richtung wird allerdings diesselbe sein.
 
Zuletzt bearbeitet:

lantis

Sascha Retzki
Ein paar zusätzliche Sachen:
Der oben beschriebene Weg sendmail mit sasl-support zu übersetzen ist praktisch total OpenBSD-spezifisch. Nimm dir deine $suchmaschine an der Hand - Weidmansheil ;). http://www.sendmail.org/ hat auch Informationen.

Etwas sehr wichtiges für die Troubleshooting sache:
Wenn ihr SSL/STARTTLS support drin habt (was bei OpenBSD z.b. dann der Fall ist) und die config sagt "benutz aber smtp auth", *oder* wenn cyrus-sasl simpel gesagt falsch configuriert ist, dann mag sich soetwas zutragen:

Code:
>>> EHLO localhost
250-nen paar messages vom server
>>> STARTTLS
220 ready to start tls
>>> EHLO
250'iger
>>> QUIT

Nach dem QUIT kann sendmail sich überlegen zu sagen: "deferred: Temporary AUTH failure". Eure testmail ist dann in /var/spool/mqueue/, und ein paar nachrichten in den logfiles. In einem solchen Fall ist nicht zwangsläufig sendmail "schuld" (Schuldig im Sinne der bekloppten Fehlermeldung, aber nicht im Sinne eurer möglichen Anklage). Guckt also auch noch nach sasl.

So far, cu
 

tiCo

Mario Iseli
fehler beim öffnen des queue

Hallo, danke für dein Howto, hab sowas schon längers gesucht-
Ich benutze hier OpenBSD 3.7 auf ner sparcstation 10. hab das sendmail neu "gebacken" so wie bei dir geschrieben. als root funktioniert das wunderbar, so weit so gut, wenn ich es als normalen user (IST in der trusted-users DRIN!!) starten will krieg ich folgenden error:

can not chdir(/var/spool/mqueue/): Permission denied
Program mode requires special privileges, e.g., root or TrustedUser.

kannst du mir sagen was da genau los ist? scheint ja irgend ein chroot problem zu sein :confused:

Wäre für deine (oder auch von andern) Hilfe sehr dankbar!

tiCo
 

lantis

Sascha Retzki
tiCo schrieb:
...wenn ich es als normalen user (IST in der trusted-users DRIN!!) starten will krieg ich folgenden error:

can not chdir(/var/spool/mqueue/): Permission denied
Program mode requires special privileges, e.g., root or TrustedUser.

Hm, vorab: poste mal deine sendmail-config file.

Wie ist die Permission von /var/spool/mqueue/?

Es gibt btw zwei "trusted-user" varianten, bzw einmal TrustedUsers und TrustedUser, ich weiß nimmer welches welches war, schau mal bei /usr/share/sendmail/README (?) nach, was die beiden Direktiven bedeuten.
Sry das es so knapp ist, aber ist lang lang her, und ich habe atm kein sendmail hier, was ich "testen" könnte, also muss ichs ausm Gedächtnis versuchen (mach ich aber trotzdem ;-))

tiCo schrieb:
kannst du mir sagen was da genau los ist? scheint ja irgend ein chroot problem zu sein :confused:

chroot? :)
 
Oben