Sigstore et Cosign : comment implémenter une chaîne de signature passwordless de ses artefacts sous Github Actions
Sigstore et Cosign : comment implémenter une chaîne de signature passwordless de ses artefacts sous Github Actions

Sigstore et Cosign : comment implémenter une chaîne de signature passwordless de ses artefacts sous Github Actions

Les chaînes de signatures sont devenues une pratique courante dans le développement logiciel pour garantir l'authenticité et l'intégrité des artefacts. Elles permettent de s'assurer que les fichiers sont signés par les bonnes personnes et qu'ils n'ont pas été altérés lors de leur transit ou de leur stockage. Sigstore et Cosign sont deux outils open-source populaires qui offrent une solution de signature numérique pour les développeurs et les organisations. Dans cet article, nous allons explorer comment implémenter une chaîne de signature passwordless de vos artefacts sous Github Actions.

C’est quoi Sigstore ?

Sigstore est une initiative open-source lancée par la Linux Foundation pour faciliter la vérification de l'authenticité des logiciels en ligne. Il fournit une infrastructure de confiance pour signer, vérifier et distribuer des artefacts logiciels. Sigstore est conçu pour être simple et facile à utiliser, et offre une approche décentralisée et transparente pour la gestion des clés de signature.

Et Cosign ?

Cosign est un outil open-source développé par Sigstore qui permet de signer et de vérifier les conteneurs Docker et toute sorte d’artefact. Il utilise le standard Open Container Initiative (OCI) pour signer les images Docker, et peut être facilement intégré dans les flux de développement existants.

Pourquoi une chaîne de signature passwordless ?

Traditionnellement, pour signer numériquement un artefact, il faut utiliser une paire de clés cryptographiques : une clé privée pour signer et une clé publique pour vérifier la signature. Cependant, la gestion de ces clés peut être complexe car il faut gérer leur stockage, leur rotation et leur potentielle révocation en cas de compromission. Une chaîne de signature passwordless élimine le besoin de gérer des clés privées pour signer les artefacts en se reposant sur des autorités de certification, ce qui rend le processus de signature plus facile pour une organisation.

Exemple

Voici un exemple de workflow réutilisable permettant le build, la signature et le push d'une image Docker :

# Il faut avoir rempli le nom de l'image Docker dans la variable NAME auparavant et le nom de la registry dans la variable REGISTRY (par exemple ghcr.io).

name: docker-push
on:
  workflow_call:
    inputs:
jobs:
  release-docker:
    name: Push Docker image
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Log in to the Container registry
        uses: docker/login-action@v2
        with:
          registry: ${{ vars.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        id: docker_push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ${{ vars.REGISTRY }}/${{ github.actor }}/${{ vars.NAME }}:${{ inputs.release }}
          labels: ${{ steps.meta.outputs.labels }}
          platforms: ${{ inputs.platforms }}

      - name: Setup Sigstore
        uses: sigstore/cosign-installer@v3

      - name: Sign container image with annotations from our environment
        run: |
          cosign sign -y \\
            -a "repo=${{ github.repository }}" \\
            -a "workflow=${{ github.workflow }}" \\
            -a "ref=${{ github.sha }}" \\
            ${{ vars.REGISTRY }}/${{ github.actor }}/${{ vars.NAME }}@${{ steps.docker_push.outputs.digest }}

Pour vérifier la signature de l'image :

$ cosign verify --certificate-identity '<https://github.com/><ACTOR>/<REPO>/.github/workflows/<PIPELINE>.yaml@refs/heads/<BRANCH_ORIGIN_NAME>' --certificate-oidc-issuer '<https://token.actions.githubusercontent.com>' '<REGISTRY>/<ACTOR>/<IMAGE_NAME>:<TAG>'

Cette vérification peut être utilisée dans Kubernetes de manière automatique avec des systèmes de Dynamic Admission Controller comme Kyverno.

Il est également possible de signer d'autres artefacts tels que des paquets python, des binaires go ou même des paquets Debian ou Redhat.

Références

Cosign

Merci pour votre lecture. Cet article vous a plu, partagez sur vos réseaux 😉

Thibault Ayanides - Juin, 2023

image