3.16. Utilisation de Tekton Chains pour OpenShift Pipelines Sécurité de la chaîne d'approvisionnement


Important

Tekton Chains est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

Tekton Chains est un contrôleur de définition de ressources personnalisées (CRD) de Kubernetes. Vous pouvez l'utiliser pour gérer la sécurité de la chaîne logistique des tâches et des pipelines créés à l'aide de Red Hat OpenShift Pipelines.

Par défaut, Tekton Chains observe toutes les exécutions de tâches dans votre cluster OpenShift Container Platform. Lorsque les exécutions de tâches sont terminées, Tekton Chains prend un instantané des exécutions de tâches. Il convertit ensuite l'instantané en un ou plusieurs formats de charge utile standard, et enfin signe et stocke tous les artefacts.

Pour capturer des informations sur l'exécution des tâches, Tekton Chains utilise les objets Result et PipelineResource. Lorsque ces objets ne sont pas disponibles, Tekton Chains utilise les URL et les extraits qualifiés des images OCI.

Note

L'objet PipelineResource est obsolète et sera supprimé dans une prochaine version ; pour une utilisation manuelle, l'objet Results est recommandé.

3.16.1. Caractéristiques principales

  • Vous pouvez signer les exécutions de tâches, les résultats des exécutions de tâches et les images de registre OCI avec des types de clés cryptographiques et des services tels que cosign.
  • Vous pouvez utiliser des formats d'attestation tels que in-toto.
  • Vous pouvez stocker en toute sécurité des signatures et des artefacts signés en utilisant le référentiel OCI comme backend de stockage.

Les administrateurs de clusters peuvent utiliser la ressource personnalisée (CR) TektonChain pour installer et gérer les chaînes Tekton.

Note

Tekton Chains est un composant optionnel de Red Hat OpenShift Pipelines. Actuellement, vous ne pouvez pas l'installer en utilisant le CR TektonConfig.

Conditions préalables

  • Assurez-vous que Red Hat OpenShift Pipelines Operator est installé dans l'espace de noms openshift-pipelines sur votre cluster.

Procédure

  1. Créez le TektonChain CR pour votre cluster OpenShift Container Platform.

    apiVersion: operator.tekton.dev/v1alpha1
    kind: TektonChain
    metadata:
      name: chain
    spec:
      targetNamespace: openshift-pipelines
    Copy to Clipboard Toggle word wrap
  2. Appliquer la CR TektonChain.

    $ oc apply -f TektonChain.yaml 
    1
    Copy to Clipboard Toggle word wrap
    1
    Remplacer par le nom de fichier du CR TektonChain.
  3. Vérifier l'état de l'installation.

    $ oc get tektonchains.operator.tekton.dev
    Copy to Clipboard Toggle word wrap

3.16.3. Configuration des chaînes Tekton

Tekton Chains utilise un objet ConfigMap nommé chains-config dans l'espace de noms openshift-pipelines pour la configuration.

Pour configurer les chaînes Tekton, utilisez l'exemple suivant :

Exemple : Configuration des chaînes Tekton

$ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage" : \N- "\N", \N- "artifacts.taskrun.format\N":\N- "tekton\N", \N- "artifacts.taskrun.storage\N" : \N- "tekton\N" }}'
1
Copy to Clipboard Toggle word wrap

1
Utiliser une combinaison de paires clé-valeur prises en charge dans la charge utile JSON.

Les administrateurs de grappes peuvent utiliser diverses clés et valeurs prises en charge pour configurer les spécifications relatives aux exécutions de tâches, aux images OCI et au stockage.

Expand
Tableau 3.13. Configuration des chaînes : Clés prises en charge pour l'exécution des tâches
Touches prises en chargeDescriptionValeurs prises en chargeValeurs par défaut

artifacts.taskrun.format

Format dans lequel sont stockées les charges utiles de l'exécution des tâches.

tekton, in-toto

tekton

artifacts.taskrun.storage

Le backend de stockage pour les signatures d'exécution de tâches. Vous pouvez spécifier plusieurs backends sous la forme d'une liste séparée par des virgules, par exemple “tekton,oci”. Pour désactiver cet artefact, indiquez une chaîne vide “”.

tekton, oci

tekton

artifacts.taskrun.signer

Le backend de signature pour signer les charges utiles de l'exécution des tâches.

x509

x509

3.16.3.1.2. Clés prises en charge pour l'OCI
Expand
Tableau 3.14. Configuration des chaînes : Clés prises en charge pour l'OCI
Touches prises en chargeDescriptionValeurs prises en chargeValeurs par défaut

artifacts.oci.format

