GnuPG-verschlüsselte Dateien editieren (C) 2006-2015 T.Birnthaler OSTC GmbH ====================================== $Id: gpgedit.txt,v 1.7 2015-03-09 18:41:47 tsbirn Exp $ Wer sich sicherheitsbewusst verhält, verschlüsselt entweder seine gesamte Festplatte (was auf Notebooks zu einer deutlichen Performance-Einbuße führt) oder als Alternative zumindest diejenigen seiner Dateien (z.B. Zugangsdaten, PINs, Accounts+Passworte), die nicht jeder lesen können soll, der irgendwie Zugriff auf die Hardware erhält. Für das Verschlüsseln von Dateien bietet sich GnuPG an, allerdings gilt der Satz von Bruce Schneier: "Sicherheit ist immer unbequem", d.h. man erschwert sich damit das Handling von Dateien auf der Kommandozeile deutlich. Soll z.B. eine mit GnuPG verschlüsselte Textdatei "geheim.gpg" auf der Kommandozeile editiert werden, dann ist folgender Ablauf notwendig (XXXXXXXX = GPG-ID) 1) gpg --decrypt geheim.gpg > geheim # Passphrase einzugeben 2) vim geheim # Editieren 3) gpg --recipient XXXXXXXX --encrypt geheim # Überschreibt "geheim.gpg" 4) rm geheim # Zwischendatei löschen Dabei gibt es neben dem komplizierten Ablauf noch folgende Probleme: a) In Zwischendatei "geheim" steht während dem Editieren der Klartext auf der Platte. Sie sollte also für andere nicht lesbar sein. b) Der Editor "vim" legt eine SWAP-Datei ".geheim.swp" an, in der während dem Editieren der Klartext oder Teile davon stehen. Sie sollte also entweder nicht angelegt werden oder für andere nicht lesbar sein. c) Der Editor "vim" legt in der Datei "~/.viminfo" während dem Editieren Teile des Klartexts ab. Sie sollte also entweder nicht benutzt werden oder für andere nicht lesbar sein. d) Selbst wenn die Zwischendatei "geheim" und die SWAP-Datei ".geheim.swp" anschließend mit "rm" gelöscht werden, ist ihr Inhalt evtl. noch sehr lange auf der Platte vorhanden. Die beiden Dateien sollten also vor dem Löschen ("rm") mit zufälligen Bytes überschrieben werden. Damit das Verschlüsseln von Dateien auch genutzt wird, muss das Handling der obigen Schritte 1)-4) so bequem (und sicher) wie möglich gemacht machen. Dazu wurde das Shell-Skript "gpgedit.sh" mit einigen Shell-Funktionen und Aliasen geschrieben. Diese beachten die Probleme a)-d) und bieten zusätzlich folgende Erweiterungen: 1. Editieren mehrerer Dateien möglich. 2. Liste von Verzeichnissen wird nach passenden Dateien abgesucht. 3. Liste von Dateiendungen wird automatisch ausprobiert. 4. Unverschlüsselte Klartextdateien werden erkannt und nach dem Editieren automatisch verschlüsselt (+ Originaldateien gelöscht). 5. Noch nicht existierende Datei wird automatisch neu angelegt. 6. Anderer Editor als "vim" beim Aufruf per "-p PGM" wählbar. 7. Bei Fehler (z.B. kein Schreibrecht, Abbruch mit "Strg-C", Namenskollision) werden keine Dateien zerstört. Verwendung von "gpgedit.sh" --------------------------- Das Shell-Skript "gpgedit.sh" muss mit "source" oder "." in einer Bash-Initialisierungsdatei (z.B. "~/.bashrc", "~/.profile") geladen werden: source PFAD/ZU/gpgedit.sh . PFAD/ZU/gpgedit.sh und definiert folgende 4 Shell-Funktionen, die dann auf der Kommandozeile zusammen mit einigen Aliasen zur Vereinfachung des Zugriffs zur Verfügung stehen: 1) searchgpgfile(NAME): HILFSFUNKTION: Sucht eine per GPG verschlüsselte Datei NAME in diversen Verzeichnissen (GE_DIRS) und mit diversen Extensions (GE_EXTS). Gibt es entweder einen VOLLSTÄNDIGEN Treffer GE_DIRS[n]/DATEINAME.GE_EXTS[m] oder alternativ einen TEILTREFFER GE_DIRS[n]/*DATEINAME*.GE_EXTS[m] Der Pfadname der Trefferdatei wird zurückgegeben. Wird kein zu NAME passender Dateiname gefunden, so wird der übergebene NAME selbst zurückgegeben. 2) decrypt(NAME): Macht obige Suche, bei Treffer wird die gefundene Datei entschlüsselt und auf dem Bildschirm ausgegeben. 3) encrypt(NAME): Macht obige Suche, bei Treffer wird geprüft, ob die gefundene Datei noch nicht verschlüsselt ist. In diesem Fall wird sie verschlüsselt. 4) gpgedit(NAME): Macht obige Suche. a) Bei Treffer wird die gefundene Datei entschlüsselt und im Editor Vim zum Editieren angeboten. Nach dem Verlassen des Vim wird sie wieder verschlüsselt. Die dabei verwendete Zwischendatei wird noch mit Zufallsbytes überschrieben und gelöscht. b) Ohne Treffer wird eine Datei mit folgendem Standardinhalt URL: XXX MAIL: XXX NAME: XXX USER: XXX PASS: XXX DATE: $(date +'%d.%m.%Y %T') ACHTUNG: Fuer ALLE relevanten Personen verschluesseln! im Editor zum Editieren angeboten und nach dem Verlassen des Vim analog verschlüsselt. Somit sind auch komplizierte Dateinamen wie "www.speicher-shop.de.key.gpg" kein Problem mehr, er wird gefunden über jeden der folgenden Aufrufe (sofern es nur einen Treffer gibt): decrypt speicher-shop gpgedit speicher decrypt www.speicher-shop.de gpgedit speich decrypt shop Folgende Aliase in "gpgedit.sh" erleichtern den Aufruf der Shell-Funktionen zusätzlich: enc = encrypt dec = decrypt ge = gpgedit sg = source ~/bin/gpgedit.sh HINWEIS: "gpgedit" erwartet immer die Dateiendung ".gpg" für mit GnuPG verschlüsselte Dateien. Nötigenfalls wird daher diese Endung an Dateinamen angehängt und die Datei umbenannt. HINWEIS: Damit der eigene private GnuPG-Schlüssel nicht kompromittiert werden kann --- und damit das ganze obige Verfahren ad absurdum geführt wird --- sollte er mit einer guten Passphrase gesichert werden (die dann jedesmal beim Zugriff auf eine verschlüsselte Datei einzutippen ist ;-). Konfiguration ------------- Folgende Variablen in "gpgedit.sh" an die eigenen Voraussetzungen anpassen: GE_ID="XXXXXXXX" # 8-stellige GPG-ID GE_DIRS=" # Liste der zu durchsuchenden Verzeichnisse PFAD1 PFAD2 ... " GE_EXTS=" # Liste der auszuprobierenden Extensions (ohne ".") EXT1 EXT2 ... " GE_TEXT=" # Standardtext bei neuem Dateinamen URL: XXX MAIL: XXX NAME: XXX USER: XXX PASS: XXX DATE: $(date +'%d.%m.%Y %T') ACHTUNG: Fuer ALLE relevanten Personen verschluesseln! "