44 votes

Crypter le fichier tar.gz lors de sa création

J'ai un script qui crée une sauvegarde nocturne de plusieurs répertoires.

Il est créé en utilisant tar -czf, et le chemin du fichier tar.gz de destination est sur un répertoire réseau monté. Le fichier résultant fait environ 1,2 Go.

La vitesse du réseau est raisonnablement rapide (la copie du lecteur réseau vers le local se fait à environ ~28 Mo/s).

Maintenant, je veux utiliser le cryptage à clé publique pour crypter le fichier tar.gz avant de le transférer sur le lecteur réseau, et j'aimerais savoir quelle est la meilleure façon de le faire.

Dois-je créer le fichier localement d'abord, le crypter, puis le copier? Ou y a-t-il un moyen de "diffuser" la sortie tar à travers un processus de cryptage, et écrire les résultats directement sur le lecteur réseau?

48voto

Fabiano Soriani Points 543

Emballer your_dir dans une archive chiffrée your_archive.tgz.gpg (chiffrement symétrique):

tar -cz your_dir | gpg -c -o your_archive.tgz.gpg

Déballer :

gpg -d your_archive.tgz.gpg | tar xz

Consultez la documentation de GPG pour savoir comment utiliser le chiffrement asymétrique au lieu du chiffrement symétrique.

17voto

Floros Points 151

Le processus suivant chiffre d'abord le fichier sur le disque local, puis peut être envoyé sur le réseau (ou stocké comme nécessaire)


Tout d'abord, générer des clés publique et privée (faites une seule fois):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout

Ensuite, à chaque sauvegarde:

  1. Générer une phrase secrète longue et aléatoire, enregistrer dans un fichier

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. Chiffrer le fichier avec la phrase secrète

    • openssl enc -aes-256-cbc -pass file:key.txt < FICHIER_NON_CHIFFRE > encrypted.dat
  3. Chiffrer la phrase secrète avec la clé publique

    • openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt

Enregistrer ensuite encrypted.dat ET enc.key.txt où vous le souhaitez.


Pour déchiffrer:

  1. Déchiffrer la passphrase chiffrée avec la clé privée

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. Déchiffrer le fichier

    • openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > FICHIER_NON_CHIFFRE

C'est beaucoup plus long que la réponse de Florian, mais j'ai décidé de l'utiliser afin de mieux comprendre le processus et de ne pas dépendre des variables de configuration GPG dépendantes du serveur, etc. Je n'ai pas non plus trouvé de documentation utile sur GPG.

11voto

mightypile Points 975

Je fais cela avec le cryptage à clé asymétrique. Cela signifie que j'ai une clé publique (que je peux partager avec qui je veux m'envoyer des paquets cryptés) qui me permet de crypter le paquet. J'ai aussi une clé privée (que je ne partage pas) qui me permet de décrypter le paquet.

Mes commandes pour crypter le répertoire de travail actuel : le -e pour crypter, le -r pour spécifier un "destinataire" ou une clé à utiliser, le -o pour spécifier le fichier de sortie.

$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg

Et pour décrypter dans le répertoire de travail actuel :

$ gpg -d backup.tgz.gpg | tar -xz

Ou pour décrypter dans un fichier tgz standard pour le déballage ultérieur :

$ gpg -o backup.tgz -d backup.tgz.gpg

Évidemment, cela ne fonctionne que si j'ai déjà généré une paire de clés publique-privée et installé avec gpg. Dans mon cas, j'ai suivi le guide de Digital Ocean sur https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-on-an-ubuntu-12-04-vps. Le ABCD1234 dans la commande de cryptage fait référence à l'une des clés publiques installées sur mon système. Ce guide explique également comment partager votre clé publique et installer les clés publiques des autres pour envoyer et recevoir des fichiers cryptés.

0voto

Buttercup Points 564

GnuPG est ce que j'ai choisi d'utiliser pour ce processus et parce que vous avez indiqué que les étapes de déchiffrement étaient trop opaques (je suis d'accord dans ce cas d'utilisation) j'ai également travaillé sur ce côté du problème là. Vérifiez les logs de construction du Travis-CI du projet pour voir quelles fonctionnalités fonctionnent actuellement comme prévu et le fichier travis.yml pour suivre la sortie des logs. Fondamentalement, vous aurez besoin de trois scripts de ce projet : le script de génération de clé, le script d'aide au déchiffrement et le script d'écouteur de pipe nommé. Le script de génération de clé et le script d'aide au déchiffrement doivent être utilisés sur l'appareil qui effectuera le déchiffrement et le script d'écouteur de pipe nommé doit être sur l'appareil effectuant le chiffrement.

Le script d'écouteur de pipe nommé pour le chiffrement accepte des chaînes, des chemins de fichiers ou des chemins de répertoires une fois configuré et produit des résultats chiffrés de manière prévisible.

Voici des commandes d'exemple qui pourraient être placées dans votre script de sauvegarde nocturne pour le chiffrement et pour la compression + chiffrement de répertoires

echo "quelques messages texte" > /chemin/vers/pipe.nomme
## Le texte du message est chiffré en armure ASCII et ajouté au fichier spécifié lorsque le script a été démarré
echo "${HOME}/Documents" > /chemin/vers/pipe.nomme
## Les répertoires sont compressés avec tar et chiffrés avec une sortie vers un fichier horodaté dans le répertoire de sortie en vrac
echo "${HOME}/.bash_history"  > /chemin/vers/pipe.nomme

Pour le déchiffrement, vous voudrez consulter comment les scripts de construction .travis-ci/script_decrypt.sh et .travis-ci/test_search_script_decrypt.sh fonctionnent pour récupérer les chaînes chiffrées de données et comment les fichiers/répertoires en vrac sont restaurés.

Bien sûr, avec des choses aussi expérimentales, il est préférable de ne pas utiliser de paires de clés principales (c'est un peu pourquoi le script de génération de clé a été écrit) et cela ne devrait pas être utilisé sur des données importantes jusqu'à ce que vous soyez sûr de savoir comment les restaurer en forme lisible.

0voto

pedda Points 31

J'ai utilisé la solution géniale de Florian Diesch ci-dessus, mais j'ai rencontré ce problème :

gpg: problème avec l'agent : Inappropriate ioctl for device
gpg: erreur de création du mot de passe : Operation cancelled
gpg: chiffrement symétrique de '[stdin]' a échoué : Operation cancelled

En plus de travailler avec mon Ubuntu 20.04, j'ai dû définir pour gpg :

$GPG_TTY=$(tty)
$export GPG_TTY

comme décrit ici

Ensuite, j'ai pu continuer avec la solution de Florian ! Merci !

Une méthode légèrement différente qui fonctionne également bien avec Linux (Ubuntu 20.04) est décrite ici

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X