Viele Systemadministratoren lassen sich Statusmeldungen und Logdateien der von ihnen betreuten Server automatisch per E-Mail übers Internet schicken. Das Python-Skript Zeyple nutzt GPG, um die bisweilen sensiblen Inhalte vor unbefugten Blicken zu schützen.
Ob Logdigest [1], Logsurfer [2], Cron oder selbst gestrickte Skripte [3]: An vielen Stellen bleibt die E-Mail das Medium der Wahl, wenn es darum geht, schnell oder auch einfach nur regelmäßig relevante Informationen über ein System an den Admin zu bringen.
Sensible Daten per E-Mail
Doch die in solchen Mails enthaltenen Daten sind nicht immer nur informativ, sondern enthalten häufig auch schützenswerte Daten, etwa Benutzernamen, E-Mail-Adressen oder gar die datenschutzrechtlich relevante Information, wer wann wem gemailt hat (Abbildung 1). Wer derartige Mails unverschlüsselt überträgt, liefert nicht nur Angreifern wichtige Anhaltspunkte, sondern erleichtert auch Geheimdiensten die Überwachungsarbeit [4].

Abbildung 1: E-Mail-Adressen, Login-Daten und mehr: Viele Mails an den Systemadministrator enthalten schutzbedürftige Daten, die ein Man-in-the-Middle leicht auslesen kann.
Den Transport mit SSL/TLS abzusichern ist eine Möglichkeit, hier Sicherheit zu gewinnen. Jedoch bietet diese Methode keinen vollständigen Schutz der Mailinhalte vor unbefugtem Zugriff. Erreicht eine Mail an der Gegenstelle den Mail Transfer Agent (MTA) des Providers, endet die Verschlüsselung und die E-Mails liegen wieder im Klartext vor. Eine für Außenstehende vollständig unzugängliche E-Mail-Kommunikation bedarf folglich einer durchgehenden Verschlüsselung der Inhalte vom Sender bis zum Empfänger.
SSL/TLS reicht nicht aus, GPG muss her
Dafür bieten gerade Linux-Systeme ein relativ einfach zu handhabendes Verschlüsselungsverfahren: GPG, den GNU Privacy Guard. Was im Alltag zwischen Benutzern problemlos funktioniert, verlangt auf einem Server, der ohne Interaktion verschlüsseln und versenden soll, jedoch ein wenig Vorarbeit. Die wohl eleganteste Methode übergibt die E-Mails von der Warteschlange des MTA an ein Programm, das sie verschlüsselt und danach wieder in die Warteschlange einstellt. Dann leitet der MTA die Mails wie gewohnt an den oder die Empfänger weiter (Abbildung 2).

