Crittografare il file solo con chiave SSH -priv?


22

Supponiamo di voler crittografare un file in modo che solo io possa leggerlo, conoscendo la mia password della chiave privata SSH. Sto condividendo un repository in cui voglio crittografare o offuscare le informazioni sensibili. Con ciò intendo che il repository conterrà le informazioni, ma le aprirò solo in casi speciali.

  1. Supponiamo che io stia usando SSH-agent, esiste un modo semplice per crittografare il file affinché solo io possa aprirlo in seguito?

  2. Non riesco a capire perché dovrei usare GPG per questo, domanda qui ; in pratica conosco la password e voglio solo decrittografare il file con la stessa password della mia chiave SSH. È possibile?

Risposte:


27

Penso che il tuo requisito sia valido, ma d'altra parte è anche difficile, perché stai mescolando la crittografia simmetrica e asimmetrica. Per favore correggimi se sbaglio.

Ragionamento:

  1. La passphrase per la tua chiave privata è proteggere la tua chiave privata e nient'altro.
  2. Questo porta alla seguente situazione: vuoi usare la tua chiave privata per crittografare qualcosa che solo tu puoi decifrare. La tua chiave privata non è destinata a questo, la tua chiave pubblica è lì per farlo. Qualunque cosa tu cripti con la tua chiave privata può essere decifrata dalla tua chiave pubblica (firma), non è certo quello che vuoi. (Tutto ciò che viene crittografato dalla tua chiave pubblica può essere decrittografato solo dalla tua chiave privata.)
  3. Quindi è necessario utilizzare la chiave pubblica per crittografare i dati, ma per questo non è necessaria la passphrase della chiave privata. Solo se vuoi decrittografarlo avrai bisogno della tua chiave privata e della passphrase.

Conclusione: in pratica si desidera riutilizzare la passphrase per la crittografia simmetrica. L'unico programma che vorresti dare alla tua passphrase è ssh-agent e questo programma non esegue la crittografia / decrittografia solo con la passphrase. La passphrase è lì solo per sbloccare la chiave privata e poi dimenticata.

Raccomandazione: utilizzare openssl enco gpg -e --symmetriccon file di chiavi protetti da passphrase per la crittografia. Se è necessario condividere le informazioni, è possibile utilizzare l'infrastruttura a chiave pubblica di entrambi i programmi per creare una PKI / Web of Trust.

Con openssl, qualcosa del genere:

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

e decifrare qualcosa di simile

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

Aggiornamento: è importante notare che i comandi openssl di cui sopra NON impediscono la manomissione dei dati. Un semplice capovolgimento del file enc comporterà anche la decodifica dei dati danneggiati. I comandi precedenti non possono rilevarlo, è necessario verificarlo ad esempio con un buon checksum come SHA-256. Esistono modi crittografici per farlo in modo integrato, questo è chiamato HMAC (codice di autenticazione dei messaggi basato su hash).


5
Hai ragione nel dire che una chiave SSH è una chiave asimmetrica, non adatta alla crittografia di un file. E di conseguenza, i comandi forniti alla fine non funzioneranno. Stai tentando di crittografare un file con RSA, ma puoi crittografare solo un payload molto piccolo con RSA (la dimensione del modulo meno il riempimento). Il metodo normale è generare una chiave simmetrica monouso, crittografarla con RSA e crittografare i dati reali con la chiave simmetrica. Potrebbe essere possibile importare la chiave ssh in gpg, questo sarebbe il modo sano per implementare i requisiti di hhh - ma usare gpg con una chiave gpg è la cosa giusta da fare.
Gilles 'SO- smetti di essere malvagio' il

1
Perché suggerisci gpg con la bandiera simmetrica? Funziona anche con "gpg -e something"ma per casi diversi?

1
@hhh supponevo che non avresti condiviso i tuoi file, quindi usare semplicemente il simmetrico è più sicuro che usare la crittografia a chiave pubblica. Non c'è bisogno di una coppia di chiavi pubblica / privata, ecc. Da pgp.net/pgpnet/pgp-faq/… : "si ritiene ancora che RSA sia l'anello più debole della catena PGP." Questo vale anche per altri meccanismi pubkey come x509.
Vasquez,

