Génération d'une clé GPG

Les artefacts générés par la chaîne d'outils d'intégration continue IBM Cloud DevSecOps et enregistrés dans l'inventaire doivent être signés avant d'être déployés en production. Le pipeline d'intégration continue utilise Skopeo comme outil par défaut pour fournir la fonctionnalité de signature des artefacts.

Créer et stocker une clé GPG qui est utilisée par le DevSecOps pipeline d'intégration continue, soit automatiquement, soit manuellement.

Générer automatiquement une clé GPG

A l'aide de cette méthode, le modèle génère la clé GPG pour vous. Entrez le nom et l'adresse électronique pour la génération de clés en procédant comme suit:

  1. Accédez à Signature d'artefact et cliquez sur Nouveau.

    Signature de l'image
    Signature de l'artefact

  2. Dans la fenêtre, les zones name et email sont préremplies avec le nom de la chaîne d'outils et l'ID de l'e-mail. Modifiez le nom et l'ID d'e-mail pour refléter vos exigences de clé GPG. Vous pouvez également stocker les clés dans votre fournisseur de secrets en sélectionnant la case.

    Modifier le nom et l'adresse électronique
    Modifier le nom et l'adresse électronique

  3. Une fois la clé générée, vous pouvez la copier à titre de référence.

    Certificat de signature d'image
    Figure 3 Certificat de signature d'artefact

La clé copiée est au format base64. Décodez la clé avant de l'importer sur votre porte-clés. echo <encoded_gpg_key> | base64 --decode

Générer manuellement une clé GPG

Téléchargement et installation des outils de ligne de commande GPG

Téléchargez et installez les outils en ligne de commande GPG adaptés à votre système d'exploitation. Rendez-vous dans la section des versions binaires du site GnuPG pour télécharger les outils adaptés à votre système d'exploitation.

Mac OS X

  • Téléchargez et installez Mac GPG.
  • Vérifiez la version GPG installée. A partir la ligne de commande, exécutez la commande suivante :
$ gpg --version
gpg (GnuPG) 2.3.1
libgcrypt 1.9.3
Copyright (C) 2021 Free Software Foundation, Inc.
  • Pour les versions de GPG antérieures à 2.3.1, il se peut que l'option --passphrase='' ne puisse pas être utilisée. Dans ce cas, vous pouvez omettre le mot de passe dans la boîte de dialogue suivante en appuyant sur Entrée lorsque vous y êtes invité.

Windows

  • Télécharger et installer GitBash (nécessaire pour l'encodage d' base64 ).
  • Vérifiez la version GPG installée. Exécutez la commande suivante dans l'invite de commande Git bash:
$ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.8.7
Copyright (C) 2021 g10 Code GmbH

Génération d'une clé GPG

Laissez la phrase passe et la zone vide si la commande generate-key ouvre une boîte de dialogue qui demande une phrase passe. Il s'agit d'une limitation de l'utilitaire skopeo utilisé pour la signature d'images : le pipeline ne peut pas accepter une clé privée protégée par une phrase de passe. Si vous indiquez la phrase secrète lors de la création, votre pipeline ne parvient pas à décoder le certificat et échoue à l'étape de signature de l'image. Notez que cela s'applique également à la signature des balises GIT.

Mac OS X et Linux™

À partir de l'invite de commande, exécutez la commande suivante :

gpg --pinentry-mode loopback --passphrase='' --generate-key
  • Entrez votre nom et votre adresse e-mail.
  • Appuyez sur O pour lancer la création de la clé.
  • Une fois la clé générée, sélectionnez l'option O.

Windows

Version GPG > 1.4

A l'invite de commande Git Bash, exécutez la commande suivante :

gpg --pinentry-mode loopback --passphrase='' --generate-key
  • Saisissez votre nom dans le champ « Nom réel ».
  • Entrez votre adresse électronique dans la zone Adresse électronique.
  • Appuyez sur O pour lancer la création de la clé.
  • Une fois la clé générée, sélectionnez l'option O.

