Hin und wieder komme ich in die Verlegenheit, einen Mailserver aufsetzen zu müssen und fange dann normalerweise wieder damit an, nach Tutorials zu suchen, in denen erklärt wird, wie man das Zweiergespann aus Dovecot (POP3(s)- und IMAP(s)-Server zum Abrufen von Mails vom Mailserver) und Postfix (SMTP(s)-Server zum Senden von Mails an den Mailserver) derzeit aufsetzen sollte. Mit dem richtigen Tutorial ist das auch keine große Sache und in 15 - 60 Minuten erledigt (wenn es nicht irgendwo™ hakt). Dieses Mal habe ich mich allerdings dazu entschieden, die hierdurch entstandene Konfiguration zu parameterisieren und in eine BASH-Funktion zu verpacken. Nach Setzen von lediglich zwei Parametern und Aufrufen der Funktion wird ein Mailserver vollautomatisch mit allen nötigen Komponenten installiert und konfiguriert. Das so entstandene Skript wurde erfolgreich unter Debian 10 eingesetzt und sollte unter anderen Debian-Versionen oder -Derivaten unverändert oder mit kleinen Modifikationen ebenfalls verwendbar sein.
#!/bin/bash
CI_mailServerInstall()
{
if [ -z "$DT_INST_hostname" ] || [ -z "$DT_INST_domain" ]
then
echo 'ERROR: $DT_INST_hostname and/or $DT_INST_domain are NOT set'
exit 23
fi
# Grundlegende Werte in der Debconf setzen
echo 'sasl2-bin cyrus-sasl2/upgrade-sasldb2-failed error
sasl2-bin cyrus-sasl2/purge-sasldb2 boolean false
sasl2-bin cyrus-sasl2/backup-sasldb2 string /var/backups/sasldb2.bak
sasl2-bin cyrus-sasl2/upgrade-sasldb2-backup-failed error
postfix postfix/main_mailer_type select No configuration' > /tmp/debconf.conf
debconf-set-selections /tmp/debconf.conf
rm /tmp/debconf.conf
# Pakete installieren
apt install --yes dovecot-core dovecot-imapd dovecot-pop3d postfix postfix sasl2-bin vacation
# Verzeichnisse, die nach zusätzlichen Dovecot-Konfigurationsdateien durchsucht werden sollen und
# Dovecot-Konfigurationsdateien festlegen
echo '
!include_try /usr/share/dovecot/protocols.d/*.protocol
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf
' > /etc/dovecot/dovecot.conf
# Klartextauthetifizierung aktivieren (Zugriff wird per TLS gesichert)
echo '
disable_plaintext_auth = no
auth_mechanisms = plain login
!include auth-system.conf.ext
' > /etc/dovecot/conf.d/10-auth.conf
# Eintreffende Mails werden im Benutzerverzeichnis unter Maildir abgelegt
echo '
mail_location = maildir:~/Maildir
namespace inbox {
inbox = yes
}
mail_privileged_group = mail
protocol !indexer-worker {
}
' > /etc/dovecot/conf.d/10-mail.conf
# Die Protokolle IMAP(s) und POP3(s) aktivieren
echo '
service imap-login {
inet_listener imap {
}
inet_listener imaps {
}
}
service pop3-login {
inet_listener pop3 {
}
inet_listener pop3s {
}
}
service submission-login {
inet_listener submission {
}
}
service lmtp {
unix_listener lmtp {
}
}
service imap {
}
service pop3 {
}
service submission {
}
service auth {
unix_listener auth-userdb {
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
}
service auth-worker {
}
service dict {
unix_listener dict {
}
}
' > /etc/dovecot/conf.d/10-master.conf
# Automatisch generierte selbstsignierte SSL-Zertifikate für den Zugriff verwenden
echo '
ssl = yes
ssl_cert = /etc/dovecot/conf.d/10-ssl.conf
# Diverse Einstellungen für Postfix:
# * Nur IPv4 verwenden
# * Größen für Postfächer und Mails (Anhänge) festlegen
# * TLS mit sicheren Versionen aktivieren
# * Dovecot-SSL-Zertifikate verwenden
# * ...
echo "
compatibility_level = 2
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix/sbin
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = $DT_INST_hostname
mydomain = $DT_INST_hostname
myorigin = \$mydomain
mydestination = \$myhostname, localhost.\$mydomain, localhost, $DT_INST_domain
relay_domains = \$mydestination
local_recipient_maps = unix:passwd.byname \$alias_maps
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
mynetworks = 127.0.0.0/8, 10.0.0.0/24
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = \$myhostname ESMTP \$mail_name
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd \$daemon_directory/\$process_name \$process_id & sleep 5
sendmail_path = /usr/sbin/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
inet_protocols = ipv4
message_size_limit = 104857600
mailbox_size_limit = 10737418240
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = \$myhostname
smtpd_recipient_restrictions = permit_mynetworks, permit_auth_destination, permit_sasl_authenticated, reject
smtpd_use_tls = yes
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_cert_file = /etc/dovecot/private/dovecot.pem
smtpd_tls_key_file = /etc/dovecot/private/dovecot.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
smtpd_tls_mandatory_ciphers = high
smtpd_tls_exclude_ciphers = ECDHE-RSA-RC4-SHA
smtpd_tls_mandatory_exclude_ciphers = ECDHE-RSA-RC4-SHA
smtpd_tls_received_header = yes
" > /etc/postfix/main.cf
# Weiterverarbeitungsregeln für eingehende Mails konfigurieren und verschlüsselten Zugriff aktivieren
echo 'smtp inet n - y - - smtpd
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
pickup unix n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - y 1000? 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
trace unix - - y - 0 bounce
verify unix - - y - 1 verify
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - y - - smtp
relay unix - - y - - smtp
-o syslog_name=postfix/$service_name
showq unix n - y - - showq
error unix - - y - - error
retry unix - - y - - error
discard unix - - y - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - y - - lmtp
anvil unix - - y - 1 anvil
scache unix - - y - 1 scache
postlog unix-dgram n - n - 1 postlogd
maildrop unix - n n - - pipe
flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
uucp unix - n n - - pipe
flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe
flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe
flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix - n n - 2 pipe
flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman unix - n n - - pipe
flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
${nexthop} ${user}
' > /etc/postfix/master.cf
if [ -L /etc/postfix/./makedefs.out ]
then
rm /etc/postfix/./makedefs.out
fi
systemctl restart dovecot
newaliases
systemctl restart postfix
}
# Die "Hauptdomain", auf der der Mailserver läuft
export DT_INST_hostname='example.com'
# Kommagetrennte Liste aller (Sub-) Domains für die der Server Mails akzeptieren soll
export DT_INST_domain='example.com, subdomain.example.com, example2.com'
# Installation und Konfiguration starten
CI_mailServerInstall
adduser <Benutzername> --shell /bin/false