Benutzer-Werkzeuge

Webseiten-Werkzeuge


Writing /srv/www/htdocs/udo/singollo.de/linux.singollo.de/public_html/data/cache/9/9b988e9f10c24d3cd0a56b2f0d4e95fa.metadata failed
mail:cyrus_postfix_und_ldap

Cyrus, Postfix und LDAP

Ich betreibe seit einiger Zeit mehrere Mailserver mit Postfix und Cyrus.

Ursprünglich hatte ich meine Mails direkt über mein Mailprogramm beim Provider abgeholt und lokal verwaltet. Das ging nur so lange gut, solange mein Mailaufkommen nicht zu groß war. Mit der Zeit hatte ich mich aber in diversen Mailinglisten eingeschrieben und dementsprechend einen deutlich höheren Aufwand zu betreiben. Da bereits auf meinem PC-Router ein lokaler Mailserver lief, um die Systemmails zu verschicken, war die Idee sehr schnell geboren, diesen Server aufzubohren. Ich musste mich nur die Konfiguration der vorhandenen Programme kümmern. Ursprünglich war auf meinem Server sendmail installiert, das mit seiner kryptischen Konfiguration nicht gerade einfach zu handhaben war. Die Qual der Wahl

Ich sah mich nach anderen Programmen um. Die Wahl viel auf Postfix, da dieser Mailserver als sicher und flexibel gilt sowie gut dokumentiert ist, was nicht unerheblich bei komplexeren Vorhaben ist. Da ich ja nicht nur Mails versenden wollte, musste ich mir auch das passende Gegenteil suchen. POP3 schied von vorneherein aus. Daher musste ich mich nach einem IMAP-Server umschauen. Damals gab es eigentlich nur 3 unter Linux einsetzbare Server: imapd, Courier und Cyrus. Da imapd nur eine Referenzimplementierung ist, fehlen im einige der gewünschten Features- ich wollte die Mails ausserhalb meines Heimatverzeichnisses und in Unterordnern verwalten. Damit musste ich mich mit den verbliebenen Servern auseinandersetzen. Courier viel recht schnell durch, da mir die Installation etwas zu undurchsichtig war. Hier würden Courier-Fans sicher starke Einwände haben, da sich im Internet sehr viele Stellen mit diesem Server auseinandersetzen. Für mich war Cyrus irgendwie einfacher, da die bei SuSE mitgelieferte READMEs für Postfix und Cyrus einen schnellen Einstieg ermöglichte. Mit den Beispielen dort konnte ich Postfix und Cyrus recht schnell aneinander binden. Auch die Userverwaltung unter Cyrus mit SASL hatte ich schnell im Griff.

Erste Schritte

Zuerst musste ich Postfix und Cyrus überreden sich miteinander zu verständigen. Das README empfahl folgendes:

/etc/postfix/main.cf

mailbox_transport = lmtp:unix:public/lmtp

/etc/cyrus.conf

 lmtpunix      cmd="lmtpd" listen="/var/spool/postfix/public/lmtp" prefork=1

Um einen Account bei Cyrus einzurichten, musste ich erstmal den Cyrus-Admin ein Passwort geben und den saslauth-Daemon starten. Danach konnte ich mich mit

cyradm --auth login localhost --user cyrus

einloggen und die erste Mailbox einrichten:

linux:~ # cyradm --auth login localhost -u cyrus
Please enter your password:
IMAP Password:
localhost> createmailbox user.foo
localhost> listmailbox
user.choeger
localhost> listacl user.foo
choeger lrswipcda
localhost> setacl user.foo cyrus lrswipcda
localhost> listacl user.foo
choeger lrswipcda
cyrus lrswipcda
localhost> exit

Für den Anfang war das nicht schlecht, aber ich wollte noch einen Schritt weiter und die Authentifizierung über SASL und nicht über PAM durchführen. Dazu passte ich die Konfiguration von saslauthd an und richtete dort per saslpasswd2 -c die entsprechenden Accounts ein.

smtp-auth, SASL und TLS

