OpenLDAP, sendmail und aliases

Diesen Beitrag schrieb ich 7 Jahre und 11 Monate 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.