3.16. Utilisation de Tekton Chains pour OpenShift Pipelines Sécurité de la chaîne d'approvisionnement
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.
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 Copier lienLien copié sur presse-papiers!
-
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.
3.16.2. Installation des chaînes Tekton à l'aide de l'opérateur Red Hat OpenShift Pipelines Copier lienLien copié sur presse-papiers!
Les administrateurs de clusters peuvent utiliser la ressource personnalisée (CR) TektonChain
pour installer et gérer les chaînes Tekton.
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
Créez le
TektonChain
CR pour votre cluster OpenShift Container Platform.Copy to Clipboard Copied! Toggle word wrap Toggle overflow Appliquer la CR
TektonChain
.oc apply -f TektonChain.yaml
$ oc apply -f TektonChain.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Remplacer par le nom de fichier du CR
TektonChain
.
Vérifier l'état de l'installation.
oc get tektonchains.operator.tekton.dev
$ oc get tektonchains.operator.tekton.dev
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.16.3. Configuration des chaînes Tekton Copier lienLien copié sur presse-papiers!
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" }}'
$ 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
- Utiliser une combinaison de paires clé-valeur prises en charge dans la charge utile JSON.
3.16.3.1. Touches prises en charge pour la configuration des chaînes Tekton Copier lienLien copié sur presse-papiers!
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.
3.16.3.1.1. Touches prises en charge pour l'exécution des tâches Copier lienLien copié sur presse-papiers!
Touches prises en charge | Description | Valeurs prises en charge | Valeurs par défaut |
---|---|---|---|
| Format dans lequel sont stockées les charges utiles de l'exécution des tâches. |
|
|
|
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 |
|
|
| Le backend de signature pour signer les charges utiles de l'exécution des tâches. |
|
|
3.16.3.1.2. Clés prises en charge pour l'OCI Copier lienLien copié sur presse-papiers!
Touches prises en charge | Description | Valeurs prises en charge | Valeurs par défaut |
---|---|---|---|
| Format de stockage des données utiles OCI. |
|
|
|
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 |
|
|
| Le backend de signature pour signer les données utiles de l'OCI. |
|
|
3.16.3.1.3. Clés de stockage prises en charge Copier lienLien copié sur presse-papiers!
Touches prises en charge | Description | Valeurs prises en charge | Valeurs par défaut |
---|---|---|---|
| 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 Copier lienLien copié sur presse-papiers!
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
.
N'utilisez qu'un seul des schémas de signature pris en charge.
3.16.4.1. Signature à l'aide de x509 Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
Pour utiliser le schéma de signature cosign
avec les chaînes Tekton :
- Installer la cosignature.
Générer les paires de clés
cosign.key
etcosign.pub
.cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Cosign vous demande un mot de passe et crée un secret Kubernetes.
-
Stockez la clé privée chiffrée
cosign.key
et le mot de passe de déchiffrementcosign.password
dans le secret Kubernetessigning-secrets
. Veillez à ce que la clé privée soit stockée sous la forme d'un fichier PEM crypté de typeENCRYPTED COSIGN PRIVATE KEY
.
3.16.4.3. Signature de dépannage Copier lienLien copié sur presse-papiers!
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
Error from server (AlreadyExists): secrets "signing-secrets" already exists
Pour résoudre l'erreur :
Supprimer les secrets :
oc delete secret signing-secrets -n openshift-pipelines
$ oc delete secret signing-secrets -n openshift-pipelines
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 Copier lienLien copié sur presse-papiers!
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
Définissez l'espace de noms et le nom du compte de service Kubernetes.
export NAMESPACE=<namespace> export SERVICE_ACCOUNT_NAME=<service_account>
$ export NAMESPACE=<namespace>
1 $ export SERVICE_ACCOUNT_NAME=<service_account>
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créez un secret Kubernetes.
oc create secret registry-credentials \ --from-file=.dockerconfigjson \ --type=kubernetes.io/dockerconfigjson \ -n $NAMESPACE
$ oc create secret registry-credentials \ --from-file=.dockerconfigjson \
1 --type=kubernetes.io/dockerconfigjson \ -n $NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Remplacer par le chemin d'accès à votre fichier de configuration Docker. Le chemin par défaut est
~/.docker/config.json
.
Donner au compte de service l'accès au secret.
oc patch serviceaccount $SERVICE_ACCOUNT_NAME \ -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
$ oc patch serviceaccount $SERVICE_ACCOUNT_NAME \ -p "{\"imagePullSecrets\": [{\"name\": \"registry-credentials\"}]}" -n $NAMESPACE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 :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>
oc create serviceaccount <service_account_name> $ oc create serviceaccount <service_account_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Remplacer par le nom du compte de service nouvellement créé.
3.16.5.1. Création et vérification des signatures d'exécution des tâches sans authentification supplémentaire Copier lienLien copié sur presse-papiers!
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
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
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 nomsopenshift-pipelines
.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"}}'
$ oc patch configmap chains-config -n openshift-pipelines -p='{"data":{"artifacts.oci.storage": "", "artifacts.taskrun.format":"tekton", "artifacts.taskrun.storage": "tekton"}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc delete po -n openshift-pipelines -l app=tekton-chains-controller
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer une exécution de tâche.
oc create -f https://raw.githubusercontent.com/tektoncd/chains/main/examples/taskruns/task-output-image.yaml
$ 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 Copied! Toggle word wrap Toggle overflow - 1
- Remplacer par l'URI ou le chemin d'accès au fichier qui pointe vers l'exécution de la tâche.
Vérifiez l'état d'avancement des étapes et attendez la fin du processus.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ 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 Copied! Toggle word wrap Toggle overflow Vérifier la signature.
cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload
$ cosign verify-blob --key k8s://openshift-pipelines/signing-secrets --signature ./signature ./payload Verified OK
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.16.6. Utilisation des chaînes Tekton pour signer et vérifier l'image et la provenance Copier lienLien copié sur presse-papiers!
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 :
- Opérateur Red Hat OpenShift Pipelines
- Chaînes Tekton
- Cosignature
- Rekor
- jq
Procédure
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
$ cosign generate-key-pair k8s://openshift-pipelines/signing-secrets
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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 nomsopenshift-pipelines
et écrit la clé publique dans le fichier localcosign.pub
.Configurer l'authentification pour le registre d'images.
- 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".
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> \ --from-file <path_to_config.json>
$ oc create secret generic <docker_config_secret_name> \
1 --from-file <path_to_config.json>
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Configurez les chaînes Tekton en définissant les paramètres
artifacts.taskrun.format
,artifacts.taskrun.storage
ettransparency.enabled
dans l'objetchains-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"}}'
$ 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 Copied! Toggle word wrap Toggle overflow Lancez la tâche Kaniko.
Appliquez la tâche Kaniko au cluster.
oc apply -f examples/kaniko/kaniko.yaml
$ oc apply -f examples/kaniko/kaniko.yaml
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Remplacer par l'URI ou le chemin d'accès à votre tâche Kaniko.
Définir les variables d'environnement appropriées.
export REGISTRY=<url_of_registry> export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json>
$ export REGISTRY=<url_of_registry>
1 $ export DOCKERCONFIG_SECRET_NAME=<name_of_the_secret_in_docker_config_json>
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ 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 Copied! Toggle word wrap Toggle overflow 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
.
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.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Remplacer par le nom de l'exécution de la tâche.
Vérifier l'image et l'attestation.
cosign verify --key cosign.pub $REGISTRY/kaniko-chains cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
$ cosign verify --key cosign.pub $REGISTRY/kaniko-chains $ cosign verify-attestation --key cosign.pub $REGISTRY/kaniko-chains
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Trouver la provenance de l'image dans Rekor.
- 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é.
Recherchez dans Rekor toutes les entrées qui correspondent à l'extrait
sha256
de l'image.rekor-cli search --sha <image_digest>
$ rekor-cli search --sha <image_digest>
1 <uuid_1>
2 <uuid_2>
3 ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Le résultat de la recherche affiche les UUID des entrées correspondantes. L'un de ces UUID contient l'attestation.
Vérifier l'attestation.
rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
$ rekor-cli get --uuid <uuid> --format json | jq -r .Attestation | base64 --decode | jq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow