Archive

Kategorien

Emails in der Mailbox automatisch verschlüsseln

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";
}

2 comments to Emails in der Mailbox automatisch verschlüsseln

  • Tobi

    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

    1
    2
    3
    4
    5
    Mail::GnuPG takes a PGP/MIME signed email with the following Content-Type header:
    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

  • Tobi

    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #/etc/dovecot/conf.d/90-plugins.conf
    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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    require "environment";
    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

    1
    if environment :matches "imap.user" ["user@domain.tld","user1@domain.tld","anyone@example.com"] {

    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.

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

  

  

  

14 + nineteen =

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahren Sie mehr darüber, wie Ihre Kommentardaten verarbeitet werden .