Chiffrement de fichiers avec gnupg

Lors de la mise en place d'une nouvelle architecture d'annuaire LDAP, nous avons sécurisé les différents composants : accès (utilisation LDAPS), suppression des accès anonymes, révision des ACI, chiffrement de la base de données.

Les sauvegardes sont également chiffrées par l'outillage éditeur (Ping), et les exports LDIF également. L'export des données en mode LDIF est intéressant pour pouvoir récupérer une seule entrée, sans devoir restaurer l'ensemble de la base.

Le souci, c'est que du coup il n'est pas possible de lire les fichiers LDIF chiffrés. Seul l'import dans la topologie de réplication est faisable, ce qui ne nous arrange pas.

J'ai donc cherché une manière alternative de faire cela, l'idée étant la suivante :

  • export LDIF en "clair", compressé
  • chiffrement du fichier (de préférence sans devoir passer en paramètre la clé de chiffrement)

Le déchiffrement du fichier pourrait se faire en saisissant un mot de passe ou une pass phrase. De cette manière, même si une personne accède au fichier et à la machine avec les clés, il ne pourra pas déchiffrer les fichiers.

Après en avoir parlé avec un collègue, la solution gnupg est apparue comme une bonne solution.

Voici donc ce que j'ai testé, avec les différentes étapes :

  • installation
  • création d'une paire de clés
  • chiffrer un fichier
  • déchiffrer un fichier

Installation

Sur un serveur linux de type Red Hat / CentOS, l'installation se fait simplement :

yum install gnupg2

Création d'une paire de clés

La création d'une paire de clés est simple :

gpg --gen-key

Il faut ensuite choisir le type de clé, la longueur (4096 bits recommandé), la durée de vie de la clé, puis un nom, une adresse mail, puis une pass phrase

gpg --gen-key
gpg (GnuPG) 1.4.23; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Sélectionnez le type de clef désiré :
   (1) RSA et RSA (par défaut)
   (2) DSA et Elgamal
   (3) DSA (signature seule)
   (4) RSA (signature seule)
Quel est votre choix ? 1
les clefs RSA peuvent faire une taille comprise entre 1024 et 4096 bits.
Quelle taille de clef désirez-vous ? (2048) 4096
La taille demandée est 4096 bits
Veuillez indiquer le temps pendant lequel cette clef devrait être valable.
         0 = la clef n'expire pas
      <n>  = la clef expire dans n jours
      <n>w = la clef expire dans n semaines
      <n>m = la clef expire dans n mois
      <n>y = la clef expire dans n ans
Pendant combien de temps la clef est-elle valable ? (0) 2y
La clef expire le dim. 29 nov. 2020 21:27:58 CET
Est-ce correct ? (o/N) o

Une identité est nécessaire à la clef ; le programme la construit à partir
du nom réel, d'un commentaire et d'une adresse électronique de cette façon :
   « Heinrich Heine (le poète) <heinrichh@duesseldorf.de> »

Nom réel : Vincent Liefooghe
Adresse électronique : vincent.liefooghe@id-num.com
Commentaire : 
Vous avez sélectionné cette identité :
    « Vincent Liefooghe <vincent.liefooghe@id-num.com> »

Faut-il modifier le (N)om, le (C)ommentaire, l'(A)dresse électronique
ou (O)ui/(Q)uitter ? O
Une phrase secrète est nécessaire pour protéger votre clef secrète.

De nombreux octets aléatoires doivent être générés. Vous devriez faire
autre chose (taper au clavier, déplacer la souris, utiliser les disques)
pendant la génération de nombres premiers ; cela donne au générateur de
nombres aléatoires une meilleure chance d'obtenir suffisamment d'entropie.

On peut ensuite lister les clés :

gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   4096R/CEBEF56F 2018-11-30 [expires: 2020-11-29]
uid                  Vincent Liefooghe <vincent.liefooghe@id-num.com>
sub   4096R/2D9F0F6E 2018-11-30 [expires: 2020-11-29]

Chiffrement d'un fichier

La syntaxe de chiffrement d'un fichier est assez simple également :

gpg -r "UID du destinataire" --encrypt <FICHIER>

Par exemple :

gpg2 -r "Vincent Liefooghe <vincent.liefooghe@id-num.com>"  --encrypt export.ldif

On peut aussi utiliser l'ID de la clé :

gpg2 -r 2D9F0F6E --encrypt export.ldif

Ceci va créer un fichier avec l'extension .gpg, :

ls -l
total 14496
-rw-r--r-- 1 root root 13235368 Nov 30 20:41 export.ldif
-rw-r--r-- 1 root root  1602319 Nov 30 20:45 export.ldif.gpg

Le fichier .gpg est un binaire, non lisible :

file export*
export.ldif:     ASCII text
export.ldif.gpg: GPG encrypted data

Déchiffrement d'un fichier

Une fois le fichier chiffré, il est quand même intéressant de pouvoir le déchiffrer ;-)

La syntaxe est la suivante :

gpg2 --output <FICHIER_DECHIFFRE> --decrypt <FICHIER_CHIFFRE.gpg>

Exemple :

gpg --output EXPORT.clair.ldif --decrypt export.ldif.gpg

Une phrase secrète est nécessaire pour déverrouiller la clef secrète de
l'utilisateur : « Vincent Liefooghe <vincent.liefooghe@id-num.com> »
clef RSA de 4096 bits, identifiant 2D9F0F6E, créée le 2018-11-30 (identifiant de clef principale CEBEF56F)

gpg: chiffré avec une clef RSA de 4096 bits, identifiant 2D9F0F6E, créée le 2018-11-30
      « Vincent Liefooghe <vincent.liefooghe@id-num.com> »

On peut alors voir le résultat :

ls -l 
total 27424
-rw-rw-r--. 1 vliefooghe vliefooghe 13235368 30 nov.  21:54 EXPORT.clair.ldif
-rw-r--r--. 1 vliefooghe vliefooghe 13235368 30 nov.  21:53 export.ldif
-rw-rw-r--. 1 vliefooghe vliefooghe  1602318 30 nov.  21:54 export.ldif.gpg

Le fichier EXPORT.clair.ldif est bien en clair, et on peut donc en extraire les données requises :

head EXPORT.clair.ldif
# Sending search request SearchRequest(baseDN='ou=people,ou=be,o=example', scope=SUB, deref=NEVER, sizeLimit=0, timeLimit=0, filter='(objectclass=*)', attrs={})
dn: ou=People,ou=BE,o=example
objectClass: top
objectClass: organizationalUnit
ou: People

dn: uid=117301,ou=People,ou=BE,o=example
objectClass: top
objectClass: person
objectClass: organizationalPerson

Références

La documentation Ubuntu est assez bien faite sur ce sujet : doc.ubuntu-fr.org/gnupg.

Catégorie