Un peu de cryptage avec GPG

Soumis par -badmin- le mar 11/10/2016 - 08:52

Ayant eu récemment besoin d'une solution de cryptage de fichiers rapide et répandue, je me suis intéressé à GPG (Gnu Privacy Guard), qui est un dérivé open source de PGP, dont je me suis servi pour l'implémentation de sauvegardes cryptées sur mon script obackup.

Facile d'utilisation, je propose de revenir ici sur son utilisation.

Il en existe à ce jour deux implémentations, GPG et GPG2, qui sont logiquement compatibles entre elles, et dont la principale différence réside dans l'intégration de fonctionnalités directement dans le code source (GPG) ce qui en fait un outil 'drop and go', ou via des librairies avec une plus forte intégration au système (GPG2). D'ailleurs, dans la plupart des unix modernes, /usr/bin/gpg est un lien symbolique vers /usr/bin/gpg2. 

Tout d'abord, il faut savoir que la génération d'une clé privée nécessite une bonne quantité de bits aléatoires, que le système fournit via /dev/random et /dev/urandom. Si la génération de la clé prend beaucoup de temps, il est fort à parier que le système n'utilise pas de service générateur de nombres aléatoires. On verifiera la quantité de bits aléatoires "en réserve" du système avec la commande

cat /proc/sys/kernel/random/entropy_avail

Pour installer le service de génération de nombres aléatoires:

yum install rng-tools
rngd -r /dev/urandom

Vous pouvez aussi activer directement le service avec systemd

systemctl start rngd

Nous voilà fin prêts à générer une paire clé de sécurité GPG.

gpg2 --gen-key

Cette commande interactive vous demandera le type de clé à générer. Une clé RSA 4096 bits, voire 8192 me semble un choix raisonnable de nos jours et sera à l'abri de la plupart des tentatives de décryptage par brute force (à moins que les RG s'intéressent vraiment à vos photos de vacances bien évidemment). Pensez à bien renseigner les informations annexes de la clé, comme le nom et l'email, au risque de rendre celle-ci de statut 'non confiance'. Enfin, un mot de passe vous sera demandé, qui sera utilisé plus tard pour pouvoir utiliser la clé privée.

GPG stockera votre nouvelle clé, ainsi que d'autres éventuellement déjà présentes, dans votre dossier ~/.gnupg, et de ce fait, l'outil en ligne de commande y aura accès sans devoir spécifier l'emplacement du fichier.

Vous pouvez lister l'ensemble des clés publiques et privées associées avec les commandes suivantes

gpg2 --list-keys
gpg2 --list-secret-keys

GPG, ou plutôt les cryptages RSA et DSA, fonctionnent de manière asymétrique. La partie publique de votre clé sert à crypter des fichiers et peut-être distribuée librement. La partie privée, elle, doit être conservée avec le plus grand soin. Pour exporter la clé publique, on utilisera

gpg2 --export "Orsiris de Jong" > orsiris.gpg.pub

Pour utiliser cette clé sur un ordinateur tiers, celui-ci devra exécuter

gpg2 --import orsiris.gpg.pub

A partir du moment où une clé publique est présente, on pourra l'utiliser pour crypter des fichiers comme suit

gpg2 --out fichier.gpg --recipient "Orsiris de Jong" --encrypt fichier

Enfin, pour décrypter des fichiers cryptés à l'aide de la clé publique, on utilisera la commande suivante uniquement sur l'ordinateur contenant la clé privée

gpg2 --out fichier.gpg --decrypt fichier

Il va de soi que vos clés privés ne devraient pas exister sur un ordinateur ou encore sur un serveur exposé comme un serveur web.

Enfin, il est toujours intéressant de pouvoir crypter ou décrypter par lot. A cet effet, un petit bash vient à la rescousse

while IFS= read -r -d $'\0' file; do
    gpg2 --batch --yes --out "${file%%.gpg}" --passphrase-file /chemin/mot/de/passe --decrypt "$file"
done < <(find "/chemin/fichiers/a/decrypter" -type f -name "*.gpg" -print0)

L'utilisation de la boucle while avec find permet de traiter les noms de fichiers contenant des caractères spéciaux par rapport à une boucle for, plus simple, mais moins solide. Enfin, comme il n'est jamais très prudent de taper un mot de passe en clair dans un terminal, l'utilisation d'un fichier contenant le mot de passe est de rigueur.