OpenLDAP, sendmail und aliases

Diesen Beitrag schrieb ich 9 Jahre und 1 Woche zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 2 Minuten

Schema und Index

Bislang hat mein sendmail sich seine Aliase und virtuelle User aus Hash-Datenbanken im Filesystem zusammengeklaubt; wenn nun aber schon ein OpenLDAP am Start ist, sollen auch diese Informationen darin abgelegt werden. Um das zu realisieren muss das sendmail.schema in /etc/ldap/slapd.conf eingebunden werden:

include    /etc/ldap/schema/sendmail.schema

Außerdem wird die Konfiguration um einen weiteren Index erweitert:

index  
  sendmailMTACluster,sendmailMTAHost,sendmailMTAMapName,sendmailMTAKey	eq

Der Übersichtlichkeit halber findest hier meine Version der slapd.conf; und wie bereits im einführenden Artikel beschrieben muss die Konfigurationsdatenbank hernach verworfen und aus der slapd.conf neu erzeugt werden – das Setzen der Dateirechte nicht vergessen. Nun kann der Dienst neu gestartet werden.

Äste in OpenLDAP vorbereiten

sendmail erwartet seine Aliase in sendmailMTAMapName=aliases, und ich beschließe, meine virtuellen User analog hierzu in sendmailMTAMapName=virtuser unterzubringen; diese beiden Äste müssen dementsprechend im OpenLDAP-Baum erzeugt werden, und hierzu dient Sendmail.ldif; die eigentlichen Aliase und virtuellen User werden anschließend wie Blätter an diese Äste angehängt:

# Entry for sendmailMTAMapName=aliases
dn: sendmailMTAMapName=aliases,dc=sysadmama,dc=de
objectclass: sendmailMTA
objectclass: sendmailMTAMap
objectclass: top
sendmailmtacluster: spiller.me
sendmailmtamapname: aliases

# Entry for sendmailMTAMapName=virtuser
dn: sendmailMTAMapName=virtuser,dc=sysadmama,dc=de
objectclass: sendmailMTA
objectclass: sendmailMTAMap
objectclass: top
sendmailmtacluster: spiller.me
sendmailmtamapname: virtuser
$ ldapadd -x -D 'cn=papaschlumpf,dc=sysadmama,dc=de' -W -f Sendmail.ldif
adding new entry "sendmailMTAMapName=aliases,dc=sysadmama,dc=de"
 
adding new entry "sendmailMTAMapName=virtuser,dc=sysadmama,dc=de"

aliases in OpenLDAP einpflegen

Als erstes möchte ich einen Alias für zorro erstellen: Mails an zorro sollen in die Mailbox von User spillerm zugestellt und außerdem an externer_user@example.com weitergeleitet werden.

## Zorro.ldif
dn: sendmailMTAKey=zorro,sendmailMTAMapName=aliases,dc=sysadmama,dc=de
objectclass: sendmailMTA
objectclass: sendmailMTAAlias
objectclass: sendmailMTAAliasObject
sendmailmtaaliasgrouping: aliases
sendmailmtaaliasvalue: spillerm
sendmailmtaaliasvalue: externer_user@example.com
sendmailmtacluster: spiller.me
sendmailmtakey: zorro
$ ldapadd -x -D 'cn=papaschlumpf,dc=sysadmama,dc=de' -W -f Zorro.ldif
adding new entry "sendmailMTAKey=zorro,sendmailMTAMapName=aliases,dc=sysadmama,dc=de"

Analog hierzu werden alle benötigten Aliase – also zumindest das, was in /etc/aliases bzw. /etc/mail/aliases zu finden ist – eingepflegt; exemplarisch hierfür steht FirstAliases.ldif, das Aliase für root, postmaster und mailer-daemon definiert.

Virtuelle User in OpenLDAP einpflegen

Nach folgendem Schema werden die Einträge für die virtuellen User hinzugefügt.

## virtuser entry for blog@spiller.me
dn: sendmailMTAKey=blog@spiller.me,sendmailMTAMapName=virtuser,dc=sysadmama,dc=de
objectclass: sendmailMTA
objectclass: sendmailMTAMap
objectclass: sendmailMTAMapObject
objectclass: top
sendmailmtahost: spiller.me
sendmailmtakey: blog@spiller.me
sendmailmtamapname: virtuser
sendmailmtamapvalue: spillerm

sendmail.mc überarbeiten

Bislang hat sendmail noch keinen blassen Schimmer davon, dass diese Daten aus OpenLDAP gezogen werden sollen; im letzten Schritt ändern wir nun genau das. In aller Regel muss hierfür die sendmail.mc editiert und um folgende Einträge erweitert werden:

...
dnl ## LDAP SETTINGS
define(`confLDAP_CLUSTER',`spiller.me')dnl
FEATURE(`virtusertable',`LDAP')dnl
define(`ALIAS_FILE',`ldap:')dnl
define(`confLDAP_DEFAULT_SPEC',`-h 127.0.0.1 -b dc=sysadmama,dc=de')dnl
define(`confLDAP_DEFAULT_SPEC',`-w 3')dnl
...

Auf diese Art definieren wir sendmailMTACluster mit dem Wert spiller.me und legen fest, dass sendmail LDAPv3 „spricht“ – vergessen wir letzteres, kommt es sonst zu folgender Fehlermeldung:

Oct 11 12:44:43 spiller slapd[19398]: conn=1689 fd=29 ACCEPT from IP=127.0.0.1:39737 (IP=0.0.0.0:389)
Oct 11 12:44:43 spiller slapd[19398]: conn=1689 op=0 BIND dn="" method=128
Oct 11 12:44:43 spiller slapd[19398]: conn=1689 op=0 RESULT tag=97 err=2 text=historical protocol version requested, use LDAPv3 instead

Nun können wir die sendmail.cf neu generieren und dem Dienst einen Tritt geben; sinnvollerweise solltest du parallel hierzu auch schon die Logfiles beobachten und eventuelle Fehlermeldungen aufgreifen!

$ cd /etc/mail
$ m4 sendmail.mc > sendmail.cf
$ service sendmail restart

Die neuen Einträge testen

Abschließend solltest du überprüfen, ob die Verbindung funktioniert und die Einträge korrekt aufgelöst werden; hierzu gibt es verschiedene Herangehensweisen, ich entscheide mich für eine relativ simple über die Konsole:

$ sendmail -bv zorro
spillerm... deliverable: mailer local, user spillerm
externer_user@example.com... deliverable: mailer esmtp, host example.com., user externer\_user@example.com
$ sendmail -bv mailer-daemon
spillerm... deliverable: mailer local, user spillerm

That’s it! In /var/log/syslog lässt sich prima beobachten, wie beim Eintreffen neuer Nachrichten in OpenLDAP nachgeschlagen wird. Und analog zu sendmailMTAMapName=virtuser lassen sich weitere Strukturen einrichten, beispielsweise für Mailinglisten (sendmailMTAMapName=mailman), Ticketsysteme (sendmailMTAMapName=rt, sendmailMTAMapName=otrs) und so weiter – eine elegante Art, Struktur und Ordnung zu schaffen, vor allem in umfangreichen Umgebungen.

Alle Bilder dieser Seite: © Marianne Spiller – Alle Rechte vorbehalten
Hintergrundbild: Bild genauer anschauen – © Marianne Spiller – Alle Rechte vorbehalten

Eure Gedanken zu „OpenLDAP, sendmail und aliases“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.