Linux: E-Mails mit Stunnel, Getmail, OpenSMTPd, Dovecot und Tor

Verschlüsselt, anonymisiert, schützt alles!

Die Anleitung richtet ein Mailsystem für einen Rechner mit einem Benutzer ein, für den mit getmail 6 verschlüsselt über Stunnel und optional „anonymisiert“ über Tor E-Mails von verschiedenen POP3 Konten mehrerer Anbieter abgeholt werden, die der Benutzer anschließend neben den internen E-Mails, die OpenSMTPd zustellt, gesammelt über Dovecot als lokalem POP3 Server mit seiner E-Mail Anwendung abruft. E-Mails zum Versand versendet der Benutzer mit seiner E-Mail Anwendung oder dem Mixmaster Remailer Client verschlüsselt über Stunnel und optional „anonymisert“ über Tor. Zu Getmail wird auch die Einbindung von SpamAssassin und ClamAV zur Spam- und Malware-Erkennung angesprochen.

Man kann die Komponenten zusätzlich mit AppArmor und Chroot-Umgebungen oder Chroot-Funktionen regulieren und absichern, worauf die Anleitung nicht eingeht. Falls man die Anleitung umsetzen will, sollte man vorher ein vollständiges Backup aller Konfigurationen, Verzeichnisse, Dateien etc. des bisher eingesetzten Mailsystems anfertigen. Nach dem Backup und vor der praktischen Umsetzung sollten alle beteiligten Dienste, ev. Cron-Jobs usw. des bisherigen Mailsystems gestoppt oder deinstallieren werden.

Stunnel

Stunnel tunnelt die Verbindungen von Anwendungen über TLS-Tunnel, basierend auf OpenSSL, die selbst keine TLS-Verschlüsselung beherschen oder Server-Zertifikate nicht verifizieren können. Stunnel kann aber auch für Anwendungen verwendet werden, die TLS beherrschen, wenn man sich nicht auf die Verschlüsselungsfunktionen der Anwendungen verlassen oder weil man genaue Vorgaben und spezielle Optionen bezüglich der TLS-Verschlüsselung setzen will. Allerdings muss man sich mit Stunnel auf die Sicherheit von OpenSSL und Stunnel verlassen.

Installation

Nach dem Download der Stunnel Quellcode-Archivdatei, der GnuPG-Signaturdatei und/oder SHA256 Prüfummendatei, wird die Archivdatei nach Import des auf der Seite verlinkten GnuPG-Schlüssels überprüft:

cd /pfad/downloadverzeichnis
gpg --verify stunnel-version.tar.gz.asc
sha256sum -c stunnel-version.tar.gz.sha256

Nach erfolgreicher Überprüfung wird Stunnel kompiliert und installiert:

tar -xzf stunnel-version.tar.gz
cd stunnel-version
./configure --sysconfdir=/etc --localstatedir=/var [--disable-ipv6] --disable-libwrap --disable-fips --disable-systemd
make
sudo make install

Benutzerkonto

Neues Konto und nötige Verzeichnisse für den stunnel Systembenutzer anlegen:

sudo adduser --system --disabled-password --disabled-login --home /run/stunnel --shell /bin/false --group stunnel
id -u stunnel
sudo mkdir /var/log/stunnel
sudo mkdir /run/stunnel
sudo chown stunnel:adm /var/log/stunnel
sudo chown stunnel:stunnel /run/stunnel
sudo chmod 750 /var/log/stunnel
sudo chmod 2750 /run/stunnel

Logrotation

Die folgende Konfiguration zum Rotieren der Stunnel Logdateien anlegen:

