Hier wird erklärt wie man postfix mit postgreSQL-Backend installiert, dovecot inkl. sieve konfiguriert, sowie postfixadmin einrichtet, um postfix bequem über ein Webinterface verwalten zu können.
Datenbank anlegen
Als Erstes legen wir einen Datenbankbenutzer inkl. Datenbank für postfix an:
su - postgres
psql template1
CREATE USER postfix WITH PASSWORD 'password';
CREATE DATABASE postfix WITH OWNER postfix ENCODING 'UNICODE';
\q
Verzeichnis anlegen
Später werden alle Mailboxen unter “/var/vmail/DOMAIN/BENUTZERNAME/maildir/” liegen, deshalb erstellen wir nun den Ordner “/var/vmail” und vergeben entsprechende Rechte. Die Einsortierung nach “/var/vmail/DOMAIN/BENUTZERNAME/maildir/” geschieht später über SQL-Queries automatisch.
useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c 'Virtual mailbox' vmail
mkdir /var/vmail
chmod 770 /var/vmail/
chown vmail:mail /var/vmail/
postfixadmin
postfixadmin installieren wir direkt aus deren svn-Repository, um mit der aktuellste Version zu arbeiten. Sollte es zu Problemen kommen, kann man über http://postfixadmin.sourceforge.net/ die neueste stabile Version herunterladen.
cd /var/www/
svn co https://postfixadmin.svn.sourceforge.net/svnroot/postfixadmin/trunk postfixadmin-svn
ln -s postfixadmin-svn postfixadmin
Danach passt man die Konfigurationsdatei “/var/www/postfixadmin/config.inc.php” an seine Wünsche und Anforderungen an. Nach Ausführen des “setup.php”-Skripts im Browser (und anschließendem Löschen/Umbenennen) ist postfixadmin einsatzbereit.
postfix
postfix installieren:
aptitude install postfix postfix-pgsql postfix-pcre
Während der Installation von postfix wird man gefragt, wie man postfix konfigurieren will, dort wählt man “Internet Site” aus (wobei dies später irrelevant ist, da wir die Konfiguration komplett selbst schreiben).
Datenbankverbindung konfigurieren
Damit postfix mit den Accounts, die in postfixadmin angelegt werden zusammenarbeitet, müssen wir verschiedene SQL-Queries anlegen:
relay-domains.cf:
user = postfix
password = xxxxxxx
dbname = postfix
hosts = localhost
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = true
virtual-alias-maps.cf:
user = postfix
password = xxxxxxxx
dbname = postfix
hosts = localhost
query = SELECT goto FROM alias WHERE address='%s' AND active = true
virtual-domain-maps.cf:
user = postfix
password = xxxxxxxx
dbname = postfix
hosts = localhost
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = false AND active = true
virtual-mailbox-limit-maps.cf:
user = postfix
password = xxxxxxxx
dbname = postfix
hosts = localhost
query = SELECT quota FROM mailbox WHERE username = '%s' AND active = true
virtual-mailbox-maps.cf:
user = postfix
password = xxxxxxxx
dbname = postfix
hosts = localhost
query = SELECT maildir || 'maildir' || '/' FROM mailbox WHERE username='%s' AND active = true
recipient checks
Mit recipient checks kann man E-Mailadressen anhand von regulären Ausdrücken prüfen und dadurch Mails entweder annehmen oder ablehnen. Hier werden invalide E-Mailadressen, bzw. welche mit “seltsamer” Syntax abgewiesen und E-Mails an postmaster, hostmaster, webmaster und abuse immer angenommen.
/etc/postfix/recipient_checks.pcre:
/^\@/ 550 Invalid address format.
/[!%\@].*\@/ 550 This server disallows weird address syntax.
/^postmaster\@/ OK
/^hostmaster\@/ OK
/^webmaster\@/ OK
/^abuse\@/ OK
mx access
Über diese Datei werden E-Mails von Gegenstellen aus privaten IP-Blöcken, bzw. von Broadcast- und Multicast-Netzen von vorneherein abgewiesen, da diese im Internet prinzipiell nicht geroutet werden und es sich dabei mit extrem hoher Wahrscheinlichkeit um Spam handelt.
/etc/postfix/mx_access:
0.0.0.0/8 REJECT Domain MX in broadcast network
10.0.0.0/8 REJECT Domain MX in RFC 1918 private network
127.0.0.0/8 REJECT Domain MX in loopback network
169.254.0.0/16 REJECT Domain MX in link local network
172.16.0.0/12 REJECT Domain MX in RFC 1918 private network
192.0.2.0/24 REJECT Domain MX in TEST-NET network
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network
224.0.0.0/4 REJECT Domain MX in class D multicast network
240.0.0.0/5 REJECT Domain MX in class E reserved network
248.0.0.0/5 REJECT Domain MX in reserved network
Nun muss daraus noch eine postfix-lookup table erstellt werden:
postmap /etc/postfix/mx_access
main.cf
Nun müssen wir noch postfix konfigurieren und alle Teilkonfigurationen, die wir gerade erstellt haben zusammenfügen. Dies geschieht über die Datei “/etc/postfix/main.cf“:
# -------------------- GENERAL PART START --------------------
allow_percent_hack = no
biff = no
disable_vrfy_command = yes
mydestination = $myhostname, $mydomain, localhost
mydomain = domain.tld
myhostname = mail.domain.tld
mynetworks_style = host
myorigin = $mydomain
#home_mailbox = Maildir/
#mailbox_size_limit = 2147483648
#message_size_limit = 209715200
local_transport = dovecot
masquerade_exceptions = root
recipient_delimiter = +
# -------------------- GENERAL PART END --------------------
# -------------------- VIRTUAL PART START --------------------
virtual_mailbox_base = /var/vmail
relay_domains = proxy:pgsql:/etc/postfix/pgsql/relay-domain-maps.cf
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql/virtual-mailbox-maps.cf
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql/virtual-domain-maps.cf
virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql/virtual-alias-maps.cf
virtual_minimum_uid = 150
virtual_uid_maps = static:150
virtual_gid_maps = static:8
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
unknown_local_recipient_reject_code = 550
# -------------------- VIRTUAL PART END --------------------
# -------------------- RESTRICTIONS PART START --------------------
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_client_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unknown_reverse_client_hostname,
permit
smtpd_data_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_pipelining,
permit
smtpd_helo_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
permit
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
check_recipient_mx_access cidr:/etc/postfix/mx_access,
reject_unauth_destination,
check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,
### check_policy_service inet:127.0.0.1:12525,
permit
smtpd_sender_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
permit
# -------------------- RESTRICTIONS PART END --------------------
# -------------------- SASL PART START --------------------
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
# -------------------- SASL PART END --------------------
# -------------------- TLS PART START --------------------
smtpd_use_tls = yes
smtpd_tls_security_level = may
#smtpd_tls_auth_only = yes
smtpd_tls_CAfile = /etc/postfix/ssl/demoCA/cacert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/server-crt.pem
smtpd_tls_dh1024_param_file = /etc/postfix/ssl/dh_1024.pem
smtpd_tls_dh512_param_file = /etc/postfix/ssl/dh_512.pem
smtpd_tls_key_file = /etc/postfix/ssl/server-key.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
# -------------------- TLS PART END --------------------
master.cf
Ans Ende der “/etc/postfix/master.cf” anhängen:
# Dovecot LDA
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d ${recipient}
Will man auch smtps (Port 465) zulassen, so entfernt man die Raute-Zeichen vor den untenstehenden Zeilen, damit sie wie folgt aussehen (die Leerzeichen vor der zweiten Zeile sind essentiell):
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
smpts kann nützlich sein, wenn Port 25 aus irgend einem Grund gesperrt sein sollte, denn es operiert auf Port 465, welcher seltener gesperrt ist (zumindest in Studentenwohnheimen und Universitäten), zusätzlich bietet es einen höheren Schutz als plaintext-smtp (doch einen geringeren als smtp+tls).
dovecot
Nun folgt die Konfiguration des dovecot E-Mail-Servers. Zunächst wird dovecot über aptitude:
aptitude install dovecot-imapd dovecot-pop3d
Jetzt wird dovecot noch konfiguriert:
/etc/dovecot/dovecot.conf:
## Dovecot configuration file
base_dir = /var/run/dovecot/
# imap imaps pop3 pop3s (use imaps and pop3s if configured for SSL)
protocols = imaps imap pop3s pop3 managesieve
# Uncomment the ssl_listen statements and comment out listen if using SSL
protocol imap {
listen = *:143
ssl_listen = *:993
}
protocol pop3 {
listen = *:110
ssl_listen = *:995
}
protocol managesieve {
listen = *:2000
}
log_timestamp = “%Y-%m-%d %H:%M:%S ”
syslog_facility = mail
# Where the mailboxes are located
mail_location = maildir:/var/vmail/%d/%n/maildir
mail_access_groups = vmail
mail_debug = yes
first_valid_uid = 150
last_valid_uid = 150
maildir_copy_with_hardlinks = yes
protocol imap {
login_executable = /usr/lib/dovecot/imap-login
mail_executable = /usr/lib/dovecot/imap
imap_max_line_length = 65536
mail_plugins = quota imap_quota
imap_client_workarounds = outlook-idle delay-newmail
}
protocol pop3 {
login_executable = /usr/lib/dovecot/pop3-login
mail_executable = /usr/lib/dovecot/pop3
pop3_uidl_format = %08Xu%08Xv
mail_plugins = quota
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}
protocol lda {
postmaster_address = postmaster@ibutho.de
sendmail_path = /usr/lib/sendmail
auth_socket_path = /var/run/dovecot/auth-master
mail_plugins = quota cmusieve
sieve_global_path = /var/vmail/default.sieve
log_path = /var/log/dovecot-deliver.log
info_log_path = /var/log/dovecot-deliver.log
}
protocol managesieve {
sieve = /var/vmail/%d/%n/dovecot.sieve
sieve_storage = /var/vmail/%d/%n/sieve
}
auth_verbose = no
auth_debug = yes
#auth_debug_passwords = yes
auth default {
mechanisms = plain login
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb prefetch {
}
user = nobody
socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0660
user = vmail
group = mail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
dict {
}
plugin {
acl = vfile:/etc/dovecot/acls
sieve = /var/vmail/%d/%n/dovecot.sieve
}
# Uncomment these if using SSL
ssl_cert_file = /etc/ssl/certs/ibutho_server.pem
ssl_key_file = /etc/ssl/private/ibutho_privatekey.pem
ssl_ca_file = /etc/ssl/certs/root.pem
ssl_parameters_regenerate = 168
verbose_ssl = no
# If you want client certificates, use these lines
# ssl_verify_client_cert = yes
# ssl_require_client_cert = yes
# ssl_username_from_cert = yes
Damit das logging nach “/var/log/dovecot-deliver.log” funktioniert, muss die Datei mit entsprechenden Rechten ausgestattet sein:
touch /var/log/dovecot-deliver.log
chmod 640 /var/log/dovecot-deliver.log
chown vmail:mail /var/log/dovecot-deliver.log
/etc/dovecot/dovecot-sql.conf:
driver = pgsql
connect = host=localhost dbname=postfix user=postfix password=xxxxxxxx
default_pass_scheme = MD5
user_query = SELECT '/var/vmail/' || maildir AS home, 'maildir:/var/vmail/' || maildir || 'maildir' AS mail, 150 AS uid, 8 AS gid, 'maildir:storage=' || quota AS quota FROM mailbox WHERE local_part = split_part('%n', '+', 1) AND domain = '%d' AND active = true
password_query = SELECT username AS user, password, '/var/vmail/' || maildir AS userdb_home, 'maildir:/var/vmail/' || maildir || 'maildir' AS userdb_mail, 150 as userdb_uid, 8 as userdb_gid FROM mailbox WHERE username = '%u' AND active = true
Testen der Konfiguration
Zuerst kann man serverseitig mittels “netstat -tulpen” testen, ob der Server auf allen beabsichtigten Ports lauscht (110, 143, 993, 995, 2000). Danach kann man mittels “telnet SERVER_IP 143“, bzw. “telnet SERVER_IP 110” testen, ob man eine Verbindung bekommt. Ist dies der Fall, bietet es sich an auszuprobieren, ob man mit einem Mailprogramm auf das Postfach zugreifen kann (es muss natürlich eins in postfixadmin angelegt sein), bzw. ob man auch Mails empfangen und versenden kann.
Ein weiterer wichtiger Test, den man durchführen sollte, ist, ob der Mailserver als “open relay” missbraucht werden kann (kurz und knapp heißt das, ob der Server möglicherweise eine “Spam-Schleuder” ist). Dies kann man u.a. hier testen: http://www.abuse.net/relay.html. Sollten alle Tests Erfolg haben, hat man einen funktionsfähigen Mailserver.
Quellen:
postfixadmin/DOCUMENTS/POSTFIX_CONF.txt
http://blog.schalanda.name/archives/178-EUserv-vServer-Active-Installation-des-Mailsystems.html
http://codepoets.co.uk/postfixadmin-postgresql-courier-squirrelmail-debian-etch-howto-tutorial
http://wiki.rootforum.de/mailserver/postfix
http://wiki.rootforum.de/mailserver/postfix/postfix-admin
http://forum.rootforum.de/viewtopic.php?f=111&t=46643
http://www.postfix.org/postconf.5.html
http://wiki.dovecot.org/MainConfig
http://wiki.dovecot.org/ManageSieve
http://wiki.dovecot.org/LDA/Sieve
http://wiki.dovecot.org/HowTo/DovecotLDAPostfixAdminMySQL