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 |