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

Die Anleitung richtet ein Mailsystem für einen Rechner mit einem Benutzer ein, für den mit Getmail 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 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
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
setuid = -> id -u stunnel
setgid = -> id -u stunnel
client = yes
 
; generelle OpenSSL Optionen
RNDbytes = 64
RNDfile = /dev/urandom
CApath = /etc/ssl/certs
CRLpath = /etc/ssl/crls
ciphers = string (s. u.)
curve = prime256v1
options = NO_SSLv2
options = NO_SSLv3
options = NO_TLSv1
options = NO_TLSv1.1
options = NO_COMPRESSION
options = NO_TICKET
options = SINGLE_DH_USE
options = SINGLE_ECDH_USE
options = -DONT_INSERT_EMPTY_FRAGMENTS
options = -TLS_ROLLBACK_BUG
options = -CIPHER_SERVER_PREFERENCE
options = -ALLOW_UNSAFE_LEGACY_RENEGOTIATION
options = -LEGACY_SERVER_CONNECT
renegotiation = no
sessionCacheSize = 1
sessionCacheTimeout = 1
 
; E-Mail Konten
[konto-pop]
accept = 127.0.0.1:nnn1
; protocol = pop3
connect = pop.domain.tld:995 bzw. connect = string.onion:995 mit Tor Onion Service
sni = pop.domain.tld
verify = 3
requireCert = no
verifyPeer = yes
 
[konto-smtp]
accept = 127.0.0.1:nnn2
; protocol = smtp
connect = smtp.domain.tld:[465|587] bzw. connect = string.onion:[465|587] mit Tor Onion Service
sni = smtp.domain.tld
verify = 3
requireCert = no
verifyPeer = yes
 
; [remailer-smtp]
; accept = 127.0.0.1:2525
; protocol = smtp
; connect = sub.remailer.tld:[465|587]
; sslVersion = TLSv1.2
; sni = sub.remailer.tld
; verify = 4
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. Will oder 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 – wie z. B. verifiy im Remailer Abschnitt – ebenfalls angeben.

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 options = NO_Version Optionen, mit dem man vorgibt, welche SSL/TLS-Versionen nicht akzeptiert bzw. unterstützt werden und den Parametern der ciphers Option, mit der man den Katalog der Cipher Suites angibt, die Stunnel dem Mailserver als unterstützte Cipher Suites signalisiert. Mit options = -OPTION kann eine OpenSSL Option auch „deaktiviert“ bzw. von Stunnel nicht verwendet werden.

Da man außer TLS 1.2 keine der niedrigeren SSL/TLS-Versionen einsetzen sollte, werden alle niedrigeren Versionen kategorisch mit -NO_VERSION deaktiviert. Wenn ein E-Mail Anbieter z. B. nur SSL 3.0 oder TLS 1.0 anbietet, sollte man den Anbieter aufgeben. Andernfalls muss man den [Konto-Abschnitt] des Anbieters entsprechend abändern.

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 nähere Informationen zu den von der installierten OpenSSL-Version implementierten Kurven für die curve Stunnel Option und die ECDHE Cipher Suites:

openssl ecparam -list_curves

Solange die verwendete OpenSSL-Version kein Ed25519 als Alternative implementiert hat, bleibt nur eine der NIST-Kurven wie prime256v1 für die curve Option einzusetzen.

Den Standard-Katalog der Cipher Suites, die Stunnel als unterstützt an den Mailserver senden würdem erhält man mit:

openssl ciphers -v 'HIGH:MEDIUM:+3DES:+DH:!aNULL:!SSLv2'

Statt der Standard-Auswahl kann man auch den folgenden String setzen, wenn man z. B. nur Cipher Suites mit ECDHE/DHE für das Schlüsselaustauschverfahren (Kx) mit einmaligen Schlüsseln (E), RSA für die Authentifizierung (Au), AES128/AES-GCM128 für die symmatrische Verschlüsselung (Enc) und SHA256/AEAD, SHA256 und SHA1 für die Prüfsummen (Mac) einsetzen und anbieten will:

ciphers = HIGH:!ECDH-RSA-AES128-GCM-SHA256:!ECDH-ECDSA-AES128-GCM-SHA256:!ECDH-RSA-AES128-SHA256:!ECDH-ECDSA-AES128-SHA256:!ECDH-RSA-AES128-SHA:!ECDH-ECDSA-AES128-SHA:!ECDH-RSA-AES256-GCM-SHA384:!ECDH-ECDSA-AES256-GCM-SHA384:!ECDH-RSA-AES256-SHA384:!ECDH-ECDSA-AES256-SHA384:!ECDH-RSA-AES256-SHA:!ECDH-ECDSA-AES256-SHA:!DSS:!aNULL:!eNULL:!EXP:!MD5:!DES:!3DES:!SEED:!PSK:!SRP:!RC4:!ECDSA:!kRSA:!AES256:!CAMELLIA