/etc/logrotate.d/stunnel
/var/log/stunnel/*.log {
        daily
         missingok
         rotate 4
         compress
         delaycompress
         notifempty
         create 640 stunnel adm
         sharedscripts
         copytruncate
}
sudo mv /pfad/stunnel /etc/logrotate.d/
sudo chown root:root /etc/logrotate.d/stunnel
sudo chmod 644 /etc/logrotate.d/stunnel

Konfiguration

Die folgende Stunnel Konfigurationsdatei installieren:

/etc/stunnel/stunnel.conf
; generelle Stunnel Optionen
client = yes
debug = 7
foreground = no
log = append
output = /var/log/stunnel/stunnel.log
pid = /run/stunnel/stunnel.pid
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1
syslog = no
 
; generelle OpenSSL Optionen
RNDbytes = 32
RNDfile = /dev/urandom
CApath = /etc/ssl/certs
CRLpath = /etc/ssl/crls
ciphers = Liste (für TLSv1.2)
ciphersuites = Liste (für TLSv1.3)
sslVersionMin = TLSv1.2
sslVersionMax = TLSv1.3
options = NO_COMPRESSION
options = NO_TICKET
options = SINGLE_DH_USE
options = -TLS_ROLLBACK_BUG
options = -CIPHER_SERVER_PREFERENCE
options = -ALLOW_UNSAFE_LEGACY_RENEGOTIATION
options = -LEGACY_SERVER_CONNECT
sessionCacheSize = 1
sessionResume = no
 
 
; E-Mail Konten
[konto-pop]
accept = 127.0.0.1:nnn1
; protocol = pop3
connect = pop.domain.tld:995
; mit Tor Onion Service:
connect = string.onion:995
sni = pop.domain.tld
checkHost = [pop.]domain.tld
requireCert = no
verifyChain = yes
verifyPeer = yes
securityLevel = >=2
 
[konto-smtp]
accept = 127.0.0.1:nnn2
; protocol = smtp
connect = smtp.domain.tld:[465|587]
; mit Tor Onion Service:
connect = string.onion:[465|587]
sni = smtp.domain.tld
checkHost = [smtp.]domain.tld
requireCert = no
verifyChain = yes
verifyPeer = yes
securityLevel = >=2
 
; [remailer-smtp]
; accept = 127.0.0.1:2525
; protocol = smtp
; connect = sub.remailer.tld:[465|587]
; sni = sub.remailer.tld
; checkHost = [sub.]remailer.tld
; cerifyChain = no
; verifyPeer = yes
; securityLevel = >=2
sudo mv /pfad/stunnel.conf /etc/stunnel/stunnel.conf
sudo chown root:stunnel /etc/stunnel/stunnel.conf
sudo chmod 640 /etc/stunnel/stunnel.conf

Erläuterung

Generelle Stunnel Optionen

Siehe man stunnel.

E-Mail Konten

Für jedes E-Mail Konto wird dessen Konfiguration in einem eigenen [Konto-Abschnitt] festgelegt. Mit accept = 127.0.01:Port teilt man Stunnel mit, für das Konto lokal am angegebenen Port Verbindungen entgegenzunehmen. Muss man STARTTLS verwenden, ist die protocol = pop3|smtp Zeile anzugeben. Mit connect = Hostname:Port teilt man Stunnel den Hostnamen des Mailservers und dessen Port mit, zu dem Stunnel die Verbindung weiterleiten soll und mit sni = Hostname wird zwecks Server Name Indication laut RFC 3546 - Transport Layer Security (TLS) Extensions der Hostname des Mailservers nochmals eingetragen. Von den generellen Optionen abweichende Optionen kann man ebenfalls angeben.

Mit der verifyChain Option bestimmt man, dass die gesamte Zertifikatskette von der Root CA bis zum Server-Zertifikat des Mailservers überprüft wird. Mit verifyPeer wird das vom Mailserver präsentierte Zertifikat gegen das lokal gespeicherte Server-Zertifikat des Mailservers geprüft. Will man die CA-Zertifikate bzw. die Zertifikatskette ausschließen und nur das Server-Zertifikat prüfen, setzt man verifyChain = no. Im obigen Beispiel ist das im [remailer-smtp] Abschnitt der Fall, wenn z. B. ein Remailer ein selbstsigniertes Zertifikat verwendet. Zusätzlich wird mit der checkHost Option ein Host- bzw. Domainnamen angeben, der im Server-Zertifikat enthalten sein muss. Neben checkHost kann mit checkEmail und checkIP auch gegen eine im Zertifikat enthaltene E-Mail Adresse oder IP-Adresse geprüft werden.

Mit der securityLevel Option wird vorgegeben, welchen Sicherheitsgrad eine TLS-Verbindung ingesammt aufweisen muss, ausgedrückt in 80 - 256bit oder Level 0 – 5 (siehe man SSL_CTX_set_security_level). Das umfasst Cipher-Suites, TLS-Versionen, Algorithmen und Längen der verwendeten Schlüssel und MACs, Kompression, Session-Tickets. Zum Beispiel bestimmt Level 2 (112bit): RSA, DSA und DH Schlüssel >= 2048bit, ECC Schlüssel >=224bit, keine Export Cipher-Suites oder Cipher-Suites mit RC4, kein SSLv3, deaktivierte Kompression und Level 3 (128bit): zusätzlich RSA, DSA und DH Schlüssel >= 3072bit, ECC Schlüssel >=256bit, keine Cipher-Suites ohne Forward Secrecy, kein TLS < 1.1, deaktivierte Session-Tickets. Der maximale Sicherheitsgrad, den man setzen kann ist natürlich abhängig davon, was der Mailserver bzw. Mailanbieter maximal unterstützt.

Wer Mixmaster oder Mixmaster4096 verwendet und selbst kompiliert, kann vorher in der mix.c Datei die SMTPPORT Variable auf die Portnummer ändern, an der Stunnel auf Verbindungen zu dem Mixmaster Remailer lauscht, der Mixmaster Nachrichten per TLS oder STARTTLS entgegennimmt, da zumeist bereits ein lokaler MTA auf Port 25 lauscht.

mixmaster/src/mix.c
/* addresses */
SMTPPORT = 25;

Anschließend trägt man in seine mix.cfg Konfigurationsdatei für Mixmaster ein:

mix.cfg
REMAIL          n
SMTPRELAY       127.0.0.1
SMTPPORT        2525
CHAIN           sub.remailer.tld,*,*,*
Generelle OpenSSL Optionen

Welche TLS-Versionen und Cipher-Suites Stunnel für eine verschlüsselte Verbindung mit einem Mailserver verwendet, richtet sich nach den sslVersion Optionen, mit dem man vorgibt, welche TLS-Versionen akzeptiert bzw. unterstützt werden und den Parametern der ciphersuites bzw. ciphers Option, mit der man den Katalog der Cipher-Suites angibt, die Stunnel dem Mailserver als unterstützte Cipher-Suites signalisiert. Da man nur >= TLS 1.2 als TLS-Version einsetzen sollte, wird sslVersionMin = TLSv1.2, sslVersionMax = TLSv1.3 gesetzt. Wenn ein E-Mail Anbieter z. B. nur TLS < 1.2 anbietet, sollte man den Anbieter aufgeben.

Mit options = -OPTION könnnen zusätzliche OpenSSL Optionen „deaktiviert“ bzw. von Stunnel nicht verwendet werden. Die Optionen dienen dazu, die Aufnahme und TLS-Verschlüsselung der Verbindung möglichst sicher einzurichten. Für nähere Informationen zur Bestimmung der options OpenSSL Optionen:

sudo aptitude install libssl-doc libssl-dev
man SSL_CTX_set_options
less /usr/include/openssl/ssl.h
stunnel -options

Für nähere Informationen zu Algorithmen und Cipher-Suites, die von der installierten OpenSSL-Version unterstützt werden:

openssl ciphers -v
man ciphers

Für die ciphers Option kann man z. B. setzen:

ciphers = ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256

Für die ciphersuites Option kann man z. B. einsetzen:

ciphersuites = TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256

Prüfung der Mailserver

Zur Bestimmung der generellen OpenSSL Optionen und der kontenspezifischen Optionen in jedem E-Mail [Konto-Abschnitt] muss man zu jedem E-Mail Konto neben dem Hostnamen des POP3 und SMTP Servers außerdem in Erfahrung bringen:

  • soll oder kann die Verbindung zum Mailserver per TLS und/oder STARTTLS erfolgen?
  • auf welchen Ports lauscht der Mailserver?
  • wie lautet die maximale TLS-Version, die der Mailserver unterstützt?
  • welche Cipher Suites unterstützt der Mailserver?

Für die benötigten Informationen kann man das testssl Skript oder die OpenSSL s_client Anwendung verwenden, um die Server vorab zu überprüfen.

mit testssl
testssl --cipher-per-proto --preference --server-defaults --quiet hostname:port
mit openssl s_client

TLS zum POP3 Server

openssl s_client -connect pop.domain.tld:[995|110] -no_ssl3 -no_tls1 -no_tls1_1 -verify 3 -CApath /etc/ssl/certs/

TLS zum SMTP Server

openssl s_client -connect smtp.domain.tld:[465|587] -no_ssl3 -no_tls1 -no_tls1_1 -verify 3 -CApath /etc/ssl/certs/

STARTTLS zum POP3 Server

openssl s_client -connect pop.domain.tld:[110|995] -starttls pop3 -no_ssl3 -no_tls1 -no_tls1_1 -verify 3 -CApath /etc/ssl/certs/

STARTTLS zum SMTP Server

openssl s_client -connect smtp.domain.tld:[587|465] -starttls smtp -no_ssl3 -no_tls1 -no_tls1_1 -verify 3 -CApath /etc/ssl/certs/

Beispielausgabe (gekürzt) für die Überprüfung und den Download des POP3 Servers des E-Mal Anbieters Posteo:

openssl s_client -connect posteo.de:995 -no_ssl3 -no_tls1 -no_tls1_1 -verify 3 -CApath /etc/ssl/certs/
verify depth is 3
depth=2 ... CN = StartCom Certification Authority
verify return:1
depth=1 ... CN = StartCom EV Server CA
verify return:1
depth=0 ... CN = www.posteo.de
verify return:1

Die Überprüfung des Server-Zertifikats gegen die CA-Zertifikate im Zertifikatsspeicher (Zertifikatskette) ergab keine Probleme – sofern man der herkömmlichen PKI/CA Infrastruktur noch Vertrauen schenkt.

echo | openssl s_client -connect domain.tld:port -no_ssl3 -no_tls1 -no_tls1_1 -verify 3 -CApath /etc/ssl/certs/ | awk '/-----BEGIN CERTIFICATE-----/, /-----END CERTIFICATE-----/' > /pfad/domain_tld.pem

Der Zertifikats-Block des Servers wird in domain_tld.pem Dateien abgespeichert, als root in den Zertifikatsspeicher unter /etc/ssl/certs verschoben und die symbolischen Hash-Links im Zertifikatsspeicher aktualisiert:

sudo mv /pfad/domain_tld.pem /etc/ssl/certs
sudo chmod 644 /etc/ssl/certs/domain_tld.pem
sudo c_rehash /etc/ssl/certs

Der gleiche Vorgang wiederholt sich bei Ablauf der Gültigkeit und Aktualisierung eines Zertifikats. Deshalb lässt man sich noch den Fingerprint ausgeben und notiert sich aus der Ausgabe z. B. in einer Kalenderanwendung die wichtigsten Daten zu den Server-Zertifikaten:

openssl x509 -fingerprint -in /etc/ssl/certs/domain_tld.pem -text
openssl x509 -fingerprint -in /etc/ssl/certs/posteo_de.pem -text 
Beispiel: Posteo Zertifikat-Daten
posteo.de:995 (POP3)
SHA1 Fingerprint=3A:89:D8:AD:DC:A7:23:5C:8F:44:E9:DD:2E:85:6A:31:D2:D3:C9:70
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=IL, O=StartCom Ltd., OU=StartCom Certification Authority, CN=StartCom Extended Validation Server CA
Validity
Not Before: Apr 16 13:03:06 2014 GMT
Not After : Apr 16 16:23:04 2016 GMT

Bei E-Mail Anbietern, die Angaben zu Fingerprints und aktuell gültigen Server-Zertifikaten auf ihren Webseiten veröffentlichen, wie z. B. im Posteo-Impressum, kann man den Fingerprint zusätzlich abgleichen. Außerdem kann man ergänzend regelmäßig die Stunnel Logdatei auf Unregelmäßigkeiten prüfen und sich Treffer per E-Mail zusenden lassen:

/etc/cron.d/stunnelzertcheck
# /etc/cron.d/stunnelcertcheck: Check auf Zertifikatefehler
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/bin
 
15 */3 * * * root    /pfad/bin/stunnelcheck
 
# EOF
/pfad/stunnelcheck
#!/bin/sh
 
stunnellog="/var/log/stunnel/stunnel.log"
match="$(egrep -c -i "(certificate (unknown|not found in local repository|(check|verify) failed)|public keys do not match)" $stunnellog)"
 
if [ "$match" -gt 0 ]; then
  printf "Zertifikat-Fehlermeldungen liegen vor\n" && \
  printf "Im stunnel.log wurden Zertifikat-Fehlermeldungen entdeckt:\n\n=====\n$(egrep -i -m 1 -n -B 22 -e "(certificate (unknown|not found in local repository|(check|verify) failed)|public keys do not match)" $stunnellog)\n=====\n\nBitte Zertifikate überprüfen und aktualisieren." | mail -s "[stunnel] Zertifikatfehler" root && \
  logrotate -f /etc/logrotate.d/stunnel
else
  exit 0
fi
 
exit 0

Inbetriebnahme

Die folgende systemd Unit-Datei installieren. Wer Stunnel ohne Tor betreibt, entfernt tor.service und ändert den ExecStart Aufruf in /usr/local/bin/stunnel.

/etc/systemd/system/stunnel.service
[Unit]
Description=Stunnel Daemon
After=network.target network-online.target tor.service
Wants=network-online.target tor.service
 
[Service]
Type=forking
RuntimeDirectory=stunnel
RuntimeDirectoryMode=02750
PIDFile=/run/stunnel/stunnel-mix.pid
User=stunnel
ExecStart=/etc/systemd/scripts/stunnel-tor
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=180s
UMask=0027
PrivateTmp=true
PrivateDevices=true
InaccessiblePaths=/boot /root /home
ReadOnlyPaths=/etc /usr
ReadWritePaths=/var/log/stunnel
NoNewPrivileges=true
CapabilityBoundingSet=
RestrictNamespaces=~cgroup ipc net mnt pid user uts
LockPersonality=true
MemoryDenyWriteExecute=true
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
ProtectSystem=full
ProcSubset=pid
RestrictAddressFamilies=AF_INET AF_UNIX
RestrictRealtime=true
RestrictSUIDSGID=true
RemoveIPC=true
SystemCallArchitectures=native
SystemCallFilter=@system-service
SystemCallErrorNumber=EPERM
 
[Install]
WantedBy=multi-user.target
sudo mv /pfad/stunnel.service /etc/systemd/system/stunnel.service
sudo chown root:root /etc/systemd/system/stunnel.service
sudo systemctl enable stunnel.service
sudo systemctl start stunnel.service

Wer die Stunnel-Verbindungen über Tor anonymisieren will und dafür torsocks installiert hat, installiert zusätzlich das stunnel-tor Skript:

/etc/systemd/scripts/stunnel-tor
#!/bin/sh
# mit torsocks Log:
LD_PRELOAD=/usr/local/lib/torsocks/libtorsocks.so TORSOCKS_LOG_LEVEL=5 TORSOCKS_LOG_FILE_PATH=/var/log/stunnel/torsocks.log /usr/local/bin/stunnel /etc/stunnel/stunnel.conf
# ohne torsocks Log:
LD_PRELOAD=/usr/local/lib/torsocks/libtorsocks.so /usr/local/bin/stunnel /etc/stunnel/stunnel.conf
 
exit 0
sudo mv /pfad/stunnel-tor /etc/systemd/scripts/
sudo chown root:root /etc/systemd/scripts/stunnel-tor
sudo chmod 755 /etc/systemd/scripts/stunnel-tor

Getmail

Getmail ist dafür zuständig, E-Mails mehrerer E-Mail Konten auf POP3 Servern abzuholen. Die Abholung wird per systemd Timer angestoßen und die TLS-Verschlüsselung über Stunnel durchgeführt. Die Stunnel Verbindungen können wiederum mit torsocks über Tor getunnelt und „anonymisiert“ werden. Da bei der herkömmlichen Verwendung von Getmail durch den Benutzer die Getmail Konfigurationsdateien im Heimatverzeichnis des Benutzers mit den enthalten E-Mail Anmeldenamen und Passphrasen im Klartext vorliegen (und damit hypothetisch ausgelesen werden könnten), wird die Getmail Konfiguration ausgelagert und der Prozess der Mail-Abolung nicht mehr durch den Benutzer durchgeführt, sondern durch einen eigenen getmail Systembenutzer. Der Benutzer hat danach auch keine eigene mbox Datei unter /var/mail und auf die mbox Datei des getmail Systembenutzers keinen direkten Zugriff.

Installation

sudo aptitude install getmail6 lockfile-progs

Benutzerkonto

Für Getmail wird der getmail Systembenutzer angelegt, der mit Getmail die E-Mails abholt.

sudo adduser --system --disabled-password --disabled-login --home /var/lib/getmail --shell /bin/false --group getmail

Danach wird das getmail Heimatverzeichnis vorbereitet:

sudo mkdir /var/lib/getmail/{.getmail,.mail,.logs}

Übergabe an getmail bei bereits bestehender mbox Datei oder Anlegen der getmail mbox Datei:

sudo mv /var/mail/mboxdatei /var/mail/getmail
sudo chown -R getmail:mail /var/mail/
sudo chmod 770 /var/mail/
sudo chmod 600 /var/mail/getmail
sudo touch /var/mail/getmail
sudo chown -R getmail:mail /var/mail/
sudo chmod 770 /var/mail/
sudo chmod 600 /var/mail/getmail

Logrotation

Die folgende Konfiguration zum Rotieren der Getmail Logdateien anlegen:

/etc/logrotate.d/getmail
/var/lib/getmail/.logs/getmail.log
{
        rotate 2
        weekly
        missingok
        notifempty
        compress
        create 0640 getmail getmail
        prerotate
          if [ -f "/var/lock/getthemail.lock" ];
            then
               # Abholung aller E-Mails <= 10 Min.
                sleep 600
          fi
        endscript
}
sudo mv /pfad/getmail /etc/logrotate.d/
sudo chown root:root /etc/logrotate.d/getmail
sudo chmod 644 /etc/logrotate.d/getmail

Konfiguration

Für jedes E-Mail Konto, für das Getmail E-Mails von einem POP3 Server abholen soll, wird ein Unterverzeichnis in /var/lib/getmail/.getmail/ angelegt:

sudo mkdir /var/lib/getmail/.getmail/{konto1,konto2,kontoN}

In jedem Unterverzeichnis wird eine getmailrc Konfigurationsdatei nach folgendem Schema angelegt.

/var/lib/getmail/.getmail/konto/getmailrc
[retriever]
type = SimplePOP3Retriever
server = 127.0.0.1
port = nnnn
username = benutzername[@domain.tld]
password = passphrase
 
[filter-1]
type = Filter_classifier
path = /usr/bin/clamdscan
arguments = ("--stdout", "--no-summary", "-")
exitcodes_keep = (0,1)
 
[filter-2]
type = Filter_external
path = /usr/bin/reformail
arguments = ("-R", "X-getmail-filter-classifier:", "X-Virus-Clamscan:")
 
[filter-3]
type = Filter_external
path = /usr/bin/spamc
arguments = ("-p","spamd-port","-u","debian-spamd","-4","-s","1000000")
 
[destination]
type = Mboxrd # oder Maildir
path = /var/mail/getmail
 
[options]
verbose = 1
read_all = false
delete = true
message_log = ~/.logs/getmail.log
message_log_verbose = true
delivered_to = false

Erläuterung

[retriever]

Getmail bringt zwar auch den SimplePOP3SSLRetriever mit, der aber nicht so viele Optionen zur Konfiguration der TLS-Transportverschlüsselung bietet wie Stunnel, mit dem für den SimplePOP3Retriever die TLS-Transportverschlüsselung zum POP3 Server aufgebaut wird. Als Parameter der server und port Variablen wiederholen sich die accept = Angaben im [konto-pop] Abschnitt in der stunnel.conf Datei (s. o.). Anschließend folgen Benutzername und Passwort, mit denen man sich beim Mailserver anmeldet.

