Mittels gpg kann man sich die eigene Mailbox recht einfach verschlüsseln. Sodenn man einen eigenen Mailserver hat natürlich 🙂
Das ganze basiert auf gpgit, einem Perlscript, welches im Zusammenspiel mit GnuPG, die Verschlüsselung übernimmt
Am Einfachsten installiert man sich die Abhängigkeiten für gpgit via cpan.
1 2 3 4 5 | # apt-get install gnupg cpanminus # yum install gnupg perl-cpan # dnf install gnupg perl-cpan cpan install MIME::Tools cpan install Mail::GnuPG |
Im folgenden gehe ich davon aus, dass der SMTP Server (bei mir Postfix) die empfangenen Mails via dovecot-lda resp dovecot-lmtp einliefert. Die eigentliche Verschlüsselung findet dann via ein Dovecot Plugin statt, welches von einem sieve-Script getriggert wird.
Zuerst lädt man sich gpgit und speichert es an einem Ort wo man es nicht versehentlich löscht. Dann erstellt man sich am besten ein neues Verzeichnis innerhalb von /etc/dovecot und schiebt die Datei dort hinein.
1 2 3 | mkdir /etc/dovecot/sieve-filters mv gpgit /etc/dovecot/sieve-filters/ chmod +x /etc/dovecot/sieve-filters/gpgit |
Danach erstellt man eine Plugin-Konfiguration für Dovecot in /etc/dovecot/conf.d/90-plugin.conf
1 2 3 4 5 | plugin { sieve_plugins = sieve_extprograms sieve_extensions = +vnd.dovecot.filter sieve_filter_bin_dir = /etc/dovecot/sieve-filters } |
Damit das Plugin aber weiss, welcher Public-Key für die Verschlüsselung verwendet werden soll, muss man diesen erst in den Schlüsselbund importieren. Es ist WICHTIG, dass dies unter dem User passiert, welcher dann effektiv das Plugin ausführt (bei mir vmail). Also exportiert man erst den PublicKey in eine Datei und importiert diesen dann folgendermassen
1 2 3 4 5 6 7 8 9 10 11 12 13 | su vmail -s /bin/bash gpg --import /pfad/zum/pubkey.asc gpg --edit-key me@domain.com gpg> trust 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 5 Do you really want to set this key to ultimate trust? (y/N) y gpg> save |
man muss dem Schlüssel «ultimativ vertrauen» sonst wird er von gpg nicht verwendet.
Nun sollte man den Dovecot neustarten und dann kann man ein entsprechendes sieve-File machen. In meinem Fall will ich alle Mails welche an @example.com gesendet werden mit meinem PubKey verschlüsseln
1 2 3 4 | require ["imap4flags","fileinto","envelope","subaddress","vnd.dovecot.filter"]; if anyof (address :matches "To" "*@example.com", header :comparator "i;ascii-casemap" :contains "Delivered-To" "@example.com") { filter "gpgit" "me@example.com"; } |
Damit sind eingehende Mails verschlüsselt 🙂
Damit man auch die Mails im «Gesendet Ordner» verschlüsseln kann gibt es zwei Ansätze: entweder direkt in IMAP wenn der Client die gesendete Mail in den Serverordner für gesendete Elemente einfügt «APPEND» oder indem man sich in den Mailtransport einklinkt und die Mail sozusagen on-the-fly verschlüsselt, wenn sie den Transport Agent (z.B. dovecot-lmtp oder dovecot-lda) passiert.
Der zweite Weg ist wesentlich einfacher umzusetzen und hat den Vorteil, dass keine unverschlüsselten temporären Dateien nötig sind. Drum habe ich bei mir diesen zweiten Weg gewählt.
Dazu muss man dem MUA (Client, in meinem Fall Thunderbird) beibringen, dass die gesendeten nicht im Ordner «Gesendet» gespeichert werden sollen, sondern mittels AutoBcc an me+bcc@domain.com gehen sollen. Das setzt voraus, dass auf dem eigenen Mailserver solche Adressen korrekt erkannt werden. Das lässt sich bei Postfix sehr einfach aktivieren
Danach kann man das sieve File anpassen
1 2 3 4 5 6 7 8 9 | require ["imap4flags","fileinto","envelope","subaddress","vnd.dovecot.filter"]; if anyof (address :matches "To" "me+bcc@example.com", header :comparator "i;ascii-casemap" :contains "Delivered-To" "me+bcc@example.com") { filter "gpgit" "me@example.com"; setflag "\\seen"; fileinto "Sent"; stop; } elsif header :comparator "i;ascii-casemap" :matches "Delivered-To" "*" { filter "gpgit" "me@example.com"; } |
Mit aktuellen Versionen von Thunderbird und Enigmail Plugin gibt es leider Probleme mit signierten Mails, welche durch das gpgit Script verschlüsselt werden. Dies tritt nur dann auf wenn die signierte Mail mit PGP/MIME Content Type hereinkommt. Wenn hingegen Inline PGP bei der Signatur verwendet wurde, tritt dieses Problem nicht auf.
Das Problem bei Thunderbird+Enigmail ist, dass es beim Versuch die Signatur einer solchen Mail zu verifizieren zu einer Race-Condition kommt. Thunderbird spawned hunderte von Threads beim Versuch der Verifizierung der Signatur. Der Effekt ist, dass solche Mails nicht angezeigt werden können. Andere Clients (z.B. Evolution) reagieren hier besser und versuchen erst gar nicht die Signatur zu verifizieren. Ist zwar auch nicht schön, endet aber immerhin nicht in einer Race Condition.
Das zugrunde liegende Problem ist in GnuPG.pm. Dieser «Bug» führt dazu, dass bei PGP/MIME Signaturen wichtige Bestandteile der Header nicht angefügt werden, was dazu führt, dass die Signatur defacto kapputt ist. Der Bug ist hier beschrieben
2
3
4
5
Content-Type: multipart/signed; boundary="----------=_1458481552-7056-0"; protocol="application/pgp-signature"; micalg=pgp-sha512
And then spits out an encrypted message, which after decryption contains a MIME part with the following Content-Type header:
Content-Type: multipart/signed; boundary="----------=_1458481552-7056-0"
es werden also die Header Infos zu protocol und micalg «unterschlagen». Damit wird die Signatur unverifizerbar und TB+Enigmail fällt böse auf die Nase.
Ich war im Kontakt mit den Entwicklern und in einem ersten Schritt wurde Enigmail so angepasst, dass es zumindest nicht mehr zu einer Race-Condition kommt. Das aber hat(te) zu Folge, dass solche Mails in TB überhaupt nicht mehr angezeigt werden konnten. Unschön, aber immerhin keine DOS Attacke auf TB mehr 😉
In ihrem aktuellen Nightly Build (build date: 2016-04-11, version: 2.0a1pre, git rev: 61492939023119d0744ee6e08e3491a4c525a303) wurde das Problem nun endgültig behoben. Jetzt ignoriert Enigmail solche kaputten Signaturen einfach und zeigt den entschlüsselten Inhalt ohne Verifizierung der Signatur an.
Nichtsdestotrotz sollte man bei der Verwendung von gpgit unbedingt den im Bugreport beschriebenen Fix vornehmen, damit die Signaturen wieder korrekt verifiziert werden können. Hoffentlich sehen das die Maintainer von GnuPG auch so und pflegen diesen Fix in ihre Sourcen ein
Ab Pigeonhole 0.4.16 kann man die Sieve Filter auch direkt als IMAP Sieve verwenden. Das bietet den Vorteil, dass der Filter direkt bei IMAP-Events ansetzt und man sich daher den Umweg via user+bcc@domain.tld sparen kann.
Allerdings braucht dies einen Mehraufwand bei der Konfig
2
3
4
5
6
7
8
9
10
11
12
13
14
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_extensions = +vnd.dovecot.filter +vnd.dovecot.pipe +vnd.dovecot.execute +vnd.dovecot.environment
sieve_filter_bin_dir = /etc/dovecot/sieve-filters
sieve_pipe_bin_dir = /etc/dovecot/sieve-filters
sieve_execute_bin_dir = /etc/dovecot/sieve-filters
sieve_filter_exec_timeout = 10000
sieve_pipe_exec_timeout = 10000
sieve_execute_exec_timeout = 10000
imapsieve_mailbox1_name = Sent
imapsieve_mailbox1_causes = COPY APPEND
imapsieve_mailbox1_before = file:/home/vmail/dovecot/dovecot-crypt-sent.sieve
}
Diese Konfig ruft das Script /home/vmail/dovecot/dovecot-crypt-sent.sieve auf sobald eine Nachricht via APPEND oder COPY in die Mailbox Sent geschrieben wird.
Das Script schaut dann folgendermassen aus
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require "vnd.dovecot.filter";
require "variables";
require "imapsieve";
require "vnd.dovecot.environment";
require "fileinto";
set "mailbox" "Sent";
if environment :matches "imap.user" "user@domain.tld" {
if filter "gpgit" "${env.imap.user}" {
fileinto "${mailbox}";
stop;
}
}
Das Script bekommt von Dovecot die Nachricht via STDIN und prüft erst ob der User in einer «Liste» steht, welche die User definiert die über einen PubKey auf dem System verfügen.
Für mehrere User könnte man das so schreiben
Dann verfüttert das Script die Nachricht an das gpg Script, welches sich ebenfalls in sieve_filter_bin_dir befinden muss. Die verschlüsselte Nachricht wird dann in der Mailbox abgelegt.