was zum folgenden Cipher Suite Katalog führt:

ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256     TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128)    Mac=SHA256
ECDHE-RSA-AES128-SHA          SSLv3 Kx=ECDH Au=RSA Enc=AES(128)    Mac=SHA1
DHE-RSA-AES128-GCM-SHA256   TLSv1.2 Kx=DH   Au=RSA Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-SHA256       TLSv1.2 Kx=DH   Au=RSA Enc=AES(128)    Mac=SHA256
DHE-RSA-AES128-SHA            SSLv3 Kx=DH   Au=RSA Enc=AES(128)    Mac=SHA1

Die weiteren Optionen dienen dazu, die Aufnahme und TLS-Verschlüsselung der Verbindung möglichst sicher einzurichten. So werden u. a. Maßnahmen gegen TLS-Angriffe explizit aktiviert, jede TLS-Verbindung bzw. -Sitzung soll sich genauso wie die Schlüssel des DH-Schlüsselaustauschs einmalig und neu gestalten, wenn das Neuaushandeln von TLS-Sitzungen aktiviert (renegotiation = yes) ist, dann soll nur das sichere Neuaushandeln möglich sein und die Auswahl des TLS-Protokolls und der verwendeten Cipher Suites soll nicht dem Zufall bzw. der Präferenz des Mailservers überlassen, sondern durch Stunnel dem Mailserver (im Rahmen der von ihm unterstützen Protokollversionen und Cipher Suites) vorgegeben werden.

Mit der verify Option bestimmt man, wie das Server-Zertifikat des Mailservers überprüft wird. Mit verify = 3 wird das vom Mailserver präsentierte Zertifikat gegen das lokal gespeicherte Server-Zertifikat des Mailservers und alle beteiligten CA-Zertifikate geprüft. Will man die CA-Zertifikate bzw. die Zertifikatskette ausschließen und nur das Server-Zertifikat prüfen, setzt man verify = 4. Im obigen Beispiel ist das im [remailer-smtp] Abschnitt der Fall, wenn z. B. ein Remailer ein selbstsigniertes Zertifikat verwendet.

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 z. B. das sslyze Python-Skript verwenden, um die Server vorab zu überprüfen. Eine sslyze Alternative ist das testssl TLS-Prüfskript.

Nach Prüfung mit --tlsv1_2 zur Verwendung der TLS-Protokollversion 1.2 kann anschließend mit --tlsv1_1 und --tlsv1 weiter getestet werden, falls die Mailserver kein TLS 1.2 unterstützen. Mit --reneg wird getestet, ob der Mailserver das client-initiierte Neuaushandeln und das sichere Neuaushandeln von TLS-Sitzungen (s. o.) unterstützt. Das Resultat kann ein Indikator dafür sein, ob der Anbieter Wert auf die Absicherung von TLS-Verbindungen legt. Mit --hide_rejected_ciphers werden die Cipher-Suites nicht ausgegeben, die vom Mailserver eh nicht unterstützt werden.

cd /pfad/sslyze
./sslyze.py --help

TLS zum POP3 Server

./sslyze.py --sni pop.domain.tld --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers pop.domain.tld:995

TLS zum SMTP Server

./sslyze.py --sni smtp.domain.tld --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers smtp.domain.tld:[465|587]

STARTTLS zum POP3 Server

./sslyze.py --starttls=pop3 --sni pop.domain.tld --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers pop.domain.tld:[110|995]

STARTTLS zum SMTP Server

./sslyze.py --starttls=smtp --sni smtp.domain.tld --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers smtp.domain.tld:[587|465]

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

./sslyze.py --sni posteo.de --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers posteo.de:995
CHECKING HOST(S) AVAILABILITY
-----------------------------
posteo.de:995  => 89.146.220.134:995

SCAN RESULTS FOR POSTEO.DE:995 - 89.146.220.134:995
---------------------------------------------------
* TLSV1_2 Cipher Suites:
    Preferred:                       
              ECDHE-RSA-AES256-GCM-SHA384   ECDH-384 bits  256 bits
    Accepted:                        
              ECDHE-RSA-AES256-SHA384       ECDH-384 bits  256 bits
              ECDHE-RSA-AES128-SHA256       ECDH-384 bits  128 bits
              ECDHE-RSA-AES128-GCM-SHA256   ECDH-384 bits  128 bits
              ...
              DHE-RSA-AES128-GCM-SHA256     DH-1024 bits   128 bits

TLS mit TLS 1.2 zu posteo:995 ist möglich.

./sslyze.py --starttls=pop3 --sni posteo.de --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers posteo.de:995
CHECKING HOST(S) AVAILABILITY
-----------------------------
posteo.de:995  => WARNING: Could not connect (timeout); discarding corresponding tasks.

STARTTLS mit TLS 1.2 zu posteo.de:995 ist nicht möglich.

./sslyze.py --starttls=pop3 --sni posteo.de --reneg --certinfo=full --tlsv1_2 --hide_rejected_ciphers posteo.de:110
SCAN RESULTS FOR POSTEO.DE:110 - 89.146.220.134:110
---------------------------------------------------
siehe 1. Kommando

STARTTLS mit TLS 1.2 zu posteo.de:110 ist möglich.

Bezüglich der zu efragenden Merkmale:

  • Hostname: posteo.de
  • Verbindung möglich per TLS auf Port 995 oder STARTTLS auf Port 110
  • TLS 1.2 Protokoll wird unterstützt