[filter[-n]]

Hier können optional alle möglichen Anwendungen als Filter eingebunden werden, an die Getmail E-Mails nach ihrem Erhalt zur Verarbeitung weiterleitet. Im obigen Beispiel wird mit dem ersten Filter die E-Mail mit clamdscan und dem clamd Daemon von ClamAV auf Malware untersucht. Mit exitcodes_keep = (0,1) werden E-Mails mit Funden nur markiert, mit exitcodes_drop = (1,) nicht ausgeliefert. Der zweite Filter schreibt mit Hilfe von reformail aus dem Maildrop Paket den Namen der Getmail Kopfzeile, in der das Resultat des ClamAV-Scans steht, in „X-Virus-Clamscan:“ um. Danach folgt als dritter Filter der Aufruf der spamc Anwendung für den spamd Daemon von SpamAssassin zur Spam-Erkennung und -Markierung.

[options]

Mit read_all = false holt Getmail nur E-Mails, die er noch nicht gesehen hat, also nur neue E-Mails und mit delete = true wird sichergestellt, dass E-Mails nach ihrer Abholung nicht auf dem POP3 Server verbleiben, sondern gelöscht werden. Nicht mehr vorhandene E-Mails können auch nicht mehr abgegriffen oder „beauskunftet“ werden. Vor dem ersten Start sollte man einmal read_all = true setzen, um die Mailbox auf dem POP3 Server vollständig zu leeren. Mit den optionalen message_log Optionen kann man die Mail-Abholung und aufgetretene Fehler über die getmail.log Logdatei protokollieren lassen.

Für alle E-Mail Konten werden die enstprechenden Getmail Konfigurationen in die passenden Kontenverzeichnisse verschoben und abschließend alles dem getmail Systembenutzer übergeben:

sudo mv /pfad/getmailrc /var/lib/getmail/.getmail/kontoN/
sudo chmod 750 /var/lib/getmail
sudo chown -R getmail:getmail /var/lib/getmail

Inbetriebnahme

Im Pfad wird das getmail_master Skript angelegt und für den getmail Systembenutzer ausführbar gemacht.

/usr/local/bin/getmail_master
#!/bin/sh
 
lock_file="/var/lock/getthemail"
 
if [ ! -f "${lock_file}".lock ]; then
  lockfile-create "${lock_file}"
  lockfile-touch "${lock_file}" &
  # Save the PID of the lockfile-touch process
  badger="$!"
  for getdir in $( find /var/lib/getmail/.getmail -name getmailrc -print | sed "s/\/getmailrc//g" )
  do
    /usr/bin/getmail -v --getmaildir=${getdir}
  done
  kill "${badger}"
  lockfile-remove "${lock_file}"
fi
 
exit 0
sudo mv /pfad/getmail_master /usr/local/bin/getmail_master
sudo chmod 750 /usr/local/bin/getmail_master
sudo chown root:getmail /usr/local/bin/getmail_master

Das Skript wird per systemd Unit und Timer für alle E-Mail Konten, für die eine getmailrc Konfigurationsdatei existiert (s. o.), die E-Mails abholen lassen. Nachdem die Konfiguration für Getmail und den getmail Systembenutzer abgeschlossen ist, werden die systemd Dateien angelegt:

/etc/systemd/system/getmail.service
[Unit]
Description=Get Mail
After=network-online.target nss-lookup.target
Wants=network-online.target
 
[Service]
ExecStart=/bin/sh -c 'sudo -H -u getmail /usr/local/bin/getmail_master'
StandardOutput=null
InaccessiblePaths=/boot /root /home
/etc/systemd/system/getmail.timer
[Unit]
Description=Get Mail
 
[Timer]
OnCalendar=*:00/31:00
AccuracySec=1s
 
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable getmail.timer

Alle 31 Minuten werden als getmail Systembenutzer mit Getmail die E-Mails aller POP3 Konten über Stunnel abgerufen und nach der optionalen Filterung in der /var/mail/getmail mbox Datei gespeichert, die Dovecot als lokaler POP3 Server verwaltet. Der Benutzer holt alle externen und internen E-Mails mit seiner E-Mail Anwendung von Dovecot ab.

OpenSMTPd

Der OpenSMTPd Mailserver übernimmt als MTA die Aufgabe, E-Mail Benachrichtigungen von lokalen Diensten und Skripten entgegenzunehmen und in der mbox Mailbox des lokalen getmail Benutzers zu speichern.

Installation

sudo aptitude install opensmtpd

Konfiguration

sudo vi /etc/smtpd.conf
/etc/smtpd.conf
table aliases file:/etc/aliases
listen on lo inet4
action "local" mbox alias <aliases>
match for local action "local"

