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.

LDAP

Es gibt 3 Dinge die der Postfix aus der LDAP DB holt:

  • bin ich für diese Domain zuständig
  • ist Empfängeradresse ein User
  • ist Empfängeradresse ein Alias

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.

LDAP installieren

Ich verwende den openldap24-server.

Options

  • TCP_WRAPPERS
  • BDB

Ich habe den slapd sicherheitshalber noch per TCP Wrapper geschützt, daran sollte man denken. ;-)

Konfigurationsdateien

/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.

Postfix

Options

  • SASL2
  • OPENLDAP

Konfigurationsdateien

/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

User vmail einrichten und Spool Verzeichnis einrichten

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 und courier-authlib

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

Options

  • AUTH_LDAP

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.

Konfigurationsdateien

/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

Testen

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. ;-)

IMAP Server

Da bauen wir den courier-imap.

Options

  • LDAP

(schon wieder muss das extra gesetzt werden… komich!)

Konfigurationsdateien

/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…

Testen

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

SMTP Auth wird mit sasl2 realisiert.

Options

Konfigurationsdateien

/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.

Greylisting

Kommt noch genauer!

Clamav

/usr/ports/security/clamav

ClamAV scannt nach Vieren. :-)

Options

* ARC
* ARJ
* LHA
* UNZOO
* UNRAR

Amavis

/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.

offene Punkte

  • Ist ein chmod 4755 /var/run/authdaemond/ nötig?
  • Amavis und Greylisting fertig schreiben
  • ich habe in der /usr/local/etc/rc.d/saslauthd die Zeile saslauthd_flags geändert: saslauthd_flags=${saslauthd_flags:-“-a ldap“}, fiel mir beim Update auf

Links

 
freebsd_mailserver.txt · Zuletzt geändert: 2011/02/16 21:22 von alehmann
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki