J’ai de nombreuses images Docker à maintenir (principalement des projets personnels) mais je n’ai aucun moyen de vérifier l’authenticité de mes images. Pour ajouter une couche de sécurité supplémentaire, j’ai décidé de réaliser une preuve de concept de l’utilisation de Cosign.

Il existe de nombreuses alternatives, mais certaines nécessitent la maintenance d’un serveur de gestion de clés ou sont tout simplement moins populaires que Cosign.

Dépendances

Générer une signature cosign

  1. Construisez votre image Docker.
docker build -t harbor.coffee.internal/app:v1.0.0 .
  1. Générer des certificats pour Cosign.
cosign generate-key-pair

Enter password for private key: 
Enter password for private key again: 
Private key written to cosign.key
Public key written to cosign.pub

Vous obtiendrez 2 fichiers (cosign.key et cosign.pub), l’un pour créer les signatures, l’autre pour que vos utilisateurs puissent vérifier l’authenticité des signatures.

Vous pouvez utiliser le registre public rekor.sigstore.dev pour éviter d’avoir à générer la signature et la clé privée. Mais dans mon cas : je préfère gérer cette partie moi-même.

  1. Obtenez le digest de l’image :
docker inspect harbor.coffee.internal/app:v1.0.0 | jq -r '.[0].RepoDigests[0]'

harbor.coffee.internal/app:v1.0.0@sha256:334e64b05ac2ba711cf63b8814e10148db26d525f0a847020630b484bb6ef30c
  1. Générer et pousser la signature
sudo cosign sign harbor.coffee.internal/app:v1.0.0@sha256:334e64b05ac2ba711cf63b8814e10148db26d525f0a847020630b484bb6ef30c

Cosign générera un artefact OCI avec le même nom d’image, mais en utilisant le shasum du digest comme tag

Dans cet exemple, l’artefact généré et push est le suivant : harbor.coffee.internal/app:sha256:334e64b05ac2ba711cf63b8814e10148db26d525f0a847020630b484bb6ef30c.sig

Vérifier une image

En tant qu’utilisateur, j’ai besoin de récupérer le fichier cosign.pub pour vérifier que la signature a été générée avec le bon fichier cosign.key (auquel je n’ai pas accès).

sudo cosign verify --private-infrastructure --key cosign.pub harbor.coffee.internal/app:v1.0.0

Verification for harbor.coffee.internal/app:v1.0.0 --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"harbor.coffee.internal/app"},"image":{"docker-manifest-digest":"sha256:334e64b05ac2ba711cf63b8814e10148db26d525f0a847020630b484bb6ef30c"},"type":"cosign container image signature"},"optional":null}]

Étant donné que je n’utilise pas le registre sigstore (rektor), je dois spécifier l’argument --private-infrastructure.

Utilisation de Github Action

Pour générer des signatures directement depuis Github Action, nous devons générer les fichiers cosign.key et cosign.pub nous-mêmes (via cosign generate-key-pair).

Nous devons également créer les secrets suivants :

  • COSIGN_PRIVATE correspondant au fichier cosign.key.
  • COSIGN_PASSWORD contenant le mot de passe pour la clé privée.
      - name: Building Image
        run: |
          docker build -t ghcr.io/une-tasse-de-cafe/app:latest -f ./Dockerfile.app .          

      - name: Install Cosign
        uses: sigstore/[email protected]
        with:
          cosign-release: 'v2.4.0'

      - name: Generate signature artifact
        run: |
            cosign sign --key env://COSIGN_PRIVATE ghcr.io/une-tasse-de-cafe/app:latest            
        shell: bash
        env:
          COSIGN_PRIVATE: ${{secrets.COSIGN_PRIVATE}}
          COSIGN_PASSWORD: ${{secrets.COSIGN_PASSWORD}} 

Informations supplémentaires