Außerdem benötigt man das aktuelle und geprüfte Server-Zertifikat der Server und begleitende Metadaten.

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.

Server certificate
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Die Zertifikats-Blöcke der Server werden in host_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/host_domain_tld.pem /etc/ssl/certs
sudo chmod 644 /etc/ssl/certs/host_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/host_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 [-tor]

/etc/systemd/system/stunnel.service
[Unit]
Description=Stunnel Daemon
After=network.target network-online.target nss-lookup.target [tor.service]
Wants=network-online.target [tor.service]
 
[Service]
PIDFile=/run/stunnel/stunnel.pid
ExecStartPre=/usr/bin/install -Z -m 02750 -o stunnel -g stunnel -d /run/stunnel
ExecStart=/usr/local/bin/stunnel[-tor]
Type=forking
Restart=on-failure
RestartSec=5s
UMask=0027
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
InaccessibleDirectories=/boot
ReadOnlyDirectories=/etc /usr
NoNewPrivileges=true
SystemCallFilter=~@clock @cpu-emulation @keyring @module @mount @obsolete @raw-io ptrace
 
[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, verändert entsprechend den ExecStart Aufruf in der Unit-Datei und installiert zusätzlich das stunnel-tor Skript:

/usr/local/bin/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 /usr/local/bin/
sudo chown root:root /usr/local/bin/stunnel-tor
sudo chmod 755 /usr/local/bin/stunnel-tor

Getmail

Getmail ist dafür zuständig, E-Mails mehrerer E-Mail Konten auf POP3 Servern abzuholen. Die Abholung wird per Cron-Job 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 mehr unter /var/mail und auf die mbox Datei des getmail Systembenutzers keinen direkten Zugriff.

Installation

sudo aptitude install getmail4

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}

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

sudo touch /var/mail/getmail
sudo chown getmail:mail /var/mail/getmail
sudo chmod go-rw /var/mail/getmail
sudo chown getmail:mail /var/mail/benutzer
sudo mv /var/mail/benutzer /var/mail/getmail
sudo chmod go-rw /var/mail/getmail
drwxrwsr-x       root mail /var/mail
-rw-------      getmail mail /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. 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

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 mit dem Kommando des jeweiligen MTA aktualisieren werden:

sudo vi /etc/aliases
/etc/aliases
root:getmail

Zum Beispiel mit OpenSMTPD und table aliases file:/etc/aliases in der smtpd.conf:

sudo smtpctl update table aliases

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 Cron-Job Getmail 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, wird der Getmail Cron-Job in /etc/cron.d/ angelegt:

/etc/cron.d/getmail
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
*/31 * * * * root    sudo -H -u getmail /usr/local/bin/getmail_master

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.

Dovecot

Installation

sudo aptitude install dovecot-pop3d
sudo systemctl stop dovecot

Bei der Installation wird Frage nach Erstellung eines selbstsignierten SSL-Zertifikats mit Ja und localhost als Rechnername mit OK bestätigt. Falls ntpdate zur Zeitsynchronisierung mitinstalliert, aber nicht benötigt wird, weil bereits ein anderer Dienst (z. B. openntpd, tlsdate, systemd-timesyncd usw.) die Aufgabe übernimmt, kann man ntpdate nach der Dovecot Installation deinstallieren:

sudo aptitude purge ntpdate

Konfiguration

In der /etc/dovecot/dovecot.conf Konfigurationsdatei werden zwei Einträge auskommentiert:

/etc/dovecot/dovecot.conf
# !include conf.d/*.conf
# dict {
# }
...
!include_try local.conf

Das Auskommentieren 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
base_dir = /var/run/dovecot/
default_login_user = dovenull
default_internal_user = dovecot
protocols = pop3
  service auth {
  user = $default_internal_user
  }
service pop3-login {
  chroot = login
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = 127.0.0.1
    port = 995
  }
  process_limit = 2
  process_min_avail = 1
  service_count = 1
  user = $default_login_user
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
mail_location = mbox:~/.mail:INBOX=/var/mail/getmail
mail_privileged_group = mail
first_valid_uid = n1
last_valid_uid = n1
first_valid_gid = n2
last_valid_gid = n2
mbox_write_locks = fcntl
passdb {
  args = /etc/dovecot/passwd.dovecot
  driver = passwd-file
}
userdb {
  args = /etc/dovecot/passwd.dovecot
  driver = passwd-file
}
ssl = required
disable_plaintext_auth = yes
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem

Benutzerkonto

Für den getmail Benutzer wird ein Passwort erzeugt

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

Für den getmail Benutzer wird mit seinem Benutzernamen, dem ausgeworfenen Passwortstring, 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 im Dovecot Wiki. 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.

Danach kann Dovecot gestartet werden:

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:

POP3 Server localhost
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 Thunderbird E-Mail Konten wird unter Server-Einstellungen der Mailabruf deaktiviert.

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

Server localhost
Port laut Portnummer, an der Stunnel lt. Angaben in der stunnel.conf Datei für den SMTP-Server des Anbeiters 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.

Verweise auf aktuelle Seite