GPG verschlüsselte Mails aus der Kommandozeile

Mein vorheriger Beitrag bezog sich auf E-Mails aus der Kommandozeile und an diesen möchte ich wieder anknüpfen. Leider hat die von mir genannte Methode einen Nachteil, denn wenn die (Status-)E-Mails vertrauliche Informationen enthalten, sind diese für dritte einsehbar. Beispielsweise IP Adressen, Serverpfade, Login Namen, Auszüge aus Logs und was sonst niemanden angeht. Darum lasse ich die Status-E-Mails jetzt GPG verschlüsselt versenden, ähnlich wie Facebook es künftig für deren E-Mails an Benutzer machen möchte.

Für diese Anleitung wird vorausgesetzt, dass Ihr bereits Mails aus der Kommandozeile versenden könnt und die Grundlagen von GPG kennt. Falls GPG noch nicht eingerichtet wurde, findet Ihr hier und hier Tipps und Anleitungen dafür.

Was wir im Vorfeld benötigen sind natürlich der öffentliche Schlüssel eines Empfängers und die Mailadresse. Zum testen können wir auf einen öffentlichen GPG-Bot zurückgreifen, der uns auf die verschlüsselte E-Mail mit der entschlüsselten Nachricht antwortet. Ich verwende in den Beispielen den GPGBot von pgpgangsta.de mit der Schlüsselkennung „7236DAF9“. Dieser fordert die Betreffzeile „DECRYPT AND CHECK“. Realisieren lässt sich das ganze dann mit einem Zweizeiler:

echo "Meine geheime Nachricht" > /tmp/mail.txt
gpg --armor --trust-model always --recipient "7236DAF9" --encrypt < /tmp/mail.txt | mail "gpgtest@phpgangsta.de" -s "DECRYPT AND CHECK"

Was passiert hier ?

Die erste Zeile packt den Text in eine Datei. Die zweite Zeile liest den Dateiinhalt und verschlüsselt diesen, welcher dann an „mail“ übergeben und abgeschickt wird. Die  Option „–armor“ versieht die verschlüsselte Nachricht mit einer ASCII-Hülle und sorgt so dafür, dass keine Leerzeichen, Zeilenumbrüche, usw. mit in den Hash einfließen. „–trust-model always“ umgeht die Schlüsselüberprüfung und besagt das Ihr dem angegeben Schlüssel voll vertraut. Dies sollte Ihr nur nutzen wenn Ihr sicher seid / überprüft habt, dass Schlüssel und Benutzer-ID zusammengehören. Mit „–recipient“ müsst ihr dann die Benutzer-ID angeben welche verwendet werden soll.

Ein Beispiel Skript

Wenn Ihr jetzt bereits sein Backupskript oder ähnliches habt was eine GPG verschlüsselte Mail versenden soll, könne Ihr auf folgendes (Beispiel)-Skript zurückgreifen. Dieses prüft vorher ob der öffentliche Empfänger Schlüssel bereits bei euch hinterlegt ist, wenn nicht, wird versucht diesen von den Schlüsselservern herunterzuladen. Danach wir aus dem Skript heraus eine Datei mit der Klartext Nachricht angelegt, diese verschlüsselt und versendet. Zu guter Letzt wird die Klartext Nachrichten Datei noch 3x überschrieben, gelöscht und mit Nullen wieder überschrieben.

#!/bin/bash
# andre.hemk.es CC BY-SA 4.0 
TMPSTORE="/tmp/TMPBackup"             # Temp. Datei
RECP="gpgtest@phpgangsta.de"          # E-Mail Empfänger der Logs und Statusberichte
KEYID="7236DAF9"                      # Öffentliche Schlüssel ID des Empfängers
SUBJ="DECRYPT AND CHECK"              # Betreff der E-Mails

### GPG Schlüssel auf Verfügbarkeit prüfen, ggf. importieren
gpg --fingerprint $KEYID              # Prüfen ob der Schlüssel bereits vorhanden ist
if [ $? -ne 0 ]; then
    gpg --recv-keys $KEYID            # Öffentlichen Empfänger Schlüssel vom Schlüsselserver importieren
    if [ $? -ne 0 ]; then             # Prüfen ob der Schlüssel empfangen werden konnte
        echo "Keine gültige Schlüssel ID: $KEYID oder Problem diesen abzurufen.\n Skript beendet"
        exit 1
    fi
fi

### Nachricht erstellen
cat <<EOM > $TMPSTORE
Hallo,

dies könnte eure Nachricht sein die GPG verschlüsselt wird.

MFG dein Sktipt
EOM

## Nachricht verschlüsseln und versenden
gpg --armor --trust-model always --recipient $KEYID --encrypt < $TMPSTORE | mail $RECP -s "$SUBJ"
if [ $? -ne 0 ]; then                # Wenn Verschlüsselung oder senden fehlgeschlagen, dann Meldung ausgeben
    echo "E-Mail senden oder Verschlüsselung ist fehlgeschlagen."
fi
shred -u -z $TMPSTORE                # Temp. Datei sicher entfernen

Gerne darf dass Skript verbessert / portiert und angepasst werden (CC BY-SA 4.0). Solltet Ihr darüber bloggen freue ich mich immer über einen Backlink / Trackback.

privacy-policy-510733_1280Anmerkung zu aktuellen Nachrichten

Würden mehr (automatisierte) Mails GPG verschlüsselt versendet werden, hätte evtl. die peinliche Datenpanne von der TU Berlin vermieden werden können. Aber dafür müsste halt auch fast jeder GPG verschlüsselte Mails empfangen können…

 

2 Replies to “GPG verschlüsselte Mails aus der Kommandozeile”

  1. Shogun

    Guter Artikel und richtige Denkanstöße. Weiter so! Ein paar kleine Verbesserungsvorschläge hätte ich:

    Niemals mit festen Dateinamen temporärer Dateien arbeiten! Das sichere Anlegen einer temporären Datei könnte so gemacht werden:
    TMPSTORE=`mktemp`

    Damit temporäre Datei auch bei Abbruch des Skripts (irgendwo in der Mitte) gelöscht werden, bedient man sich der Eventhandler von bash. Direkt nach der Variablendefinition oben würde ich folgendes einfügen:
    trap "shred -u -z -- $TMPSTORE" EXIT
    Das shred am Skriptende kann damit entfallen.

    Evtl. könnte man auch ganz auf das temporäre File verzichten und den Body der E-Mail einfach in GPG pipen.

    1. Andre Post author

      Hi Shogun,
      :) Dankeschön für die Verbesserungen. Bei Skripten habe ich noch einiges zu lernen, vor alldem Eventhandler sind mit noch fremd ;)
      Ohne temporäre Datei habe ich es nicht zum laufen bringen können. Evtl. ist dafür ein seitens gpg ein andere Ansatz notwendig…