Aller au contenu

Authenticité, intégrité, fiabilité: signer vos commits !

Explorez les clés de la sécurité numérique avec des techniques éprouvées pour signer et gérer efficacement vos commits. Apprenez à garantir l'intégrité de votre code et à renforcer la confiance dans vos projets de développement.

Explorez les clés de la sécurité numérique avec des techniques éprouvées pour signer et gérer efficacement vos commits

Pourquoi signer ses commits ?

La signature des commits est une pratique de sécurité essentielle dans le monde du développement logiciel, en particulier dans des environnements collaboratifs comme GitHub. Elle sert à plusieurs objectifs clés :

  • Authentification : Chaque commit signé porte une empreinte digitale unique qui certifie que le commit a été effectué par le propriétaire de la clé de signature. Cela aide à éviter les usurpations d'identité et les contributions malveillantes.
  • Intégrité : La signature garantit que le contenu du commit reste inchangé depuis sa création. Toute modification, même mineure, invaliderait la signature.
  • Confiance : Dans le cadre de projets open source ou au sein de grandes équipes, la signature des commits renforce la confiance en assurant que les contributions émanent de sources vérifiées et fiables.

Qu'est-ce que GPG ?

GNU Privacy Guard (GPG), également connu sous le nom de GnuPG, est un outil de cryptographie qui permet de chiffrer et de signer des données et des communications. GPG utilise le standard OpenPGP pour fournir un mécanisme de cryptage et de signature robuste.

  • Fonctionnement de GPG : GPG crée une paire de clés (une clé publique et une clé privée). La clé privée est utilisée pour signer des commits, tandis que la clé publique est partagée avec d'autres (comme GitHub) pour vérifier ces signatures.
  • Compatibilité : GPG est largement compatible avec différents systèmes d'exploitation et plateformes, ce qui en fait un outil de choix pour les développeurs travaillant dans divers environnements.

Dans les sections suivantes, nous allons vous guider à travers le processus d'installation de GPG, la création de votre paire de clés, et l'ajout de votre clé publique à GitHub pour commencer à signer vos commits.

Installer GPG

Pour commencer à utiliser GPG pour signer vos commits, la première étape est d'installer le logiciel sur votre système. Voici comment procéder selon votre système d'exploitation :

A. Windows

  1. Téléchargez Gpg4win : Gpg4win (GnuPG for Windows) est un ensemble complet pour la gestion de la cryptographie sous Windows. Il peut être téléchargé depuis le site officiel de Gpg4win.
  2. Installation : Exécutez le fichier d'installation téléchargé et suivez les instructions à l'écran. Assurez-vous d'inclure Kleopatra dans les composants à installer, car c'est un outil de gestion de clés pratique.
  3. Vérification : Après l'installation, ouvrez l'invite de commande et tapez gpg --version pour vérifier que GPG est correctement installé.

B. macOS

  1. Utilisez Homebrew : Homebrew est un gestionnaire de paquets pour macOS. Si vous ne l'avez pas déjà installé, vous pouvez le faire en suivant les instructions sur le site de Homebrew.
  2. Installation de GPG : Ouvrez le Terminal et tapez brew install gnupg pour installer GPG.
  3. Vérification : Après l'installation, tapez gpg --version dans le Terminal pour confirmer que GPG est installé.

C. Linux

  1. Installation via le gestionnaire de paquets : Sur la plupart des distributions Linux, GPG est disponible dans les dépôts officiels. Utilisez votre gestionnaire de paquets pour l'installer :
    • Sur les distributions basées sur Debian/Ubuntu : sudo apt-get install gnupg
    • Sur les distributions basées sur Fedora : sudo dnf install gnupg
    • Sur les distributions basées sur Arch : sudo pacman -S gnupg
  2. Vérification : Dans le terminal, tapez gpg --version pour vérifier que GPG a été installé avec succès.

D. Interactivité avec GPG depuis le Terminal

Configuration de GPG_TTY pour une meilleure interaction :

Lorsque vous utilisez GPG dans le terminal, il est recommandé d'ajouter la configuration suivante à la fin de votre fichier d'initialisation de shell

export GPG_TTY=$(tty)

Cette configuration garantit que GPG peut interagir correctement avec vous, notamment pour la saisie de la passphrase.

Pour savoir quel shell, vous pouvez utiliser la commande echo $SHELL

  • Pour zsh : ajouter la ligne dans ~/.zshrc
  • Pour bash : ajouter la ligne dans ~/.bashrc
  • Si vous utilisez un autre shell, référez-vous à sa documentation et modifiez le fichier correspondant.