Da die E-Mails später als getmail Benutzer über Dovecot aus der mbox Datei von getmail abgerufen werden und dehalb auch alle internen E-Mails an getmail weiterzuleiten sind, müssen die Aliase geändert und danach aktualisieren werden:

sudo vi /etc/aliases
/etc/aliases
name:getmail
sudo smtpctl update table aliases
sudo systemctl stop opensmtpd.service
sudo systemctl disable opensmtpd.service
sudo cp /usr/lib/systemd/opensmtpd.service /etc/systemd/system/
sudo vi /etc/systemd/system/opensmtp.service
/etc/systemd/system/opensmtpd.service
[Unit]
Description=OpenSMTPD
After=syslog.target network.target
Wants=network.target
 
[Service]
Type=forking
ExecStart=/usr/sbin/smtpd
Restart=on-failure
RestartSec=10s
UMask=0027
PermissionsStartOnly=true
NoNewPrivileges=true
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID CAP_SYS_CHROOT CAP_KILL CAP_DAC_READ_SEARCH CAP_CHOWN
LockPersonality=true
MemoryDenyWriteExecute=true
PrivateDevices=true
PrivateTmp=true
InaccessiblePaths=/boot /root /home
ReadOnlyPaths=/etc /usr
ReadWritePaths=/var/mail/getmail /var/spool/smtpd
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
ProtectSystem=full
ProcSubset=pid
RemoveIPC=true
RestrictAddressFamilies=AF_INET AF_UNIX AF_NETLINK
RestrictNamespaces=~cgroup ipc net mnt pid user uts
RestrictRealtime=true
RestrictSUIDSGID=true
SystemCallArchitectures=native
SystemCallErrorNumber=EPERM
 
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable opensmtpd.service
sudo systemctl start opensmtpd.service

Dovecot

Installation

sudo aptitude install dovecot-pop3d
sudo systemctl stop dovecot

Konfiguration