Version de GPG < 1.4 (ou tout échec de la commande précédente)

A l'invite de commande Git Bash, exécutez la commande suivante :

gpg --gen-key
  • Type de clé: sélectionnez l'option par défaut (1) RSA et RSA (par défaut)
  • taille de la clé: conserver la valeur par défaut (2048)
  • Validité de la clé: conservez la valeur par défaut 0. En effet, la clé de valeur 0 n'expire pas.
  • Confirmez votre choix : tapez y.
  • Entrez votre nom dans la zone Nom réel.
  • Entrez votre adresse électronique dans la zone Adresse électronique.
  • Appuyez sur O pour lancer la création de la clé.
  • Une fois la clé générée, sélectionnez l'option O.

Vérification de la création de la clé

Vérifiez que la clé GPG a été créée. Dans l'invite de commande, exécutez la commande suivante :

gpg --list-keys

Vérifiez que votre clé est répertoriée. Exemple de sortie sous Windows :

$ gpg --list-keys
/c/Users/FredSmith/.gnupg/pubring.gpg
-------------------------------------
pub   2048R/1BB354B5 2021-06-08
uid   Fred Smith <fred@company.com>
sub   2048R/F91C39A6 2021-06-08

Exportation de la clé

Cette étape est facultative. Exécutez la commande suivante pour vous assurer que la clé GPG peut être exportée :

gpg --export-secret-key <Email Address>

La clé brute exportée ne doit pas être copiée directement. Il est recommandé de conserver en lieu sûr la clé générée lors de cette étape dans votre instance Key Protect ou Secrets Manager. Pour plus de détails, voir les sections suivantes.

Stockage de la clé

La clé GPG doit être fournie au pipeline d'intégration continue de l'une des façons suivantes :

  • Stockée dans IBM® Key Protect for IBM Cloud®
  • Stockée dans IBM Cloud® Secrets Manager
  • Stockée directement dans la chaîne d'outils de l'intégration continue

Assurez-vous que la clé est copiée dans le format correct pour empêcher une erreur de signature de pipeline d'intégration continue en raison d'une erreur d'importation. Utilisez pbcopy ( Mac OS X ) ou clip (Windows Git bash) dans la commande suivante pour copier le contenu de la clé dans le presse-papiers.

Stockage de la clé dans Key Protect

Exportez et copiez la clé GPG dans le presse-papiers.

Le codage en double base64 e de la clé GPG est obligatoire avant de l'enregistrer dans votre instance d' Key Protect.

OS X

gpg --export-secret-key <Email Address> | base64 | base64 | pbcopy

Windows

gpg --export-secret-key <Email Address> | base64 -w0 | base64 -w0 | clip

Linux™

gpg --export-secret-key <Email Address> | base64 | base64
  1. Dans votre console IBM Cloud, sélectionnez l'instance Key Protect dans laquelle vous souhaitez stocker la clé GPG générée à partir des étapes précédentes.

  2. Cliquez sur l'icône Ajouter + pour ajouter une nouvelle clé à l'instance.

  3. Sélectionnez l'option « Importer votre propre clé ».

  4. Sélectionnez un type de clé comme clé standard.

  5. Indiquez le nom approprié dans le champ « Nom de la clé ». La clé GPG enregistrée peut être récupérée ultérieurement à l'aide de ce nom de clé.

  6. Copiez la clé telle qu'elle a été exportée précédemment dans le champ « Matériel de clé ».

    Assurez-vous que, lorsque vous copiez la clé et que vous la collez dans le champ « Key material », il n'y a pas de ligne supplémentaire à la fin de la clé.

  7. Sélectionnez l'option « Choisir un trousseau » comme option par défaut.

  8. Cliquez sur Ajouter une clé pour ajouter la clé à votre protection par clé.

    Ajouter la clé à la protection de la clé
    Ajouter la clé à la protection de la clé