1
Che aspetto avrebbe il openssl-one-liner? Qualcosa di equivalente a $ gpg -e --symmetric?

1
Utilizzare questo per crittografare openssl enc -aes-256-cbc -in my.pdf -out mydata.enc:, decrittografare con: openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfentrambi i comandi richiedono la password. Vedi man enc(su rh / fedora / centos) per tutte le opzioni come keyfile, codifica base64 ecc.
vasquez

21

Preferirei usare l' opensslutilità in quanto sembra essere abbastanza onnipresente.

Converti chiave pubblica RSA e chiave privata in formato PEM:

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

Crittografia di un file con la tua chiave pubblica:

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

Decifrare il file con la tua chiave privata:

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

Ma, come ha commentato Gilles sopra, questo è adatto solo per crittografare file più piccoli della tua chiave pubblica, quindi potresti fare qualcosa del genere:

Genera una password, crittografa il file con essa in modo simmetrico e crittografa la password con il tuo pubblico, chiave salvandola nel file:

$ 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

Decifrare la passphrase con la chiave privata e usarla per decrittografare il file:

$ 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

Finirai con due file, il tuo file crittografato e la tua passphrase crittografata, ma messi in uno script funzionerebbe bene.

Potresti anche aggiungere un tar cvf file file.enc file.enc.keya riordinare.

In modo ottimale, massimizzeresti la dimensione della tua passphrase e cambierai rand 64anche la dimensione della tua chiave pubblica.


Molto ben fatto, considerando i requisiti eccentrici del PO.
rsaw

2
ho appena trovato questo, bel post. Ho scoperto che la chiave simmetrica della dimensione massima che è possibile generare dal tasto ssh è più corta di 12 byte rispetto al tasto ssh stesso, altrimenti il ​​rsautl fallirebbe con "dati troppo grandi per la dimensione del tasto". Quindi questo ha funzionato in una sceneggiatura: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')autogen di una lunghezza chiave. Dato che ssh-keygen ha una lunghezza minima della chiave di 768 bit, ciò porta comunque a una chiave simmetrica minima di 672 bit o 84 byte.
markf

6

Guarda luks / dm-crypt . Puoi usare la tua chiave privata ssh come chiave di crittografia usando l'opzione appropriata.

Aggiornamento: Esempio di crittografia mediante LUKS con un dispositivo a blocchi LV (test LV nel sistema VG):

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

Questo dovrebbe generare un dispositivo a blocchi / dev / mapper / test_crypt che puoi usare per archiviare i tuoi dati (dopo averli formattati con un filesystem di tua scelta).

Per sbarazzartene, smontalo e usalo cryptsetup luksClose test_crypt.


Potresti dare a MVO di farlo in modo che sia facile da riutilizzare? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Se riesco a capire bene, questo metodo è una crittografia a livello di file system. Crittografa gli fs di cui hai bisogno umount / mount o sto leggendo male questo?

2
Non penso che questo faccia quello che pensi che faccia. L' --key-fileopzione per cryptsetup utilizza il contenuto effettivo del file come un'unica grande password. Non legge la chiave openssl dal file e non la usa. --key-fileSe lo desideri, puoi utilizzare un file di byte casuali .
Patrick

@hhh Sì, questa è una crittografia a livello di FS.
Nils

4
@Nils ma cosa succede quando cambia la password sulla sua chiave privata, ora non sarà in grado di decrittografare i suoi file quando i dati nel file della chiave cambiano. --key-fileè davvero un nome mal scelto per l'opzione, dovrebbe essere--password-file
Patrick

1
@Patrick Questo è vero: cambiando la passphrase si cambierà il file e quindi la chiave (dal punto di vista del luks). Ma anche dal punto di vista di ssh non lo chiamerei un file di password. So che la mia risposta non ha colpito nel segno, ma penso che fornirà alcune idee.
Nils,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.