Datei nur mit SSH -Priv-Key verschlüsseln?

22

Angenommen, ich möchte eine Datei verschlüsseln, damit nur ich sie lesen kann, wenn ich mein Kennwort für den privaten SSH-Schlüssel kenne. Ich teile ein Repo, in dem ich vertrauliche Informationen verschlüsseln oder verschleiern möchte. Damit meine ich, dass das Repo die Informationen enthalten wird, aber ich werde es nur in besonderen Fällen öffnen.

  1. Angenommen, ich verwende SSH-Agent. Gibt es eine einfache Möglichkeit, die Datei zu verschlüsseln, damit sie später nur ich öffnen kann?

  2. Ich kann nicht verstehen, warum ich GPG für diese Frage verwenden soll . Grundsätzlich kenne ich das Passwort und möchte die Datei nur mit demselben Passwort wie mein SSH-Schlüssel entschlüsseln. Ist das möglich?

Gemeinschaft
quelle

Antworten:

27

Ich denke, Ihre Anforderung ist gültig, aber andererseits ist es auch schwierig, weil Sie symmetrische und asymmetrische Verschlüsselung mischen. Bitte korrigieren Sie mich, falls ich falsch liege.

Argumentation:

  1. Die Passphrase für Ihren privaten Schlüssel dient zum Schutz Ihres privaten Schlüssels und sonst nichts.
  2. Dies führt zu folgender Situation: Sie möchten Ihren privaten Schlüssel verwenden, um etwas zu verschlüsseln, das nur Sie entschlüsseln können. Ihr privater Schlüssel ist dafür nicht vorgesehen, dafür ist Ihr öffentlicher Schlüssel da. Was immer Sie mit Ihrem privaten Schlüssel verschlüsseln, kann mit Ihrem öffentlichen Schlüssel (Signieren) entschlüsselt werden. Das ist sicherlich nicht das, was Sie wollen. (Was immer mit Ihrem öffentlichen Schlüssel verschlüsselt wird, kann nur mit Ihrem privaten Schlüssel entschlüsselt werden.)
  3. Sie müssen also Ihren öffentlichen Schlüssel verwenden, um Ihre Daten zu verschlüsseln. Dafür benötigen Sie jedoch keine Passphrase für den privaten Schlüssel. Nur wenn Sie es entschlüsseln möchten, benötigen Sie Ihren privaten Schlüssel und die Passphrase.

Fazit: Grundsätzlich möchten Sie Ihre Passphrase für die symmetrische Verschlüsselung wiederverwenden. Das einzige Programm, das Sie für Ihre Passphrase verwenden möchten, ist ssh-agent. Dieses Programm verschlüsselt / entschlüsselt nicht nur die Passphrase. Die Passphrase dient nur zum Entsperren Ihres privaten Schlüssels und wird dann vergessen.

Empfehlung: Verwenden Sie openssl encoder gpg -e --symmetricmit passphrasengeschützten Schlüsseldateien zur Verschlüsselung. Wenn Sie die Informationen weitergeben müssen, können Sie die Infrastruktur für öffentliche Schlüssel beider Programme verwenden, um eine PKI / ein Web of Trust zu erstellen.

Mit openssl ungefähr so:

$ openssl enc -aes-256-ctr -in my.pdf -out mydata.enc 

und Entschlüsselung so etwas wie

$ openssl enc -aes-256-ctr -d -in mydata.enc -out mydecrypted.pdf

Update: Es ist wichtig zu beachten, dass die obigen openssl-Befehle NICHT verhindern, dass Daten manipuliert werden. Ein einfacher Bit-Flip in der enc-Datei führt ebenfalls zu beschädigten entschlüsselten Daten. Die obigen Befehle können dies nicht erkennen, Sie müssen dies beispielsweise mit einer guten Prüfsumme wie SHA-256 überprüfen. Es gibt kryptografische Möglichkeiten, dies auf integrierte Weise zu tun. Dies wird als HMAC (Hash-based Message Authentication Code) bezeichnet.

Vasquez
quelle
5
Sie haben Recht, dass ein SSH-Schlüssel ein asymmetrischer Schlüssel ist, der nicht zum Verschlüsseln einer Datei geeignet ist. Infolgedessen funktionieren die Befehle, die Sie am Ende eingeben, nicht. Sie versuchen, eine Datei mit RSA zu verschlüsseln, können jedoch nur eine sehr kleine Nutzlast mit RSA verschlüsseln (die Größe des Moduls abzüglich der Auffüllung). Die normale Methode besteht darin, einen symmetrischen Einwegschlüssel zu generieren, diesen mit RSA zu verschlüsseln und die realen Daten mit dem symmetrischen Schlüssel zu verschlüsseln. Es könnte möglich sein, den ssh-Schlüssel in gpg zu importieren. Dies wäre der richtige Weg, um die Anforderungen von hhh zu implementieren. Es ist jedoch richtig, gpg mit einem gpg-Schlüssel zu verwenden.
Gilles 'SO- hör auf böse zu sein'
1
Warum schlagen Sie gpg mit der symmetrischen Flagge vor? Funktioniert es auch mit "gpg -e something"aber für verschiedene Fälle?
1
@hhh Ich bin davon ausgegangen, dass Sie Ihre Dateien nicht freigeben würden. Daher ist die Verwendung von einfach symmetrisch sicherer als die Verwendung von Kryptografie mit öffentlichen Schlüsseln. Kein Bedarf an öffentlichem / privatem Schlüsselpaar usw. Von pgp.net/pgpnet/pgp-faq/… : "Es wird immer noch angenommen, dass RSA das schwächste Glied in der PGP-Kette ist." Dies gilt auch für andere Pubkey-Mechanismen wie x509.
Vasquez
1
Wie würde der openssl -one-liner aussehen? Etwas äquivalent zu $ gpg -e --symmetric?
1
Verwenden Sie dies, um: zu verschlüsseln openssl enc -aes-256-cbc -in my.pdf -out mydata.enc, zu entschlüsseln mit: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfbeide Befehle fragen nach dem Passwort. Siehe man enc(auf RH / Fedora / Centos) für alle Optionen wie Schlüsseldateien, Base64-Codierung usw.
Vasquez
21

