Chiffrement du fichier uniquement avec SSH -priv-key?

22

Supposons que je veuille crypter un fichier afin que moi seul puisse le lire, en connaissant mon mot de passe de clé privée SSH. Je partage un dépôt où je veux crypter ou masquer des informations sensibles. J'entends par là que le dépôt contiendra les informations mais je ne l'ouvrirai que dans des cas particuliers.

  1. Supposons que j'utilise SSH-agent, existe-t-il un moyen simple de crypter le fichier pour que je puisse l'ouvrir plus tard?

  2. Je ne vois pas pourquoi je devrais utiliser GPG pour cela, question ici ; en gros, je connais le mot de passe et je veux seulement déchiffrer le fichier avec le même mot de passe que ma clé SSH. Est-ce possible?

Communauté
la source

Réponses:

27

Je pense que votre exigence est valide, mais d'un autre côté, elle est également difficile, car vous mélangez le chiffrement symétrique et asymétrique. Corrigez-moi si j'ai tort, s'il-vous plait.

Raisonnement:

  1. La phrase secrète de votre clé privée est de protéger votre clé privée et rien d'autre.
  2. Cela conduit à la situation suivante: Vous souhaitez utiliser votre clé privée pour crypter quelque chose que vous seul pouvez décrypter. Votre clé privée n'est pas destinée à cela, votre clé publique est là pour le faire. Tout ce que vous cryptez avec votre clé privée peut être décrypté par votre clé publique (signature), ce n'est certainement pas ce que vous voulez. (Tout ce qui est chiffré par votre clé publique ne peut être déchiffré que par votre clé privée.)
  3. Vous devez donc utiliser votre clé publique pour crypter vos données, mais pour cela, vous n'avez pas besoin de votre phrase secrète de clé privée pour cela. Seulement si vous voulez le décrypter, vous aurez besoin de votre clé privée et de la phrase secrète.

Conclusion: Fondamentalement, vous souhaitez réutiliser votre phrase secrète pour le chiffrement symétrique. Le seul programme que vous voudriez donner à votre phrase secrète est ssh-agent et ce programme ne fait pas de chiffrement / déchiffrement uniquement avec la phrase secrète. La phrase secrète n'est là que pour déverrouiller votre clé privée et ensuite oubliée.

Recommandation: utilisez openssl encou gpg -e --symmetricavec des fichiers de clés protégés par mot de passe pour le chiffrement. Si vous devez partager les informations, vous pouvez utiliser l'infrastructure de clé publique des deux programmes pour créer une PKI / Web of Trust.

Avec openssl, quelque chose comme ceci:

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

et quelque chose comme le décryptage

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

Mise à jour: Il est important de noter que les commandes openssl ci-dessus n'empêchent pas les données d'être altérées. Un simple retournement de bit dans le fichier enc entraînera également des données déchiffrées corrompues. Les commandes ci-dessus ne peuvent pas le détecter, vous devez le vérifier par exemple avec une bonne somme de contrôle comme SHA-256. Il existe des moyens cryptographiques pour le faire de manière intégrée, c'est ce qu'on appelle un HMAC (Hash-based Message Authentication Code).

vasquez
la source
5
Vous avez raison de dire qu'une clé SSH est une clé asymétrique, ne convient pas pour crypter un fichier. Et par conséquent, les commandes que vous fournissez à la fin ne fonctionneront pas. Vous essayez de chiffrer un fichier avec RSA, mais vous ne pouvez chiffrer qu'une très petite charge utile avec RSA (la taille du module moins le remplissage). La méthode normale consiste à générer une clé symétrique à usage unique, à la crypter avec RSA et à crypter les données réelles avec la clé symétrique. Il peut être possible d'importer la clé ssh dans gpg, ce serait la manière saine d'implémenter l'exigence de hhh - mais utiliser gpg avec une clé gpg est la bonne chose à faire.
Gilles 'SO- arrête d'être méchant'
1
Pourquoi proposez-vous gpg avec le drapeau symétrique? Cela fonctionne aussi avec "gpg -e something"mais pour des cas différents?
1
@hhh J'ai supposé que vous ne partageriez pas vos fichiers, donc utiliser simplement symétrique est plus sûr que d'utiliser la cryptographie à clé publique. Pas besoin de paire de clés publique / privée, etc. De pgp.net/pgpnet/pgp-faq/… : "on pense toujours que RSA est le maillon le plus faible de la chaîne PGP." Cela s'applique également à d'autres mécanismes de clé publique comme x509.
vasquez
1
À quoi ressemblerait l’opensl-one-liner? Quelque chose d'équivalent $ gpg -e --symmetric?
1
Utilisez-le pour crypter openssl enc -aes-256-cbc -in my.pdf -out mydata.enc:, décrypter avec: les openssl enc -aes-256-cbc -d -in mydata.enc -out mydecrypted.pdfdeux commandes demandent le mot de passe. Voir man enc(sur rh / fedora / centos) pour toutes les options comme les fichiers de clés, l'encodage base64, etc.
vasquez
21