Format de stockage des données utiles OCI.

simplesigning

simplesigning

artifacts.oci.storage

Le backend de stockage pour les signatures OCI. Vous pouvez spécifier plusieurs backends sous la forme d'une liste séparée par des virgules, comme “oci,tekton”. Pour désactiver l'artefact OCI, indiquez une chaîne vide “”.

tekton, oci

oci

artifacts.oci.signer

Le backend de signature pour signer les données utiles de l'OCI.

x509, cosign

x509

3.16.3.1.3. Clés de stockage prises en charge
Expand
Tableau 3.15. Configuration des chaînes : Clés prises en charge pour le stockage
Touches prises en chargeDescriptionValeurs prises en chargeValeurs par défaut

artifacts.oci.repository

Le référentiel OCI pour stocker les signatures OCI.

Actuellement, les Chains ne supportent que le registre interne OpenShift OCI ; d'autres options populaires telles que Quay ne sont pas supportées.

 

3.16.4. Signer des secrets dans les chaînes Tekton

Les administrateurs de clusters peuvent générer une paire de clés et utiliser Tekton Chains pour signer des artefacts à l'aide d'un secret Kubernetes. Pour que les chaînes Tekton fonctionnent, une clé privée et un mot de passe pour les clés cryptées doivent exister en tant que partie du secret Kubernetes signing-secrets, dans l'espace de noms openshift-pipelines.

Actuellement, Tekton Chains prend en charge les systèmes de signature x509 et cosign.

Note

N'utilisez qu'un seul des schémas de signature pris en charge.

3.16.4.1. Signature à l'aide de x509

Pour utiliser le schéma de signature x509 avec les chaînes Tekton, stockez la clé privée x509.pem du type ed25519 ou ecdsa dans le secret Kubernetes signing-secrets. Veillez à ce que la clé soit stockée sous la forme d'un fichier PKCS8 PEM non chiffré (BEGIN PRIVATE KEY).

3.16.4.2. Signer en utilisant la cosignature

Pour utiliser le schéma de signature cosign avec les chaînes Tekton :

  1. Installer la cosignature.
  2. Générer les paires de clés cosign.key et cosign.pub.

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
    Copy to Clipboard Toggle word wrap

    Cosign vous demande un mot de passe et crée un secret Kubernetes.

  3. Stockez la clé privée chiffrée cosign.key et le mot de passe de déchiffrement cosign.password dans le secret Kubernetes signing-secrets. Veillez à ce que la clé privée soit stockée sous la forme d'un fichier PEM crypté de type ENCRYPTED COSIGN PRIVATE KEY.

3.16.4.3. Signature de dépannage

Si les secrets de signature sont déjà renseignés, vous risquez d'obtenir l'erreur suivante :

Error from server (AlreadyExists): secrets "signing-secrets" already exists
Copy to Clipboard Toggle word wrap

Pour résoudre l'erreur :

  1. Supprimer les secrets :

    $ oc delete secret signing-secrets -n openshift-pipelines
    Copy to Clipboard Toggle word wrap
  2. Recréer les paires de clés et les stocker dans les secrets en utilisant le schéma de signature de votre choix.

3.16.5. S'authentifier auprès d'un registre OCI

Avant d'envoyer des signatures à un registre OCI, les administrateurs de clusters doivent configurer Tekton Chains pour qu'il s'authentifie auprès du registre. Le contrôleur Tekton Chains utilise le même compte de service que celui sous lequel la tâche s'exécute. Pour configurer un compte de service avec les informations d'identification nécessaires pour envoyer des signatures à un registre OCI, procédez comme suit :

Procédure

  1. Définissez l'espace de noms et le nom du compte de service Kubernetes.

    $ export NAMESPACE=<namespace> 
    1
    
    $ export SERVICE_ACCOUNT_NAME=<service_account> 
    2
    Copy to Clipboard Toggle word wrap
    1
    L'espace de noms associé au compte de service.
    2
    Le nom du compte de service.
  2. Créez un secret Kubernetes.

    $ oc create secret registry-credentials \
      --from-file=.dockerconfigjson \ 
    1
    
      --type=kubernetes.io/dockerconfigjson \
      -n $NAMESPACE
    Copy to Clipboard Toggle word wrap
    1
    Remplacer par le chemin d'accès à votre fichier de configuration Docker. Le chemin par défaut est ~/.docker/config.json.
  3. Donner au compte de service l'accès au secret.

    $ oc patch serviceaccount $SERVICE_ACCOUNT_NAME \
      -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
    Copy to Clipboard Toggle word wrap

    Si vous corrigez le compte de service pipeline par défaut que Red Hat OpenShift Pipelines attribue à toutes les exécutions de tâches, l'opérateur Red Hat OpenShift Pipelines remplacera le compte de service. En tant que meilleure pratique, vous pouvez effectuer les étapes suivantes :

    1. Créez un compte de service distinct à affecter aux tâches exécutées par l'utilisateur.

      oc create serviceaccount <service_account_name> $ oc create serviceaccount <service_account_name>
      Copy to Clipboard Toggle word wrap
    2. Associez le compte de service aux exécutions de tâches en définissant la valeur du champ serviceaccountname dans le modèle d'exécution de tâches.

      apiVersion: tekton.dev/v1beta1
      kind: TaskRun
      metadata:
      name: build-push-task-run-2
      spec:
      serviceAccountName: build-bot 
      1
      
      taskRef:
        name: build-push
      ...
      Copy to Clipboard Toggle word wrap
      1
      Remplacer par le nom du compte de service nouvellement créé.