Après avoir ajouté la ligne, sauvegardez le fichier et rechargez-le en exécutant source ~/.zshrc ou source ~/.bashrc, ou autre selon votre shell.

Générer sa clé GPG avec le terminal

Après avoir installé GPG, l'étape suivante est de générer votre paire de clés (publique et privée). Suivez ces étapes pour créer votre clé GPG :

A. Lancement du processus de génération de clé

  1. Ouvrir le terminal : Commencez par ouvrir votre terminal ou invite de commande.
  2. Commande de génération de clé : Tapez gpg --full-generate-key et appuyez sur Entrée. Cette commande lance l'assistant de création de clé.
gpg --full-generate-key
⚠️
Vous devez utiliser une version de gpg ≥ 2.1.17 pour utiliser l'option --full-generate-key

B. Sélection du type de clé

  1. Choix du type de clé : GPG vous demandera de choisir le type de clé. Pour la plupart des utilisateurs, l'option par défaut (RSA and RSA) est appropriée. Appuyez sur Entrée pour continuer.
  2. Taille de la clé : Choisissez une taille de clé. Pour une sécurité optimale, il est recommandé de choisir au moins 2048 bits, mais 4096 bits est l'idéal si vous recherchez une sécurité accrue.

C. Choix de la durée de validité de la clé

  1. Définir l'expiration : GPG vous demandera ensuite combien de temps la clé doit rester valide. Une option commune est de définir une période d'expiration (comme 1 ou 2 ans) ou vous pouvez choisir que la clé ne expire jamais.
  2. Confirmer le choix : Après avoir fait votre choix, confirmez-le et continuez.

D. Ajout de renseignements personnels

  1. Identité de l'utilisateur : GPG vous demandera de saisir votre nom, votre adresse e-mail (celle associée à votre compte GitHub ou GitLab) et éventuellement un commentaire. Ces informations seront associées à votre clé publique. Dans le cas de GitHub ou GitLab, pour garder son adresse email privée, vous pouvez utiliser l’adresse no-reply de votre compte.
  2. Création de la phrase secrète : Vous serez invité à créer une phrase secrète pour protéger votre clé privée. Choisissez une phrase secrète forte et mémorable.
⚠️
Très important
Le choix de l'email de la clé GPG doit respecter plusieurs critères :
1. Un email valide du compte GitHub/GitLab
2. Identique à l'adresse email utilisée pour la création du commit
👍
Bonne pratique : utilisez les emails privés no-reply fournit avec GitHub ou GitLab pour la création de commit et pour la clef GPG.
Cela a 2 avantages
1) garder votre adresse privée lorsque vous commitez sur des repos (public ou non)
2) dans le cas de la révocation de votre clé GPG, vous pourrez la diffuser sur des serveurs publics sans donner votre email d'usage

E. Finalisation et vérification

  1. Achever la génération : Une fois toutes les informations saisies, GPG générera votre paire de clés. Cela peut prendre quelques instants, surtout si vous avez choisi une grande taille de clé.
  2. Lister vos clés : Pour voir vos clés GPG générées, tapez gpg --list-secret-keys --keyid-format LONG. Notez l'identifiant de la clé (situé après "sec rsa4096/" par exemple) car vous en aurez besoin pour la suite.
gpg --list-secret-keys --keyid-format LONG
💡
La ligne suit généralement le format suivant :
sec <algo>/<keyid> <date>
<keyid> est l'identifiant de la clef que l'on va avoir besoin

Configurer son environment local

A. Vérification de l'email utilisé pour la création de commit

Ouvrez votre terminal et tapez

git config --global user.email

Assurez-vous que cette adresse email est la même que celle enregistrée et validée sur votre compte GitHub/GitLab et celle utilisée pour générer votre clé GPG.

Changez l'email si nécessaire
1. Soit en régénérant une clef GPG avec l'adresse email correcte
2. Soit en changeant l'adresse email utilisée pour la création de commit avec la commande

git config --global user.email "votre-email@exemple.com"
💡
Si vous travaillez sur plusieurs projets avec des emails différents, vous pouvez configurer l'email pour un seul dépôt en exécutant cette commande sans l'option --global dans le répertoire du dépôt.

B. Récupération de l'identifiant de votre clé GPG

C'est le <keyid> évoqué à l'étape précédente. Pour rappel, lancer la commande

gpg --list-secret-keys --keyid-format LONG

La ligne suit généralement le format suivant :
sec <algo>/<keyid> <date>
<keyid> est l'identifiant de la clef que l'on va avoir besoin.


C. Configuration de Git pour utiliser votre clé GPG

Utilisez la commande

