Hier mal ein kleines Howto wie man einen Mailserver mit FreeBSD aufsetzt der alle User Informationen aus einer LDAP-DB holt. Ich verwende FreeBSD 8.1 und habe alles benötigte aus den Ports gebaut. Hier wird Postfix in der Version 2.8 verwendet.
Der Mailserver ist bei mir seit ca. 3 Jahren in Betrieb. Heute, am 16.02.11 habe ich das Dokument einmal aktualisiert. Ich denke mal, das ich irgendwann zu einer genaueren Beschreibung von Amavid und Postgrey komme. Die Features von Postfix 2.8 sehen auch gut aus im Changelog, aber momentan ist kaum Zeit.
Bei Fragen, Wünschen, Verbesserungsvorschlägen bin ich per Mail unter abcdefg AT blacktux PUNKT de erreichbar.
Es gibt 3 Dinge die der Postfix aus der LDAP DB holt:
Natürlich prüft der IMAP Server seinen Kram auch per LDAP.
Die Domainzugehörigkeit habe ich in einer ou untergebracht.
Sieht so aus:
dn: ou=domains,dc=blacktux,dc=de objectClass: organizationalUnit objectClass: top ou: domains dn: ou=windows8.mobi,ou=domains,dc=blacktux,dc=de ou: windows8.mobi objectClass: organizationalUnit objectClass: top objectClass: domainRelatedObject associatedDomain: windows8.mobi
Dadurch weiss der Postfix, das er Mails für die Domain windows8.mobi auf valide Empfänger prüfen muss.
Die Daten (inkl. OU) für einen Account sehen nun so aus:
dn: ou=people,dc=blacktux,dc=de objectClass: organizationalUnit objectClass: top ou: people dn: cn=Andre Lehmann,ou=people,dc=blacktux,dc=de objectClass: inetOrgPerson objectClass: top objectClass: qmailUser sn: Lehmann uid: alehmann userPassword: daswüsstestduwohlgerne mail: test@windows8.mobi accountStatus: active mailMessageStore: /var/spool/vmail/mmustermann/Maildir displayName: Andre Lehmann cn: Andre Lehmann qmailUID: 2000 qmailGID: 2000
Das Attribut „mail“ ist hier die „Hauptadresse“. Sehr wichtig sind qmailUID und qmailGID, die müssen sein. Habe leider (noch) keinen Weg gefunden die statisch festzulegen.
Ich verwende den openldap24-server.
Ich habe den slapd sicherheitshalber noch per TCP Wrapper geschützt, daran sollte man denken.
/usr/local/etc/openldap/slapd.conf
# wiki.blacktux.de
# 16.02.11
allow bind_v2
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/meine/qmail.schema
loglevel 256
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
backend bdb
database bdb
suffix "dc=blacktux,dc=de"
directory "/var/db/openldap-data"
lastmod on
access to attrs=userPassword
by dn="cn=denkste,dc=blacktux,dc=de" write
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to *
by dn="cn=denkste,dc=blacktux,dc=de" write
by * read
rootdn "cn=denkste,dc=blacktux,dc=de"
rootpw {SSHA}dastuthiernichtszursache
Bei dieser Konfig ist der Loglevel ziemlich hoch, das sollte man beim Produktiv Betrieb bedenken. So sieht man aber schön jeden Connect und die Suche. Ist am Anfang vielleicht etwas hilfreich. Bei den Schema Dateien sollte darauf geachtet werden, das es Abhängikeiten gibt. Das QMAIL Schema baut z.B. auf core, cosine und nis auf. Wenn die nicht vorher geladen werden, bricht slapd ohne eine Meldung ab.
/usr/local/etc/postfix/master.cf
# wiki.blacktux.de
# 16.02.11
smtp inet n - n - 1 postscreen
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp -o smtp_fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
retry unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
maildrop unix - n n - - pipe flags=ODRhu user=vmail arg
v=/usr/local/bin/maildrop -d ${recipient}
amavisd-new unix - - n - 2 smtp
-o smtp_data_done_timeout=1200s
-o disable_dns_lookups=yes
-o smtp_send_xforward_command=yes
178.63.246.212:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_proxy_filter=
-o myhostname=mx.blacktux.de
-o smtpd_banner=mx.blacktux.de
-o mynetworks=178.63.246.212
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o local_recipient_maps=
-o receive_override_options=no_unknown_recipient_checks
-o smtpd_authorized_xforward_hosts=178.63.246.212
spf-policy unix - n n - 0 spawn user=nobody argv=/usr/local/sbin/postfix-policyd-spf-p
erl
smtpd pass - - n - - smtpd
dnsblog unix - - n - 0 dnsblog
tlsproxy unix - - n - 0 tlsproxy
/usr/local/etc/postfix/main.cf
# wiki.blacktux.de # 22.01.09 smtpd_banner = Welcome to mx.blacktux.eu biff = no append_dot_mydomain = no inet_protocols = ipv4,ipv6 myhostname = mx.blacktux.de myorigin = blacktux.de mydestination = localhost mailbox_size_limit = 0 virtual_transport = maildrop recipient_delimiter = + message_size_limit = 50000000 virtual_mailbox_base = /var/spool/vmail virtual_uid_maps = static:2000 virtual_gid_maps = static:2000 maildrop_destination_recipient_limit=1 smtpd_proxy_filter = 178.63.246.212:10024 smtpd_sasl_auth_enable = yes smtpd_sasl2_auth_enable = yes smtpd_sasl_security_options = noanonymous broken_sasl_auth_clients = yes smtpd_sasl_local_domain = smtpd_helo_required = no smtpd_delay_reject = yes command_directory = /usr/local/sbin daemon_directory = /usr/local/libexec/postfix readme_directory = /usr/local/share/doc/postfix sample_directory = /usr/local/etc/postfix sendmail_path = /usr/local/sbin/sendmail html_directory = /usr/local/share/doc/postfix setgid_group = maildrop manpage_directory = /usr/local/man newaliases_path = /usr/local/bin/newaliases mailq_path = /usr/local/bin/mailq queue_directory = /var/spool/postfix mail_owner = postfix data_directory = /var/db/postfix spf-policy_time_limit = 3600 # SSL # smtpd_use_tls=yes smtpd_tls_cert_file=/root/ssl/mx.blacktux.de.pem smtpd_tls_key_file=$smtp_tls_cert_file smtpd_tls_loglevel=0 smtpd_tls_received_header=yes smtpd_tls_CAfile = /usr/local/share/certs/ca-root-nss.crt smtpd_tls_auth_only = yes smtp_use_tls = yes smtp_tls_cert_file=/root/ssl/mx.blacktux.de.pem smtp_tls_key_file=$smtp_tls_cert_file smtp_tls_loglevel = 0 smtp_tls_CAfile = /usr/local/share/certs/ca-root-nss.crt smtpd_tls_mandatory_ciphers = low smtpd_tls_security_level = may smtpd_tls_mandatory_protocols = !TLSv1, SSLv2, SSLv3 smtpd_recipient_restrictions = reject_unlisted_recipient, permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service unix:private/spf-policy, # Greylisting check_policy_service inet:178.63.246.212:10023 smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, virtual_mailbox_domains = ldap:vdomains virtual_mailbox_maps = # ldap:vacation, # ldap:forwarding, ldap:virtual-users, ldap:catchall virtual_alias_maps= ldap:virtual-alias, # ldap:vdomains vdomains_server_host = ldap.blacktux.de vdomains_search_base = ou=domains,dc=blacktux,dc=de vdomains_scope = sub vdomains_query_filter = (associatedDomain=%s) vdomains_result_attribute = associatedDomain # ldap:forwarding #forwarding_server_host = ldap.blacktux.de #forwarding_search_base = dc=blacktux,dc=de #forwarding_scope = sub #forwarding_query_filter = (|(mail=%s)(mailAlternateAddress=%s)) #forwarding_result_attribute = mailForwardingAddress # ldap:vacation #vacation_server_host = ldap.blacktux.de #vacation_search_base = dc=blacktux,dc=de #vacation_scope = sub #vacation_query_filter = (&(|(mail=%s)(mailAlternateAddress=%s))(accountStatus=vacation)) #vacation_result_attribute = mail #vacation_result_filter = %s,%s@autoreply.blacktux.de # ldap:virtual virtual-users_server_host = ldap.blacktux.de virtual-users_search_base = dc=blacktux,dc=de virtual-users_scope = sub virtual-users_query_filter = (mail=%s) virtual-users_result_attribute = mail # ldap:alias virtual-alias_server_host = ldap.blacktux.de virtual-alias_search_base = dc=blacktux,dc=de virtual-alias_scope = sub virtual-alias_query_filter = (mailAlternateAddress=%s) virtual-alias_result_attribute = mail # ldap:catchall catchall_server_host = ldap.blacktux.de catchall_search_base = dc=blacktux,dc=de catchall_scope = sub catchall_query_filter = (mailAlternateAddress=catchall@%d) catchall_result_attribute = mail
Testen der Lookups:
Damit kann man die einzelnen Maps prüfen.
z.B.:
postmap -q test@windows8.mobi ldap:virtual-users
Ich habe einen extra User angelegt, dieser User ist dann der dem alle Postfächer gehören.
Der User heisst bei mir „vmail“ und hat die UID 2000 und die GID 2000. Aber wie gesagt, das kann man selbst entscheiden.
Als Spool Verzeichnis habe ich mir /var/spool/vmail ausgesucht.
/var/spool/vmail:
drwxrwxrwt 3 root vmail 512 Feb 22 11:54 vmail
(IMHO 4755 ? )
Unterhalb vom vmail Verzeichnis haben wir jetzt die User Verzeichnisse, die werden nach der „uid“ in der LDAP-DB benannt.
/var/spool/vmail/mmustermann:
drwx------ 4 vmail vmail 512 Feb 22 15:38 mmustermann
Im Userverzeichniss müssen wir jetzt noch mit maildirmake die entsprechende Verzeichnisstruktur anlegen. Es ist sinnvoll da ein su zum User vmail zu machen, dann stimmen gleich die Rechte.
[vmail@newgate /]$ maildirmake /var/spool/vmail/mmustermann/Maildir
Maildrop ist das Programm das die Mails in die dementsprechenden Postfächer steckt. Das hatte bei mir einige Probleme gemacht, die aber eigentlich nicht all zu schlimm waren.
Da maildrop doch nicht ganz unwichtig ist, gibt es dazu ein extra Absatz.
Maildrop liegt übrigens unter /usr/ports/mail/maildrop
Ich finde das etwas verwirrend. Maildrop nutzt eigentlich die authlib von courier. Die liegt unter /usr/ports/security/courier-authlib, IMHO sollte die automatisch mitinstalliert werden. Wenn nicht, darauf achten das die courier-authlib mit LDAP gebacken wird. (!) Courier-authlib wird dann übrigens wieder vom Courier Imap Server genutzt.
/usr/local/etc/authlib/authdameonrc
# wiki.blacktux.de # 16.02.11 authmodulelist="authldap" #authmodulelistorig="authuserdb authpwd authshadow authcustom authpipe" daemons=5 #authdaemonvar=/var/lib/courier/authdaemon DEBUG_LOGIN=2 DEFAULTOPTIONS="" LOGGEROPTS=""
ACHTUNG! Bei DEBUG_LOGIN=2 werden die PW's im Klartext geloggt!
/usr/local/etc/authlib/authldaprc
# wiki.blacktux.de # 16.02.11 LDAP_URI ldap://ldap.blacktux.de LDAP_PROTOCOL_VERSION 3 LDAP_BASEDN ou=people, dc=blacktux, dc=de LDAP_BINDDN cn=admin, dc=blacktux, dc=de LDAP_BINDPW foodtsitsielriehsadrew LDAP_TIMEOUT 5 LDAP_MAIL mail LDAP_FILTER (accountStatus=active) LDAP_UID qmailUID LDAP_GID qmailGID LDAP_HOMEDIR mailMessageStore LDAP_MAILDIR mailMessageStore #LDAP_DEFAULTDELIVERY defaultDelivery #LDAP_FULLNAME cn LDAP_CRYPTPW userPassword LDAP_DEREF never
Starten von courier-authdaemonrc nicht vergessen…
Dazu werden wir mal der User vmail.
echo hallo | maildrop -V9 -d "test@windows8.mobi"
Wenn alles richtig ist, sollte es so aussehen:
[vmail@newgate /usr/local/etc/authlib]$ echo hallo | maildrop -V9 -d "test@windows8.mobi" maildrop: authlib: groupid=2000 maildrop: authlib: userid=2000 maildrop: authlib: logname=test@windows8.mobi, home=/var/spool/vmail/mmustermann, mail=/var/spool/vmail/mmustermann/Maildir maildrop: Changing to /var/spool/vmail/mmustermann Message start at 0 bytes, envelope sender=test@windows8.mobi maildrop: Attempting .mailfilter maildrop: Delivery complete. [vmail@newgate /usr/local/etc/authlib]$
Wenn nicht, dann ist das blöd.
Da bauen wir den courier-imap.
(schon wieder muss das extra gesetzt werden… komich!)
/usr/local/etc/courier-imap/imapd
# wiki.blacktux.de # 16.02.11 ADDRESS=0 PORT=143 MAXDAEMONS=40 MAXPERIP=4 PIDFILE=/var/run/imapd.pid TCPDOPTS="-nodnslookup -noidentlookup" LOGGEROPTS="-name=imapd" IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE" IMAP_KEYWORDS=1 IMAP_ACL=1 IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE" IMAP_PROXY=0 IMAP_PROXY_FOREIGN=0 IMAP_IDLE_TIMEOUT=60 IMAP_MAILBOX_SANITY_CHECK=1 IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN" IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN" IMAP_DISABLETHREADSORT=0 IMAP_CHECK_ALL_FOLDERS=0 IMAP_OBSOLETE_CLIENT=0 IMAP_UMASK=022 IMAP_ULIMITD=65536 IMAP_USELOCKS=1 IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index IMAP_ENHANCEDIDLE=0 IMAP_TRASHFOLDERNAME=Trash IMAP_EMPTYTRASH=Trash:7 IMAP_MOVE_EXPUNGE_TO_TRASH=0 SENDMAIL=/usr/sbin/sendmail HEADERFROM=X-IMAP-Sender IMAPDSTART=NO MAILDIRPATH=Maildir MAILDIR=Maildir/
Wichtig sind IMHO die beiden letzten Einträge…
Wenn alles geklappt hat, sollte jetzt ein Login möglich sein. Benutzername ist die Mailadresse (für den Herrn Mustermann tragen wir test@windows8.mobi ein). Es sollte auch eine E-Mail drinn sein bei der alles fehlt, das ist der Test mit dem Maildrop Programm.
SMTP Auth wird mit sasl2 realisiert.
/usr/local/etc/saslauthd.conf
# wiki.blacktux.de # 16.02.11 ldap_servers: ldap://ldap.blacktux.de ldap_bind_dn: cn=augusta,dc=blacktux,dc=de ldap_bind_pw: g33K ldap_search_base: ou=people,dc=blacktux,dc=de ldap_timeout: 10 ldap_time_limit: 10 ldap_filter: (|(mail=%u)(mail=%u@%r)) ldap_scope: sub ldap_mech: DIGEST_MD5 ldap_auth_method: bind ldap_debug: 1 ldap_verbose: yes ldap_ssl: no ldap_start_tls: no ldap_referrals: yes
/usr/local/lib/sasl2/smtpd.conf
# wiki.blacktux.de # 16.02.11 pwcheck_method: saslauthd mech_list: PLAIN LOGIN log_level: 5
WICHTIG! Hier sollte jeder für sich selbst testen ob KEINE Mails für fremde Domains angenommen werden. Ein offenes Relay zu konfigurieren wäre heutzutage ziemlich problematisch.
Kommt noch genauer!
/usr/ports/security/clamav
ClamAV scannt nach Vieren.
* ARC
* ARJ
* LHA
* UNZOO
* UNRAR
/usr/ports/security/amavisd-new
Amavis sollte Die Mails noch einmal untersuchen. Vielleicht rutscht ja doch einmal jemand durch das Greylisting.
Um Amavis zu installieren, brauchen wir libmilter. Daher einmal die Sendmail Sourcen holen und ein make ; make install im libmilter Verzeichnis.
Danach lässt sich amavisd backen, ich musste danach noch ein portupgrade -f p5* durchlaufen lassen.