Pour vérifier les signatures des exécutions de tâches à l'aide des chaînes Tekton sans authentification supplémentaire, effectuez les tâches suivantes :

  • Créez une paire de clés x509 chiffrée et enregistrez-la en tant que secret Kubernetes.
  • Configurer le stockage de Tekton Chains.
  • Créer une tâche, la signer et stocker la signature et la charge utile sous forme d'annotations sur la tâche elle-même.
  • Récupérer la signature et la charge utile de l'exécution de la tâche signée.
  • Vérifier la signature de l'exécution de la tâche.

Conditions préalables

Assurez-vous que les éléments suivants sont installés sur le cluster :

  • Opérateur Red Hat OpenShift Pipelines
  • Chaînes Tekton
  • Cosignature

Procédure

  1. Créez une paire de clés x509 chiffrée et enregistrez-la en tant que secret Kubernetes :

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
    Copy to Clipboard Toggle word wrap

    Fournissez un mot de passe lorsque vous y êtes invité. Cosign stocke la clé privée résultante en tant que partie du secret Kubernetes signing-secrets dans l'espace de noms openshift-pipelines.

  2. Dans la configuration des chaînes Tekton, désactivez le stockage OCI et définissez le stockage et le format de l'exécution de la tâche sur tekton.

    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'
    Copy to Clipboard Toggle word wrap
  3. Redémarrez le contrôleur Tekton Chains pour vous assurer que la configuration modifiée est appliquée.

    $ oc delete po -n openshift-pipelines -l app=tekton-chains-controller
    Copy to Clipboard Toggle word wrap
  4. Créer une exécution de tâche.

    $ oc create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml 
    1
    
    taskrun.tekton.dev/build-push-run-output-image-qbjvh created
    Copy to Clipboard Toggle word wrap
    1
    Remplacer par l'URI ou le chemin d'accès au fichier qui pointe vers l'exécution de la tâche.
  5. Vérifiez l'état d'avancement des étapes et attendez la fin du processus.

    $ tkn tr describe --last
    [...truncated output...]
    NAME                            STATUS
    ∙ create-dir-builtimage-9467f   Completed
    ∙ git-source-sourcerepo-p2sk8   Completed
    ∙ build-and-push                Completed
    ∙ echo                          Completed
    ∙ image-digest-exporter-xlkn7   Completed
    Copy to Clipboard Toggle word wrap
  6. Récupérer la signature et la charge utile de l'objet stocké sous forme d'annotations codées base64:

    $ export TASKRUN_UID=$(tkn tr describe --last -o  jsonpath='{.metadata.uid}')
    $ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" > signature
    $ tkn tr describe --last -o jsonpath="{.metadata.annotations.chains\.tekton\.dev/payload-taskrun-$TASKRUN_UID}" | base64 -d > payload
    Copy to Clipboard Toggle word wrap
  7. Vérifier la signature.

    $ cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload
    Verified OK
    Copy to Clipboard Toggle word wrap

Les administrateurs de clusters peuvent utiliser les chaînes Tekton pour signer et vérifier les images et les provenances, en effectuant les tâches suivantes :

  • Créez une paire de clés x509 chiffrée et enregistrez-la en tant que secret Kubernetes.
  • Configurer l'authentification pour le registre OCI afin de stocker les images, les signatures d'images et les attestations d'images signées.
  • Configurer les chaînes Tekton pour qu'elles génèrent et signent la provenance.
  • Créer une image avec Kaniko lors d'une exécution de tâches.
  • Vérifier l'image et la provenance signées.

Conditions préalables

Assurez-vous que les éléments suivants sont installés sur le cluster :