Abbildung 2: Zeyple klinkt sich in die Warteschlange des Mail Transfer Agent ein, zum Beispiel bei Postfix.
Genau das macht das Python-Skript Zeyple [5] des Autors Cédric Félizard. Das Tool, in bester Unix/Linux-Manier als rekursives Akronym (Zeyple Encrypts Your Precious Log Emails) benannt, hängt sich in die Warteschlange des MTA und verschlüsselt dort alle E-Mails an Empfänger, deren öffentlicher GPG-Key hinterlegt ist.
Postfix-Beispiel
Dieser Artikel zeigt in einem Beispiel mit Postfix, wie der Admin Zeyple installiert und den SMTP-Server für die Kooperation konfiguriert. Zeyple steht auf Github zum Download [5] und sollte laut den Entwicklern auch mit anderen MTAs funktionieren, die einen entsprechenden Filtermechanismus der Warteschlange bereitstellen.
Listing 1 zeigt ein Skript namens »install.sh« , das die Zusammenarbeit von Zeyple und Postfix einrichtet. Das Beispiel beruht auf Debian Squeeze mit der Postfix-Version 2.7.2, es dürfte aber, von kleineren Anpassungen abgesehen, ebenso mit anderen Distributionen funktionieren. Damit die Verschlüsselung klappt, muss der Systemadministrator ein GPG-Schlüsselpaar generiert und seinen öffentlichen Schlüssel auf einen Schlüsselserver hochgeladen haben. Das Skript gibt’s unter [6] zum Download.
Listing 1
install.sh
01 #!/bin/bash 02 # install.sh 03 [...] 04 # Hier die interne Adresse eintragen, an welche die System-Mails normalerweise gehen 05 INT_ADDRESS= 06 # EXT_ADDRESS definiert die externe Adresse, an die der Server die verschlüsselten System-Mails versenden soll. Wichtig: Für diese Adresse muss ein öffentlicher GPG-Schlüssel auf dem Keyserver ($KEYSERVER_ADDRESS, siehe Zeile 9) zu finden sein 07 EXT_ADDRESS= 08 # Die URL des Keyservers 09 KEYSERVER_ADDRESS= 10 11 # Abhängigkeiten installieren 12 apt-get install sudo gpg python-gpgme 13 14 # Anlegen des Systembenutzers, ohne Home-Directory und ohne Login- Erlaubnis 15 adduser --system --no-create-home --disabled-login zeyple 16 17 # Das Python-Skript zeyple.py herunterladen 18 wget https://github.com/infertux/zeyple/blob/master/zeyple/zeyple.py 19 # Konfigurationsdatei herunterladen 20 wget https://github.com/infertux/zeyple/blob/master/zeyple/zeyple.conf.example 21 22 # Ein Verzeichnis unter /etc für die Konfigurationsdatei und die Schlüsselverwaltung einrichten 23 mkdir -p /etc/zeyple/keys && chmod 700 /etc/zeyple/keys && chown zeyple: /etc/zeyple/keys 24 25 # Den öffentlichen Schlüssel für $EXT_ADDRESS vom Keyserver holen und mit gpg importieren 26 sudo -u zeyple gpg --homedir /etc/zeyple/keys --keyserver $KEYSERVER_ADDRESS --search $EXT_ADDRESS 27 28 # Die Beispielkonfiguration nach /etc/zeyple verschieben 29 mv zeyple.conf.example /etc/zeyple/zeyple.conf 30 # zeyple.py nach /usr/local/bin verschieben und Benutzerrechte anwenden 31 mv zeyple.py /usr/local/bin/zeyple.py 32 chmod 744 /usr/local/bin/zeyple.py && chown zeyple: /usr/local/bin/zeyple.py 33 34 # Logdatei anlegen und Benutzerrechte setzen 35 touch /var/log/zeyple.log && chown zeyple: /var/log/zeyple.log 36 37 # Postfix für Zeyple vorbereiten: master.cf und main.cf um die Filtereinträge erweitern 38 cd /etc/postfix 39 40 cat >> master.cf <<END 41 zeyple unix - n n - - pipe 42 user=zeyple argv=/usr/local/bin/zeyple.py 43 44 localhost:10026 inet n - n - 10 smtpd 45 -o content_filter= 46 -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters 47 -o smtpd_helo_restrictions= 48 -o smtpd_client_restrictions= 49 -o smtpd_sender_restrictions= 50 -o smtpd_recipient_restrictions=permit_mynetworks,reject 51 -o mynetworks=127.0.0.0/8 52 -o smtpd_authorized_xforward_hosts=127.0.0.0/8 53 END 54 55 # Den Contentfilter in main.cf installieren 56 cat >> main.cf <<END 57 content_filter = zeyple 58 END 59 60 # Damit Zeyple die Schlüssel richtig zuordnet, empfiehlt es sich, die interne Mail-Adresse für ausgehende Mails auf die externe umzuleiten 61 cat >> recipient_canonical<<END 62 $INT_ADDRESS $EXT_ADDRESS 63 END 64 65 # Die Postfix-Empfängerdatenbank neu erstellen 66 postmap recipient_canonical 67 # Datenbank in der Postfix-Adressenumschreibung bekannt machen 68 cat >> main.cf <<END 69 recipient_canonical_maps = hash:/etc/postfix/recipient_canonical 70 END 71 # Postfix-Konfiguration neu laden 72 /etc/init.d/postfix reload 73 74 exit 0
Installationsskript
In den Zeilen 5 beziehungsweise 7 definiert der Admin die interne (beispielsweise »root@local.domain« ) und die externe (etwa »admin@example.com« ) E-Mail-Adresse. Dann wählt er einen passenden Keyserver, auf dem sich der öffentliche Schlüssel der externen E-Mail-Adresse befindet, und ergänzt Zeile 9 mit dessen URL.
Abhängigkeiten: Sudo, GPG, Python-gpgme
Voraussetzung für das Funktionieren des Installationsskripts und auch von Zeyple sind die Pakete Sudo, GPG und Python-gpgme. In Zeile 12 zieht ein Apt-get-Befehl diese aufs System. GPG ist bei Debian Squeeze meist bereits installiert, Sudo und Python-gpgme eher nicht. Zeile 15 legt den Benutzer Zeyple an, unter dessen Rechten das Skript läuft. Keinesfalls sollte der Admin Zeyple mit den Rechten der Accounts von Postfix oder gar Root laufen lassen.
Anschließend lädt Zeile 20 die Beispielkonfiguration von Github.com, das Skript legt das Konfigurationsverzeichnis und das für die GPG-Schlüsseldatenbank für Zeyple an und korrigiert die Berechtigungen. Zeile 29 transportiert die Beispielkonfiguration nach »/etc/zeyple« , der Admin kann sie ohne weitere Änderungen übernehmen. Die folgenden Zeilen verschieben das Python-Skript »zeyple« nach »/usr/local/bin« und machen es ausführbar.
Logrotate und Feinjustierung
Danach legt das Skript eine leere Logdatei für Zeyple an. Vorausschauende Admins werden hier gleich auch eine passende Konfiguration für Zeyple im Verzeichnis »/etc/logrotate.d« anlegen. Der folgende Block hilft dabei, Zeyple als Contentfilter auf Port 10026 (Zeile 44, der Port ist in »/etc/zeyple/zeyple.conf« einstellbar) in der Postfix-Datei »master.cf« einzubauen, gleich danach folgt der passende Eintrag in » main.cf« .
Bis hierhin folgt das Installationsskript weitgehend der Installationsbeschreibung des Zeyple-Autors Cédric Félizard. Der empfiehlt, die Weiterleitung der internen zur externen E-Mail-Adresse über die Aliases-Datenbank von Postfix zu bewerkstelligen. Allerdings stellte sich im Test heraus, dass in der vorliegenden Konstellation Postfix dann nicht das »To:« -Feld, sondern das »X-Envelope:« -Feld des E-Mail-Headers für die externe E-Mail-Adresse verwendet, weshalb viele E-Mails das System dann doch noch unverschlüsselt verlassen (siehe auch das Manual von Postfix [7]).
Ein wenig Nachhilfe für Postfix
Abhilfe schaffen hier die Skriptzeilen ab 60. Mit ihnen weist der Code der internen Adresse die externe in der »recipient_canonical« -Datenbank von Postfix zu, hasht die Datenbank erneut (Zeile 66) und teilt ihre Existenz Postfix in der Konfigurationsdatei »master.cf« (Zeilen 67 bis 70) mit.
Jetzt nur noch die neue Konfiguration von Postfix laden (Zeile 72) – schon sind Installation und Konfiguration beendet und der Server verschlüsselt die ausgehenden Mails automatisch. Ab sofort sollten alle System-E-Mails, die ansonsten an Root des Mailsystems geschickt werden, verschlüsselt an der angegebenen externen E-Mail-Adresse ankommen.
Testen lässt sich das mit »date | mail -s test Interne_E-Mail-Adresse_des_Systemadministrators« . Das Verwalten der öffentlichen Schlüssel für Zeyple erledigt der Admin an der Kommandozeile mit GPG und dem Benutzer »zeyple« und der Option »–homedir=/etc/zeyple« .
Zeyple hat noch Schwächen: Anhänge, HTML, Signaturen
Zeyple leistet bereits gute Dienste, ist aber noch lange nicht perfekt: Beispielsweise kann es noch keine E-Mail-Anhänge verschlüsseln und damit also auch keine typischen HTML-E-Mails. Auch könnte ein Angreifer mit Hilfe des auf dem Keyserver zugänglichen öffentlichen Schlüssels gefälschte System-E-Mails an den Systemadministrator schicken. Da hilft nur, die E-Mails zusätzlich zur Verschlüsselung zu signieren. Das aber kann Zeyple bisher nicht leisten.
Ohnehin ist Vorsicht geboten: Alle Server mit nur einem privaten Schlüssel abzusichern ist keine gute Idee, da im Falle einer Kompromittierung dieses Schlüssels gleich alle Systeme mit neuen Schlüsseln zu versorgen sind. Hier bleibt nur, für jedes System ein eigenes Schlüsselpaar zu generieren und dieses im Einzelfall zu widerrufen und auszutauschen. Das aber erzeugt mit zunehmender Anzahl an Servern einiges an organisatorischem Overhead.
Infos
- Logdigest: http://sourceforge.net/projects/logdigest/
- Logsurfer: http://www.crypt.gen.nz/logsurfer/
- Charly Kühnast, “Türspion”: Linux-Magazin 07/10, S. 83: https://www.linux-magazin.de/Ausgaben/2010/07/Tuerspion
- Ex-FBI-Mitarbeiter, “Die Geheimdienste speichern jede digitale Kommunikation”:http://www.transcripts.cnn.com/TRANSCRIPTS/1305/01/ebo01.html
- Zeyple auf Github.com: https://github.com/infertux/Zeyple
- Installationsskript für Zeyple und Postfix: https://www.linux-magazin.de/static/listings/magazin/2013/07/Zeyple
- Postfix-Dokumentation zu Address Rewriting: http://www.postfix.org/ADDRESS_REWRITING_README.html