Pour plus d'informations sur Key Protect, voir la documentation Key Protect.

Stockage de la clé dans Secrets Manager

Vous devez obligatoirement effectuer un simple encodage base64 de la clé GPG avant de la stocker dans votre instance Secrets Manager.

Exportez et copiez la clé GPG dans le presse-papiers.

OS X

gpg --export-secret-key <Email Address> | base64 | pbcopy

Windows

gpg --export-secret-key <Email Address> | base64 -w0 | clip

Linux™

gpg --export-secret-key <Email Address> | base64
  1. Dans votre console IBM Cloud, sélectionnez l'instance Secrets Manager dans laquelle vous souhaitez stocker la clé GPG générée à partir des étapes précédentes.

  2. Cliquez sur l'icône Ajouter + pour ajouter une nouvelle clé à l'instance.

  3. Sélectionnez l'option « Autre type de mot de passe ».

    Autre type de secret
    Autre type de secret

  4. Sélectionnez le type de clé standard pour l'option Sélectionner un type de clé.

  5. Indiquez un nom approprié dans le champ « Nom ». La clé GPG stockée peut être extraite ultérieurement à l'aide de ce nom.

  6. Sélectionnez l'option « Valeur secrète » et collez la clé que vous avez exportée précédemment dans le champ « Valeur secrète ».

    Assurez-vous que, lorsque vous copiez la clé et que vous la collez dans le champ « Secret », il n'y a pas de ligne supplémentaire à la fin de la clé.

  7. Ajoutez la clé à votre instance Key Protect en cliquant sur l'icône Ajouter.

    Ajouter la clé
    Ajouter la clé

Pour plus d'informations sur Secrets Manager, voir Initiation à Secrets Manager.

Exportation de la clé privée en vue de la stocker directement dans le pipeline d'intégration continue

Cette approche n'est pas recommandée et ne devrait être utilisée qu'à des fins expérimentales. Utilisez Key Protect ou Secrets Manager pour enregistrer vos clés. Pour plus d'informations, voir Configuration des magasins de secrets

Vous devez obligatoirement effectuer un simple encodage base64 de la clé GPG avant de la stocker en tant que propriété de pipeline sécurisée.

Stockez de manière sécurisée la clé GPG dans une instance Key Protect ou Secrets Manager.

Mac OS X / Linux™

gpg --export-secret-key <Email Address> | base64

Windows

gpg --export-secret-key <Email Address> | base64 -w0

Configuration des informations d'identification du registre pour la signature

Lors de la signature des images de conteneurs, le pipeline a besoin d'identifiants pour s'authentifier auprès du registre de conteneurs. Le pipeline « DevSecOps » prend en charge la résolution dynamique des identifiants lors de l'exécution, ce qui vous permet de configurer les identifiants de différentes manières grâce à des mécanismes de repli automatiques.

Hiérarchie de résolution des informations d'identification

Le pipeline résout de manière dynamique les identifiants (nom d'utilisateur et clé API) au moment de l'exécution en suivant la hiérarchie suivante.

Lorsqu'une redéfinition de la destination de signature est configurée à l'aide de gara-destination-registry et gara-destination-namespace, et que l'adresse gara-destination-apikey est également fournie, le pipeline accorde la priorité absolue à gara-destination-apikey pour l'authentification auprès du registre de destination. Sinon, le système se rabat sur la résolution des informations d'identification ci-dessous pour l'image de destination.

Ordre de résolution des clés API :

  1. Clé API spécifique à l'espace de noms: signing-token-apikey-{registry}-{namespace} (secret)
  2. Clé API spécifique au registre: signing-token-apikey-{registry} (secret)
  3. Docker Fichier de configuration JSON: signing-dockerconfigjson (secret)
  4. Solutions de secours spécifiques à l'ICR:
    • ciso-ibmcloud-api-key (secret)
    • ibmcloud-api-key (secret)

Ordre de résolution des noms d'utilisateur :

  1. Nom d'utilisateur spécifique à l'espace de noms: signing-token-username-{registry}-{namespace} (variable d'environnement)
  2. Nom d'utilisateur spécifique au registre: signing-token-username-{registry} (variable d'environnement)
  3. Par défaut: iamapikey (si aucun nom d'utilisateur n'est configuré)

Où :

  • {registry} est le nom d'hôte du registre (par exemple, us.icr.io, de.icr.io)
  • {namespace} il s'agit du chemin d'accès complet de l'espace de noms, dans lequel les barres obliques et les points ont été remplacés par des traits de soulignement (par exemple, my_namespace_path)

Configuration des identifiants spécifiques à un espace de noms

Pour un contrôle d'accès plus précis, vous pouvez configurer des identifiants spécifiques à un espace de noms du registre :

Clé API (secret): signing-token-apikey-{registry}-{namespace}

Nom d'utilisateur (variable d'environnement): signing-token-username-{registry}-{namespace}