Procédure

  1. Créez une paire de clés x509 chiffrée et enregistrez-la en tant que secret Kubernetes :

    $ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
    Copy to Clipboard Toggle word wrap

    Fournissez un mot de passe lorsque vous y êtes invité. Cosign stocke la clé privée résultante dans le secret Kubernetes signing-secrets dans l'espace de noms openshift-pipelines et écrit la clé publique dans le fichier local cosign.pub.

  2. Configurer l'authentification pour le registre d'images.

    1. Pour configurer le contrôleur Tekton Chains afin qu'il transmette des signatures à un registre OCI, utilisez les informations d'identification associées au compte de service de l'exécution de la tâche. Pour plus d'informations, voir la section "Authentification auprès d'un registre OCI".
    2. Pour configurer l'authentification pour une tâche Kaniko qui construit et pousse l'image vers le registre, créez un secret Kubernetes du fichier docker config.json contenant les informations d'identification requises.

      $ oc create secret generic <docker_config_secret_name> \ 
      1
      
        --from-file <path_to_config.json> 
      2
      Copy to Clipboard Toggle word wrap
      1
      Remplacer par le nom du secret de configuration de Docker.
      2
      Remplacer par le chemin d'accès au fichier docker config.json.
  3. Configurez les chaînes Tekton en définissant les paramètres artifacts.taskrun.format, artifacts.taskrun.storage et transparency.enabled dans l'objet chains-config:

    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.format": "in-toto"}}'
    
    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.taskrun.storage": "oci"}}'
    
    $ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"transparency.enabled": "true"}}'
    Copy to Clipboard Toggle word wrap
  4. Lancez la tâche Kaniko.

    1. Appliquez la tâche Kaniko au cluster.

      $ oc apply -f examples/kaniko/kaniko.yaml 
      1
      Copy to Clipboard Toggle word wrap
      1
      Remplacer par l'URI ou le chemin d'accès à votre tâche Kaniko.
    2. Définir les variables d'environnement appropriées.

      $ export REGISTRY=<url_of_registry> 
      1
      
      
      $ export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json> 
      2
      Copy to Clipboard Toggle word wrap
      1
      Remplacer par l'URL du registre dans lequel vous souhaitez placer l'image.
      2
      Remplacer par le nom du secret dans le fichier docker config.json.
    3. Lancez la tâche Kaniko.

      $ tkn task start --param IMAGE=$REGISTRY/kaniko-chains --use-param-defaults --workspace name=source,emptyDir="" --workspace name=dockerconfig,secret=$DOCKERCONFIG_SECRET_NAME kaniko-chains
      Copy to Clipboard Toggle word wrap

      Observez les journaux de cette tâche jusqu'à ce que toutes les étapes soient terminées. Une fois l'authentification réussie, l'image finale sera poussée sur $REGISTRY/kaniko-chains.

  5. Attendez une minute pour permettre à Tekton Chains de générer la provenance et de la signer, puis vérifiez la disponibilité de l'annotation chains.tekton.dev/signed=true lors de l'exécution de la tâche.

    $ oc get tr <task_run_name> \ 
    1
    
    -o json | jq -r .metadata.annotations
    
    {
      "chains.tekton.dev/signed": "true",
      ...
    }
    Copy to Clipboard Toggle word wrap
    1
    Remplacer par le nom de l'exécution de la tâche.
  6. Vérifier l'image et l'attestation.

    $ cosign verify --key cosign.pub $REGISTRY/kaniko-chains
    
    $ cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
    Copy to Clipboard Toggle word wrap
  7. Trouver la provenance de l'image dans Rekor.

    1. Obtenir le résumé de l'image $REGISTRY/kaniko-chains. Vous pouvez le rechercher lors de l'exécution de la tâche, ou extraire l'image pour en extraire le condensé.
    2. Recherchez dans Rekor toutes les entrées qui correspondent à l'extrait sha256 de l'image.

      $ rekor-cli search --sha <image_digest> 
      1
      
      
      <uuid_1> 
      2
      
      <uuid_2> 
      3
      
      ...
      Copy to Clipboard Toggle word wrap
      1
      Remplacer par le code sha256 de l'image.
      2
      Le premier identifiant universel unique (UUID) correspondant.
      3
      Le deuxième UUID correspondant.

      Le résultat de la recherche affiche les UUID des entrées correspondantes. L'un de ces UUID contient l'attestation.

    3. Vérifier l'attestation.

      $ rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
      Copy to Clipboard Toggle word wrap
Retour au début
Red Hat logoGithubredditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance. Découvrez nos récentes mises à jour.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez le Blog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

Theme

© 2025 Red Hat