Nachdem ich Cyrus und Postfix konfiguriert und fetchmail das Abholen der Mails meiner Mailaccounts beigebracht hatte, hatte ich erstmal meine Arbeit erledigt. Da ich aber gerne experimentiere und mich gerade in das Thema Sicherheit bei Mails eingelesen hatte, wollte ich Postfix und Cyrus etwas mehr Sicherheit beibringen - ich hatte mir zuvor einen Root-Server gemietet, um meine Projekte besser unterbringen zu können. Dazu hab ich mich in das Thema TLS, smtp-auth und den verschiedenen Login-Mechanismen eingelesen. Postfix konnte ich recht schnell beibringen, über saslauthd auch smtp-auth anzubieten. Jetzt war nur noch TLS einzurichten. Mit einem selbsterstellten Zertifikat, was für einen Anfänger erstmal nicht leicht zu verstehen ist, konnte ich auch das erledigen.

Ausschnitt aus /etc/postfix/main.cf

broken_sasl_auth_clients = yes
smtp_tls_key_file = /etc/postfix/certs/server.pem
smtp_tls_note_starttls_offer = yes
smtp_use_tls = yes
smtpd_sasl_auth_enable = yes
smtpd_tls_CAfile = /etc/postfix/certs/server.pem
smtpd_tls_cert_file = /etc/postfix/certs/server.pem
smtpd_tls_key_file = /etc/postfix/certs/server.pem
smtpd_tls_loglevel = 2
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_use_tls = yes

/usr/lib/sasl2/smtpd.conf

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN DIGEST-MD5 CRAM-MD5
saslauthd_path: /var/run/sasl2/mux
log_level:3
minimum_layer: 0
auto_transition: no

/usr/lib/sasl2/slapd.conf

mech_list: plain login digest-md5 cram-md5

/etc/imapd.conf

configdirectory: /var/lib/imap
partition-default: /var/spool/imap
sievedir: /var/lib/sieve
admins: cyrus
allowanonymouslogin: no
autocreatequota: 10000
reject8bit: no
quotawarn: 90
timeout: 30
poptimeout: 10
dracinterval: 0
drachost: localhost
lmtp_overquota_perm_failure: no
tls_cert_file: /etc/postfix/certs/server.pem
tls_key_file: /etc/postfix/certs/server.pem
tls_ca_file: /etc/postfix/certs/server.pem
tls_ca_path: /etc/postfix/certs/server.pem
postmaster: postmaster
sieve_maxscriptsize: 32
sieve_maxscripts: 5
sasl_pwcheck_method: saslauthd
sasl_option: 1
sasl_mech_list: plain digest-md5 cram-md5 login
sasl_auto_transition: 1
lmtpsocket: /var/spool/postfix/public/lmtp
allowplaintext: yes
servername: localhost
sendmail: /usr/sbin/sendmail

Das ich auch Spam- und Virenschutz eingerichtet hab, das wollte ich nur hier mal erwähnen ;-)

Was ist jetzt mit LDAP?

Mit LDAP kam ich erst sehr spät in Berührung. LDAP war am Anfang erstmal nur eine Spielwiese und hatte für mich keinen praktischen Nutzen. Erst mit ein paar Artikeln über OpenLDAP im Linux-Magazin konnte ich auch für mich eine Anwendung erschliessen: zentrale Benutzeraccounts im Netzwerk. Microsoft hat dieses als NT-Domäne, dann als ActiveDirectory verwirklicht und in der Unix-Welt war das Gegenstück NIS/YP. Nachdem ich die Benutzerverwaltung auf LDAP umgestellt hatte, bot sich die Umstellung der Mailserver auf LDAP an. Damit konnte ich die Benutzerverwaltung komplett mit LDAP abwickeln.

Um das zu verwirklichen, musste LDAP die entsprechenden Schemen bekommen und die Rechte zum Zugriff vergeben.

/etc/openldap/slapd.conf

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/rfc2307bis.schema
include         /etc/openldap/schema/yast.schema
include         /etc/openldap/schema/combiCalendar.schema
include         /etc/openldap/schema/yast2userconfig.schema
include         /etc/openldap/schema/authldap.schema

pidfile         /var/run/slapd/slapd.pid
argsfile        /var/run/slapd/slapd.args
modulepath      /usr/lib/openldap/modules

access to dn.base=""
        by * read
access to dn.base="cn=Subschema"
        by * read
access to attrs=userPassword,userPKCS12
        by self write
        by * auth
access to attrs=shadowLastChange
        by self write
        by * read
access to *
        by * read
sasl-authz-policy to
sasl-regexp
    uid=(.*),cn=.*,cn=auth
    ldap:///ou=cyrus,o=foo,c=bar??sub?(uid=$1)