git config --global user.signingkey <keyid>

en remplaçant le <keyid> par l'identifiant de votre clef GPG. Vous pouvez vérifier sa valeur avec la commande git config --global user.signingkey

💡
Vous pouvez également configurer la clef gpg utilisée pour un seul dépôt en exécutant cette commande sans l'option --global dans le répertoire du dépôt.

D. Activation de la signature automatique des commits

  • Signature par défaut : Pour signer automatiquement tous vos commits, utilisez la commande
git config --global commit.gpgsign true
git config --global tag.gpgsign true
  • Signature manuelle : Si vous préférez signer certains commits manuellement, vous pouvez omettre cette étape et utiliser l'option -S dans la commande de commit, par exemple
git commit -S -m "Votre message de commit"

E. Test de la configuration

  • Commit de test : Pour tester si tout est configuré correctement, faites un commit test dans un de vos dépôts.
  • Vérification de la signature : Utilisez git log --show-signature pour vérifier que le commit est signé.

Conserver un certificat de révocation

A. Importance du Certificat de Révocation

Un certificat de révocation est essentiel pour maintenir la sécurité de vos clés. En cas de compromission ou de perte de votre clé privée, le certificat de révocation vous permet de révoquer l'accès à votre clé publique.

⚠️
Le certificat de révocation est généré à partir de la clé privée qui est sécurisée par une passphrase. Si vous perdez cette dernière, vous ne pourrez pas générer ce certificat. Il est donc conseillé de le générer en même temps que la clé GPG puis et le mettre en lieu sûr.

B. Création et Sauvegarde

Par défaut, GPG crée un certificat de révocation lorsque vous générez une nouvelle clé. Vous pouvez trouver ce certificat à l'intérieur d'un fichier situé ici ~/.gnupg/openpgp-revocs.d/<keyfingerprint>.rev, où <keyfingerprint> est l'emprunte de votre clé. Vous pouvez la retrouver avec lors de l'utilisation de la commande gpg --list-secret-keys --keyid-format LONG elle s'affiche en dessous de la ligne <algo>/<keyid> <date> qui correspond à votre clé. Suivez les instructions dans le fichier <keyfingerprint>.rev pour y extraire le certificat de révocation.

Vous pouvez aussi en générer un nouveau à l'aide de votre clé privé avec la commande:

gpg --output revoke.asc --gen-revoke <keyid>

<keyid> est l'identifiant de la clé GPG.

💡
Rappel : Pour retrouver cet identifiant, vous pouvez utiliser la commande gpg --list-secret-keys --keyid-format LONG
La ligne suit généralement le format suivant :
sec <algo>/<keyid> <date>
<keyid> est l'identifiant de la clé que l'on va avoir besoin

Conservez ce certificat dans un endroit sûr. En cas de besoin, vous pourrez l'utiliser pour révoquer votre clé publique et informer les plateformes et les collaborateurs que la clé n'est plus fiable.

Configurer la plateforme d'hébergement de code source (GitHub/GitLab)

A. Principe de base de la signature numérique

  • Clé privée pour signer : Lorsque vous signez un commit, vous utilisez votre clé privée GPG. C'est une pratique sécurisée car votre clé privée est protégée par une passphrase que vous avez définie lors de sa génération. Cette signature garantit que le commit provient de vous et n'a pas été altéré.
  • Clé publique pour vérifier : Pour qu'un tiers (comme GitHub ou GitLab) puisse vérifier la signature de vos commits, vous devez leur fournir votre clé publique. Cette clé permet de vérifier que la signature correspond à la clé privée sans divulguer les informations sensibles de la clé privée.

B. Importance de la sécurisation de la clé privée

  • Gardez votre clé privée sécurisée : Il est crucial de garder votre clé privée en sécurité et de ne jamais la partager. La passphrase ajoutée à votre clé lors de la génération est une couche de sécurité supplémentaire.
  • Risques liés à la compromission : Si votre clé privée est compromise, cela pourrait remettre en cause l'authenticité de vos contributions. En cas de compromission, il est nécessaire de révoquer la clé et d'en générer une nouvelle. Ceci fera l'objet d'une autre partie.

C. Exporter sa clé publique

Après avoir généré votre paire de clés GPG, vous devrez exporter votre clé publique pour l'ajouter à votre plateforme d'hébergement de code source. Voici comment procéder :

Ouvrez votre terminal et lancer la commande :

gpg --armor --export <keyid>

<keyid> est l'identifiant de la clé GPG.