Exemple: pour une image us.icr.io/my-namespace/my-app:latest

  • Registre : us.icr.io
  • Espace de noms : my-namespace
  • Clé secrète de l'API : signing-token-apikey-us.icr.io-my_namespace
  • Variable d'environnement « nom d'utilisateur » : signing-token-username-us.icr.io-my_namespace
  • Si le nom d'utilisateur n'est pas indiqué, la valeur par défaut est : iamapikey

Configuration des informations d'identification spécifiques au registre

Pour un accès plus large à l'ensemble des espaces de noms d'un registre :

Clé API (secret): signing-token-apikey-{registry}

Nom d'utilisateur (variable d'environnement): signing-token-username-{registry}

Exemple: pour toute image dans us.icr.io

  • Clé secrète de l'API : signing-token-apikey-us.icr.io
  • Variable d'environnement « nom d'utilisateur » : signing-token-username-us.icr.io
  • Si le nom d'utilisateur n'est pas indiqué, la valeur par défaut est : iamapikey

Configuration du fichier JSON de configuration d' Docker

Vous pouvez fournir un fichier de configuration JSON de type base64-encoded Docker contenant les identifiants d'accès pour plusieurs registres :

Nom secret: signing-dockerconfigjson

Format: Base64-encoded JSON, conforme au format config.json de Docker:

{
  "auths": {
    "us.icr.io": {
      "username": "iamapikey",
      "password": "your-api-key"
    },
    "us.icr.io/my-namespace": {
      "username": "iamapikey",
      "password": "namespace-specific-key"
    }
  }
}

Le pipeline correspond d'abord au chemin le plus spécifique, ce qui permet des remplacements au niveau de l'espace de noms dans la configuration d' Docker.

Exemple de configuration

Pour une image us.icr.io/production/my-app:v1.0.0:

Option 1 : spécifique à l'espace de noms (recommandée pour la production)

  • Clé secrète de l'API : signing-token-apikey-us.icr.io-production = your-namespace-api-key
  • Variable d'environnement « username » (facultative): signing-token-username-us.icr.io-production = iamapikey
  • Si le nom d'utilisateur n'est pas indiqué, la valeur par défaut est iamapikey

Option 2 : À l'échelle du registre

  • Clé secrète de l'API : signing-token-apikey-us.icr.io = your-registry-api-key
  • Variable d'environnement « username » (facultative): signing-token-username-us.icr.io = iamapikey
  • Si le nom d'utilisateur n'est pas indiqué, la valeur par défaut est iamapikey

Option 3 : Fichier de configuration JSON d' Docker

  • Secret : signing-dockerconfigjson = base64-encoded-docker-config
  • Le nom d'utilisateur est extrait du fichier de configuration JSON situé à l'adresse Docker

Option 4 : valeur par défaut de « IBM Cloud » (automatique pour ICR)

  • Clé secrète de l'API : ibmcloud-api-key = your-ibmcloud-api-key
  • Le nom d'utilisateur par défaut est iamapikey