Kurzanleitungen/Howtos

Mailserver automatisch einrichten

01.07.2020

Mailserver

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.

Mailserverinstallationsskript

#!/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

Mailkonten einrichten

Das Einrichten von Mailkonten ist bewußt einfach gehalten und an die normalen Nutzerkonten gebunden. Jedes Nutzerkonto ist somit gleichzeitig auch Mailkonto. Benutzername und Paßwort sind für beide identisch. Möchte man ein reines Mailkonto einrichten, das keine Anmeldung (z.B. per SSH) erlauben, so wird die zu benutzende Shell auf "/bin/false" gesetzt:
adduser <Benutzername> --shell /bin/false
Achtung! Achtung! Die folgenden Anweisungen richten sich ausschließlich an fachkundige Personen. Bei jedem Schritt kann es zum kompletten Datenverlust kommen. Alle Angaben ohne Gewähr!