💡
Rappel : Pour retrouver cet identifiant, vous pouvez utiliser la commande gpg --list-secret-keys --keyid-format LONG
La ligne suit généralement le format suivant :
sec <algo>/<keyid> <date>
<keyid> est l'identifiant de la clé que l'on va avoir besoin

L'exportation affichera votre clé publique dans le terminal sous forme de texte. Sélectionnez et copiez cette clé en entier, y compris les lignes -----BEGIN PGP PUBLIC KEY BLOCK----- et -----END PGP PUBLIC KEY BLOCK-----.

💡
Stockage temporaire : Il est conseillé de coller la clé publique dans un fichier texte temporaire, au cas où vous auriez besoin de la copier à nouveau, par exemple, si vous configurez plusieurs plateformes ou comptes.

GitHub

Configuration de GitHub

A. Signification du Badge Verified

  • Authenticité et Intégrité : Le badge Verified sur un commit indique que GitHub a validé la signature numérique associée à ce commit. Cela prouve que le commit a été effectué par le détenteur de la clé privée correspondant à la clé publique enregistrée, et que le contenu du commit n'a pas été modifié depuis sa signature.
  • Confiance et Professionnalisme : Ce badge renforce la confiance dans la qualité et la sécurité du code. Il montre également un niveau de professionnalisme dans la gestion de l'intégrité et la sécurisation des contributions.
  • Mise en évidence : Le badge apparaît à côté du nom de l'auteur du commit, le rendant immédiatement visible et facilement identifiable pour les autres utilisateurs et contributeurs.

B. Ajout de la Clé Publique à GitHub

  • Accès aux Paramètres : Connectez-vous à GitHub, puis accédez à vos paramètres de compte "Settings".
  • Gestion des Clés GPG : Naviguez vers la section "SSH and GPG keys" et cliquez sur "New GPG key".
  • Coller la Clé Publique : Collez votre clé publique GPG, récupérée dans la section précédente, dans le champ de texte fourni. Vous pouvez optionnellement donner un nom à votre clé.
💡
Rappel : pour récupérer votre clef publique utiliser la commande
gpg --armor --export <keyid>
  • Enregistrer la Clé : Cliquez sur "Add GPG key" pour ajouter la clé à votre compte.

C. Vérification du badge

Poussez votre commit sur GitHub et vérifiez que tout est en ordre

🎉 Félicitations 🎉 vos commits signés sont maintenant reconnus sur GitHub !

Conséquences de la Suppression de la Clé Publique
Si vous supprimez votre clé publique GPG de GitHub, tous les anciens commits signés avec la clé privée correspondante seront marqués comme Unverified. Cela peut affecter la perception de l'intégrité et de l'authenticité de vos contributions passées. Pour faire cela proprement en conservant la mention verified vous pouvez suivre la procédure de la partie "Révoquer une clé GPG, faire une Rotation"

GitLab

Configuration de GitLab

A. Signification du Badge Vérifiée

  • Validation de la Signature : Tout comme sur GitHub, le badge "Vérifiée" sur un commit dans GitLab indique que la plateforme a validé la signature numérique associée à ce commit.
  • Garantie de l'Origine : Ce badge certifie que le commit a été réalisé par le détenteur de la clé privée correspondant à la clé publique enregistrée, assurant ainsi que le contenu du commit n'a pas été altéré.
  • Renforcement de la Confiance : La présence de ce badge renforce la confiance dans l'intégrité et la sécurité des contributions au sein d'un projet.

B. Ajouter la Clé Publique à GitLab

  • Paramètres de Compte : Connectez-vous à GitLab et accédez à vos paramètres de compte.
  • Gestion des Clés GPG : Naviguez vers la section "Clés GPG" dans les paramètres utilisateur.
  • Coller la Clé Publique : Collez votre clé publique GPG, récupérée dans la section précédente, dans le champ de texte fourni.
💡
Rappel : pour récupérer votre clef publique utiliser la commande
gpg --armor --export <keyid>
  • Enregistrer la Clé : Cliquez sur "Ajouter une clé" pour ajouter la clé à votre compte.

C. Vérification du badge

Poussez votre commit sur GitLab et vérifiez que tout est en ordre

🎉 Félicitations 🎉 vos commits signés sont maintenant reconnus sur GitLab !

⚠️
Importance de l'Ordre des Opérations
Ajout de la clé sur le compte avant le push : si vous poussez un commit signé avant d'avoir ajouté la clé correspondante à votre compte, le commit apparaîtra comme "non vérifiée", même s'il a été correctement signé avec la bonne clé privée.

Révoquer une clé GPG, faire une Rotation