Je préférerais utiliser l' opensslutilitaire car il semble être assez omniprésent.

Convertissez la clé publique et la clé privée RSA au format 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

Chiffrement d'un fichier avec votre clé publique:

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

Déchiffrer le fichier avec votre clé privée:

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

Mais, comme Gilles l'a commenté ci-dessus, cela ne convient que pour crypter des fichiers plus petits que votre clé publique, vous pouvez donc faire quelque chose comme ceci:

Générez un mot de passe, cryptez le fichier avec lui de manière symétrique et cryptez le mot de passe avec votre public, en l'enregistrant dans le fichier:

$ 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

Déchiffrez la phrase secrète avec votre clé privée et utilisez-la pour déchiffrer le fichier:

$ 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

Vous vous retrouverez avec deux fichiers, votre fichier crypté et votre phrase secrète cryptée, mais mis dans un script, cela fonctionnerait bien.

Vous pouvez même ajouter un tar cvf file file.enc file.enc.keypour ranger.

De manière optimale, vous maximiseriez la taille de votre phrase secrète tout en changeant rand 64la taille de votre clé publique.

kwarrick
la source
Très bien fait, compte tenu des exigences originales de l'OP.
rsaw
2
vient de trouver ce bon article. J'ai trouvé que la clé symétrique de taille maximale que vous pouvez générer à partir de la clé ssh est 12 octets plus courte que la clé ssh elle-même, sinon le rsautl échouerait avec "des données trop grandes pour la taille de la clé". Cela a donc fonctionné dans un script: KEYLEN_BYTES=$(ssh-keygen -l -f $PRIV_KEY | awk '{printf("%d", ($1 - 96) / 8)}')pour autogénérer une longueur de clé. Étant donné que ssh-keygen a une longueur de clé minimale de 768 bits, cela conduit toujours à une clé symétrique minimale de 672 bits, ou 84 octets.
markf
6

Regardez luks / dm-crypt . Vous pouvez utiliser votre clé privée ssh comme clé de chiffrement en utilisant l'option appropriée.

Mise à jour: exemple de chiffrement à l'aide de LUKS avec un périphérique LV-block (test LV dans le système VG):

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

Cela devrait générer un bloc-périphérique / dev / mapper / test_crypt sur lequel vous pouvez utiliser pour stocker vos données (après les avoir formatées avec un système de fichiers de votre choix).

Pour vous en débarrasser, démontez-le et utilisez cryptsetup luksClose test_crypt.

Nils
la source
Pourriez-vous donner MVO pour qu'il soit facile à réutiliser? "$ sudo apt-get install cryptmount crypt-setup; cat '...' > bin/myEncrypt.sh; chmod +x bin/myEncrypt.sh; ./bin/myEncrypt.sh; ...; ..."Si je comprends bien, cette méthode est un chiffrement au niveau du système de fichiers. Il crypte les fs dont vous avez besoin umount / mount ou suis-je mal lu?
2
Je ne pense pas que cela fasse ce que vous pensez. L' --key-fileoption de cryptsetup utilise le contenu réel du fichier comme un grand mot de passe. Il ne lit pas la clé openssl du fichier et l'utilise simplement. Vous pouvez utiliser un fichier d'octets aléatoires pour le --key-filesi vous le souhaitez.
Patrick
@hhh Oui, il s'agit d'un chiffrement de niveau FS.
Nils
4
@Nils mais que se passe-t-il lorsqu'il modifie le mot de passe de sa clé privée, il ne sera plus en mesure de décrypter ses fichiers car les données du fichier de clé ont changé. --key-fileest vraiment un nom mal choisi pour l'option, ça devrait l'être--password-file
Patrick
1
@Patrick C'est vrai - changer la phrase secrète changera le fichier et donc la clé (du point de vue de luks). Mais même du point de vue de ssh, je ne le nommerais pas un fichier de mot de passe. Je sais que ma réponse ne frappe pas la cible - mais je pense qu'elle fournira quelques idées.
Nils