database        bdb
suffix          "o=foo,c=bar"
rootdn          "cn=admin,o=foo,c=bar"
rootpw          *******************
directory       /var/lib/ldap
checkpoint      1024    5
cachesize       100000
index objectClass,uid,uidNumber,gidNumber eq
index cn,mail,surname,givenName eq,subinitial

Zum Füllen des Baums kann man sich am folgenden Beispiel orientieren.

mail.ldif

dn: uid=webmaster,ou=cyrus,o=foo,c=bar
cn: webmaster
gidNumber: 100
givenName: Udo
homeDirectory: /dev/null
loginShell: /bin/false
structuralObjectClass: inetOrgPerson
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: CourierMailAccount
objectClass: CourierMailAlias
shadowExpire: -1
shadowFlag: 0
shadowInactive: -1
shadowMax: 999999
shadowMin: -1
shadowWarning: 7
sn: Neist
uid: webmaster
uidNumber: 1085
mail: webmaster@foo.bar
userPassword: *****************
maildrop: postmaster@foo.bar
maildrop: info@foo.bar
maildrop: abuse@foo.bar
maildrop: root@foo.bar
maildrop: root@localhost
maildrop: postmaster@localhost

Danach musste ich saslauthd LDAP beibringen, was doch recht einfach zu bewerkstelligen ist.

/etc/saslauthd.conf

ldap_servers: ldap://127.0.0.1 ldap://localhost
ldap_bind_dn: cn=admin,o=foo,c=bar
ldap_bind_pw: *******
ldap_search_base: ou=cyrus,o=foo,c=bar
ldap_timeout: 10
ldap_time_limit: 10
ldap_filter: (|(uid=%u)(uid=%u@%r))
ldap_scope: sub
ldap_mech: DIGEST_MD5
ldap_auth_method: bind
ldap_debug: 0
ldap_verbose: off
ldap_ssl: no
ldap_start_tls: no
ldap_referrals: yes

Postfix und LDAP

Nachdem Cyrus über saslauthd die Mailaccounts verwalten konnte, habe ich mich an Postfix gemacht. Als erstes richtete ich die Empfängeradressen (virtual_alias_maps) ein. Damit war gewährleistet, das Postfix nur diese Adressen entgegen nimmt. Da man allerdings auch die systemspezifischen Adressen (z.B. von Mailinglisten) benötigt, bindet man diese ebenso ein.

Ausschnitt aus /etc/postfix/main.cf

virtual_alias_maps = proxy:ldap:/etc/postfix/ldap/virtual_aliases.cf, hash:/etc/postfix/virtual

/etc/postfix/ldap/virtual_aliases.cf

search_base = ou=cyrus,o=foo,c=bar
version = 3
query_filter = (maildrop=%s)
server_host= 127.0.0.1
server_port= 389
bind= no
timeout= 60
result_attribute= uid
scope= sub

Nur reicht diese Konfiguration nicht, da es ja auch lokale Mailadressen gibt, die bedient werden sollten. Zwar gibt es eine alias-Datenbank, aber die reicht in einigen Fällen nicht aus.

Ausschnitt aus /etc/postfix/main.cf

local_recipient_maps = proxy:ldap:/etc/postfix/ldap/local_recipients.cf

/etc/postfix/ldap/local_recipients.cf

bind = no
server_host = 127.0.0.1
server_port = 389
search_base = ou=cyrus,o=foo,c=bar
query_filter = (|(uid=%u)(|(mail=%s)(maildrop=%s)))
result_attribute = uid
version = 3
scope= sub

Im nächsten Schritt habe ich dann die Userverwaltung um eine Variante des Einloggens erweitert. Mit dieser Konfiguration kann man sich nicht nur mit den Usernamen sondern auch mit einer Emailadresse anmelden. Das Beispiel erlaubt zudem auch die Nutzung von Alias-Adressen.

Ausschnitt aus /etc/postfix/main.cf

smtpd_sender_login_maps = proxy:ldap:/etc/postfix/ldap/mail_from_login.cf

/etc/postfix/ldap/mail_from_login.cf

bind = no
server_host = ldap://127.0.0.1
server_port = 389
search_base = ou=cyrus,o=foo,c=bar
result_attribute = uid
version = 3
query_filter = (|(uid=%u)(|(mail=%s)(maildrop=%s)))
mail/cyrus_postfix_und_ldap.txt · Zuletzt geändert: 07.10.2012 18:31 (Externe Bearbeitung)