Ich würde es vorziehen, das opensslDienstprogramm zu verwenden, da es ziemlich allgegenwärtig zu sein scheint.

Konvertieren Sie den öffentlichen und den privaten RSA-Schlüssel in das PEM-Format:

$ openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
$ openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > id_rsa.pub.pem

Verschlüsseln einer Datei mit Ihrem öffentlichen Schlüssel:

$ openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem -in file.txt -out file.enc

Entschlüsseln Sie die Datei mit Ihrem privaten Schlüssel:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc -out file.txt

Wie Gilles bereits erwähnt hat, ist dies jedoch nur zum Verschlüsseln von Dateien geeignet, die kleiner als Ihr öffentlicher Schlüssel sind. Sie können also Folgendes tun:

Generieren Sie ein Passwort, verschlüsseln Sie die Datei symmetrisch und verschlüsseln Sie das Passwort mit Ihrem öffentlichen Schlüssel. Speichern Sie es in der Datei:

$ openssl rand 64 | 
tee >(openssl enc -aes-256-cbc -pass stdin -in file.txt -out file.enc) |
openssl rsautl -encrypt -pubin -inkey id_rsa.pub.pem  -out file.enc.key

Entschlüsseln Sie die Passphrase mit Ihrem privaten Schlüssel und verwenden Sie sie zum Entschlüsseln der Datei:

$ openssl rsautl -decrypt -inkey id_rsa.pem -in file.enc.key | 
openssl enc -aes-256-cbc -pass stdin -d -in file.enc -out file.txt

Sie werden am Ende zwei Dateien haben, Ihre verschlüsselte Datei und Ihre verschlüsselte Passphrase, aber in einem Skript würde es gut funktionieren.

Sie könnten sogar eine hinzufügen, tar cvf file file.enc file.enc.keyum aufzuräumen.

Optimalerweise maximieren Sie die Größe Ihrer Passphrase und ändern sie rand 64in die Größe Ihres öffentlichen Schlüssels.

kwarrick
quelle
Sehr schön gemacht, wenn man die skurrilen Anforderungen des OP berücksichtigt.
Rsaw
2
gerade erst gefunden, netter Beitrag. Ich fand heraus, dass der maximale symmetrische Schlüssel, den Sie aus dem SSH-Schlüssel generieren können, 12 Bytes kürzer ist als der SSH-Schlüssel selbst, da ansonsten das rsautl mit "Daten, die für die Schlüsselgröße zu groß sind" fehlschlagen würde. Also funktionierte dies in einem Skript: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')um eine Schlüssellänge automatisch zu generieren. Wenn ssh-keygen eine minimale Schlüssellänge von 768 Bit hat, führt dies immer noch zu einem minimalen symmetrischen Schlüssel von 672 Bit oder 84 Byte.
markf
6

Schau dir luks / dm-crypt an . Sie können Ihren ssh-private-key als Verschlüsselungsschlüssel verwenden, indem Sie die entsprechende Option verwenden.

Update: Beispielverschlüsselung mit LUKS mit einem LV-Block-Gerät (LV-Test im VG-System):

KEY=/home/youraccount/.ssh/id_dsa
DEVICE=/dev/system/test
cryptsetup luksFormat $DEVICE $KEY
cryptsetup luksOpen $DEVICE test_crypt --key-file $KEY

Dies sollte ein Block-Device / dev / mapper / test_crypt erzeugen, auf dem Sie Ihre Daten speichern können (nachdem Sie sie mit einem Dateisystem Ihrer Wahl formatiert haben).

Um es loszuwerden, ummontieren und verwenden cryptsetup luksClose test_crypt.

Nils
quelle
Könnten Sie MVO dazu geben, damit es einfach wiederverwendet werden kann? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Wenn ich das richtig verstehe, handelt es sich bei dieser Methode um eine Verschlüsselung auf Dateisystemebene. Es verschlüsselt die benötigten Dateien umount / mount oder verstehe ich das falsch?
2
Ich glaube nicht, dass dies das tut, was du denkst. Die --key-fileOption cryptsetup verwendet den tatsächlichen Inhalt der Datei als ein großes Passwort. Der openssl-Schlüssel wird nicht aus der Datei gelesen und nur verwendet. Sie können eine Datei mit zufälligen Bytes für die verwenden, --key-filewenn Sie möchten.
Patrick
@hhh Ja das ist eine FS-Level-Verschlüsselung.
Nils
4
@Nils aber was passiert, wenn er das Passwort für seinen privaten Schlüssel ändert, kann er seine Dateien jetzt nicht mehr entschlüsseln, da sich die Daten in der Schlüsseldatei geändert haben. --key-fileist wirklich ein schlecht gewählter Name für die Option, sollte es sein--password-file
Patrick
1
@Patrick Dies ist wahr - das Ändern der Passphrase ändert die Datei und damit den Schlüssel (aus der Sicht von luks). Aber selbst aus der Sicht von ssh würde ich es keine Passwortdatei nennen. Ich weiß, dass meine Antwort nicht ins Schwarze trifft - aber ich denke, sie wird einige Ideen liefern.
Nils