A. Pourquoi et Quand Révoquer une Clé ?

  • Sécurité : Si vous pensez que votre clé privée a été compromise ou si vous avez oublié votre passphrase, la révocation d'une clé est nécessaire !
  • Changement : Vous pouvez également vouloir révoquer une clé si vous changez d'adresse email ou si vous créez une clé plus forte.

B. Création d'un Certificat de Révocation

Si vous avez suivi cet article jusqu'ici, vous avez déjà à disposition votre certificat de révocation. Si ce n'est pas le cas, vous pouvez toujours vous référez à la section "Conserver un certificat de révocation".

💡
Si vous avez toujours accès à la clé privée, il est plus adapté de générer un nouveau certificat avec la commande gpg --output revoke.asc --gen-revoke <keyid> vous pourrez ainsi fournir la raison de la révocation.

Partons donc du postulat que vous avez maintenant votre certificat de révocation dans le fichier revoke.asc


C. Révocation de la clé publique

Importez votre certificat dans votre trousseau avec la commande:

gpg --import revoke.asc
💡
En utilisant la commande gpg --list-secret-keys --keyid-format LONG vous pouvez constater que votre clé est bien révoquée dans votre trousseau.

Votre clef est maintenant localement révoquée. Vous pouvez ensuite exporter la clef publique révoquée avec la commande :

gpg --armor --export <keyid>

Et la renseigner sur GitHub / GitLab à la place de l'ancienne clé publique. Vous conserverez alors le statut Verified sur vos commits précédemment signé la clé privée.


D. Diffusion de la clé publique révoquée sur un serveur public

Après avoir révoqué votre clé GPG, il est important de s'assurer que la révocation est reconnue publiquement. Cela se fait en diffusant la clé révoquée sur un serveur de clés public.

⚠️
Sécurité des emails sur les serveurs publics de clés
Lorsque vous diffusez votre clé publique sur un serveur de clés public, gardez à l'esprit que votre adresse email associée à la clé est généralement visible publiquement.
Elle peut donc être la cible de spams, ce qui pose des risques de sécurité et de confidentialité. Pour éviter cela l'utilisation d'une adresse email no-reply, comme celles fournies par GitHub/GitLab, est une mesure de sécurité recommandée.
  1. Pourquoi Diffuser la Révocation ?
  • Transparence : La diffusion de la révocation informe la communauté et les collaborateurs que la clé n'est plus sûre ou valide.
  • Prévention : Cela empêche l'utilisation future de la clé pour la vérification des signatures, protégeant ainsi l'intégrité de vos projets.
  1. Choisir un Serveur de Clés Public
  • Serveurs Populaires : Des serveurs comme le serveur de clés SKS, le serveur de clés MIT, ou le serveur de clés OpenPGP sont des choix courants.
  • Compatibilité : Assurez-vous que le serveur que vous choisissez est compatible avec les plateformes où votre clé a été utilisée (par exemple, GitHub ou GitLab).

On peut par exemple utiliser keys.openpgp.org ou keyserver.ubuntu.com. Vous pouvez le faire manuellement sur leur site ou utiliser la commande suivante :

gpg --keyserver keyserver.ubuntu.com --send-keys <keyid>

Vous pouvez a présent terminer par la création d'une nouvelle clé en reprenant les étapes des sections précédentes.

Bonus

Configuration du Cache du GPG Agent

Pour une meilleure gestion de la saisie de votre passphrase GPG, vous pouvez configurer le cache du GPG agent. Cela vous permet de définir pendant combien de temps la passphrase reste en mémoire après l'avoir saisie, réduisant ainsi la fréquence à laquelle vous devez la rentrer.

Le fichier de configuration se trouve généralement dans ~/.gnupg/gpg-agent.conf. Si le fichier n'existe pas, vous pouvez le créer.

  • Configurer le Temps de Cache par Défaut : Vous pouvez définir la durée pendant laquelle GPG garde en cache la passphrase après une activité GPG. Par exemple :
# Set the default cache time to 1 day.
default-cache-ttl 86400

Cela configure le cache pour garder la passphrase pendant 1 jour (86400 secondes).

  • Configurer le Temps de Cache Maximum : Vous pouvez également définir une durée maximale de mise en cache après avoir entré votre passphrase :
# Set the max cache time to 30 days.
max-cache-ttl 2592000

Cela signifie que la passphrase sera mémorisée pendant 30 jours maximum (2592000 secondes).

Redémarrez le GPG Agent

Pour que les modifications prennent effet, redémarrez le GPG agent avec la commande :

gpgconf --reload gpg-agent

Vous pouvez aussi utilisez la commande gpgconf --kill gpg-agent

Dernier