/etc/dovecot/dovecot.conf
dovecot_config_version = 2.4.0
dovecot_storage_version = 2.4.0
# protocols = ...
!include_try /usr/share/dovecot/protocols.d/*.protocol
base_dir = /run/dovecot/
shutdown_clients = yes
# !include conf.d/*.conf
!include_try local.conf

Die Konfiguration bewirkt, dass Dovecot nur die dovecot.conf und die einzubindende local.conf Datei heranzieht und die Teil-Konfigurationsdateien unter /etc/dovecot/conf.d/ unberührt bleiben, aus denen nötige Einstellungen in die local.conf Datei übertragen werden.

Da für die Konfiguration die UID und GID von getmail nötig sind, lässt man sie sich ausgeben:

id getmail

Anschließend erstellt man die local.conf Konfigurationsdatei mit dem nachfolgenden Inhalt, die über die obige include_try Anweisung in der dovecot.conf Datei beim Start von Dovecot ausgewertet wird. Für n1 wird die UID und für n2 die GID von getmail (s. o.) eingesetzt.

sudo touch /etc/dovecot/local.conf
sudo chmod 640 /etc/dovecot/local.conf
sudo vi /etc/dovecot/local.conf
/etc/dovecot/local.conf
auth_allow_cleartext = no
auth_debug_passwords = no
auth_verbose = no
auth_verbose_passwords = no
debug_log_path = /var/log/dovecot/debug.log
default_internal_user = dovecot
default_internal_group = dovecot
default_login_user = dovenull
first_valid_gid = n2
first_valid_uid = n1
info_log_path = /var/log/dovecot/info.log
last_valid_gid = n2
last_valid_uid = n1
log_path = /var/log/dovecot/error.log
mail_driver = mbox
mail_inbox_path = /var/mail/getmail
mail_log_fields = uid box from flags
mail_path = ~/.mail
mail_privileged_group = mail
mbox_write_locks = fcntl dotlock
pop3_lock_session = yes
pop3_no_flag_updates = yes
ssl = required
 
passdb passwd-file {
  driver = passwd-file
  passwd_file_path = /etc/dovecot/passwd.dovecot
}
 
userdb passwd-file {
  driver = passwd-file
  passwd_file_path = /etc/dovecot/passwd.dovecot
}
 
service stats {
  unix_listener stats-writer {
    user = root
    group = root
    mode = 0600
  }
}
 
service auth {
  user = $SET:default_internal_user
}
 
service pop3-login {
  chroot = login
  process_limit = 2
  process_min_avail = 1
  service_restart_request_count = 1
  user = $SET:default_login_user
 
  inet_listener pop3 {
    port = 0
  }
 
  inet_listener pop3s {
    listen = 127.0.0.1
    port = 995
  }
}
 
protocol pop3 {
	pop3_uidl_format = %{uid | hex(8)}%{uidvalidity | hex(8)}
}
 
ssl_server {
  cert_file = /etc/dovecot/private/dovecot.pem
  dh_file = /etc/dovecot/dh.pem
  key_file = /etc/dovecot/private/dovecot.key
}

Benutzerkonto

Für den getmail Benutzer wird mit dem SHA512-CRYPT oder BLF-CRYPT Verfahren ein Passwort-Hash erzeugt.

doveadm pw -r 15000 -s SHA512-CRYPT -u getmail
doveadm pw -r 15 -s BLF-CRYPT -u getmail
Enter new password:
Retype new password:
{schema}string

Für den getmail Benutzer wird mit seinem Benutzernamen, dem ausgeworfenen Passwort-Hashstring, seiner UID, GID und seinem Heimatverzeichnis ein Eintrag in der Benutzer- und Passwort-Datenbankdatei erstellt:

sudo touch /etc/dovecot/passwd.dovecot
sudo chmod 640 /etc/dovecot/passwd.dovecot
sudo chown root:dovecot /etc/dovecot/passwd.dovecot
sudo echo 'getmail:{schema}string:n1:n2::/var/lib/getmail::allow_nets=127.0.0.1/8' > /etc/dovecot/passwd.dovecot
Erläuterung

Nähere Informationen erhält man in der Dovecot Dokumentation. Nur so viel: Dovecot läuft nur als interner POP3S Server, der nur auf die mbox Datei von getmail unter /var/mail/getmail zugreift, wenn sich der getmail Benutzer nach Aufnahme einer TLS-verschlüsselten Verbindung mit seinem Benutzernamen und Passwort authentifiziert hat, die kombiniert in der Datei /etc/dovecot/passwd.dovecot gespeichert sind.

Logrotation

Die folgende Konfiguration zum Rotieren der Dovecot Logdateien anlegen:

/etc/logrotate.d/dovecot
/var/log/dovecot/*.log {
  weekly
  rotate 1
  missingok
  notifempty
  compress
  delaycompress
  sharedscripts
  postrotate
    doveadm log reopen
  endscript
}
sudo mv /pfad/dovecot /etc/logrotate.d/
sudo chown root:root /etc/logrotate.d/dovecot
sudo chmod 644 /etc/logrotate.d/dovecot

Inbetriebnahme

Die folgende systemd Unit-Datei installieren.

/etc/systemd/system/dovecot.service
[Unit]
Description=Dovecot IMAP/POP3 email server
After=local-fs.target network.target
Wants=network.target
 
[Service]
Type=simple
ExecStart=/usr/sbin/dovecot -F
NonBlocking=yes
Restart=on-failure
RestartSec=10s
UMask=0027
CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_FSETID CAP_KILL CAP_NET_BIND_SERVICE CAP_SETUID CAP_SETGID CAP_SYS_CHROOT CAP_MKNOD
RestrictAddressFamilies=AF_INET AF_UNIX
LockPersonality=true
MemoryDenyWriteExecute=true
PrivateDevices=yes
PrivateTmp=true
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true                                                                                           
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
ProcSubset=pid
ProtectSystem=full
InaccessiblePaths=/boot /root
RemoveIPC=true
RestrictNamespaces=~cgroup ipc net mnt pid user uts
RestrictRealtime=true
RestrictSUIDSGID=true
SystemCallArchitectures=native
SystemCallFilter=~@clock @keyring @module @raw-io ptrace @debug @reboot @swap @obsolete @cpu-emulation @resources
 
 
[Install]
WantedBy=multi-user.target

Danach kann Dovecot gestartet werden:

sudo systemctl daemon-reload
sudo systemctl start dovecot

Die E-Mail Anwendung

Anhand der Thunderbird E-Mail Anwendung, wobei man jede x-beliebige E-Mail Anwendung nehmen könnte:

Für den Abruf der E-Mails aller Konten wird ein „Dovecot“ Konto mit folgenden Angaben angelegt:

Servertyp (Protokoll) POP
Server localhost (127.0.0.1)
Port 995
Benutzername getmail
Passwort Klartext-Passwort, das mit doveadm für den getmail Benutzer vergeben wurde
Verbindungssicherheit SSL/TLS
Authentifizierungsmethode Passwort, normal

In allen anderen E-Mail Konten wird unter Server-Einstellungen der Mailabruf deaktiviert.

Für jedes E-Mail Konto wird unter Postausgang-Server (SMTP) ein Stunnel Serverkonto mit folgenden Angaben angelegt:

Server localhost (127.0.0.1)
Port Portnummer, an der Stunnel lt. stunnel.conf Datei für den SMTP-Server des Anbieters lauscht
Verbindungssicherheit
Authentifizierungsmethode
keine
Passwort, ungesichert übertragen

Da Stunnel die Übertragung des Benutzernamens und des Passworts zur Authentifizierung beim Anbieter und dafür den Aufbau der TLS-verschlüsselten Verbindung zum SMT-Server des Anbieters übernimmt.
Benutzername E-Mail Benutzer-ID des Anbieters

Verweise auf aktuelle Seite