• Русский
  • Начало работы

    Это руководство помогает новым пользователям быстро настроить Tekton Chains для защиты конвейеров CI/CD путем генерации и проверки криптографических подписей для Tekton TaskRun.

    Введение

    Сценарии использования

    Tekton Chains помогает защитить цепочку поставки программного обеспечения, автоматически генерируя криптографические подписи для ваших артефактов сборки. В этом руководстве показано, как настроить Tekton Chains, сгенерировать ключ подписи, запустить простую задачу и проверить ее подпись.

    Оценочное время чтения

    10–15 минут

    Важные замечания

    • Tekton Chains по умолчанию устанавливается в namespace tekton-pipelines при использовании Alauda Devops Pipelines Operator
    • Ключи подписи должны храниться в защищенном виде; в production-средах рекомендуется использовать систему управления ключами (KMS)
    • В этом руководстве используется самая простая конфигурация для демонстрационных целей

    Предварительные требования

    • Кластер Kubernetes с установленными Tekton Pipelines и Tekton Chains
    • Установленный и настроенный CLI kubectl для доступа к вашему кластеру
    • Установленный инструмент CLI cosign
    • Установленный инструмент CLI jq

    Обзор процесса

    ШагОперацияОписание
    1Сгенерировать ключи подписиСоздать пару ключей для подписывания артефактов
    2Настроить Tekton ChainsНастроить Chains на использование Tekton storage backend
    3Запустить пример задачиСоздать и запустить простой TaskRun
    4Проверить подписьИзвлечь и проверить подпись TaskRun

    Пошаговые инструкции

    Шаг 1: Сгенерировать ключи подписи

    Подробнее см. в Конфигурация ключа подписи

    Tekton Chains использует криптографические ключи для подписывания артефактов. По умолчанию он ищет secret с именем signing-secrets в namespace Chains.

    1. Установите cosign, если вы еще этого не сделали

    2. Сгенерируйте пару ключей и сохраните ее как Kubernetes secret:

      $ COSIGN_PASSWORD={password} cosign generate-key-pair k8s://tekton-pipelines/signing-secrets
      
      Successfully created secret signing-secrets in namespace tekton-pipelines
      Public key written to cosign.pub
      TIP

      Этот пароль будет сохранен в Kubernetes secret с именем signing-secrets в namespace tekton-pipelines.

    3. Проверьте, что secret был создан:

      $ kubectl get secret signing-secrets -n tekton-pipelines
      
      NAME              TYPE     DATA   AGE
      signing-secrets   Opaque   3      3m

    Шаг 2: Настроить Tekton Chains

    Настройте Tekton Chains для хранения артефактов в формате Tekton, применив следующую конфигурацию:

    $ kubectl patch tektonconfigs.operator.tekton.dev config --type=merge -p='{
      "spec": {
        "chain": {
          "artifacts.oci.storage": "",
          "artifacts.taskrun.format": "in-toto",
          "artifacts.taskrun.storage": "tekton"
        }
      }
    }'

    Пояснение полей YAML:

    • artifacts.oci.storage: Тип хранилища для OCI artifacts. Установите пустую строку, чтобы пропустить сохранение.
    • artifacts.taskrun.format: Формат артефакта taskrun. Установите in-toto, чтобы использовать формат in-toto.
    • artifacts.taskrun.storage: Тип хранилища для артефактов taskrun. Установите tekton, чтобы сохранять их в annotations Tekton TaskRun.

    Шаг 3: Запустить пример задачи

    Теперь создадим простой TaskRun, который Chains автоматически подпишет.

    1. Создайте простой TaskRun:

      $ export NAMESPACE=default
      
      $ cat <<'EOF' | kubectl create -n $NAMESPACE -f -
      apiVersion: tekton.dev/v1
      kind: TaskRun
      metadata:
        name: build-push-run-output-image-test
      spec:
        serviceAccountName: ""
        taskSpec:
          results:
          - name: IMAGE_URL
            type: string
          - name: IMAGE_DIGEST
            type: string
          steps:
          - name: create-image
            image: <registry>/ops/busybox:latest
            script: |-
              #!/bin/sh
              echo 'gcr.io/foo/bar' | tee $(results.IMAGE_URL.path)
              echo 'sha256:05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b5' | tee $(results.IMAGE_DIGEST.path)
      EOF
      TIP

      Замените image <registry>/ops/busybox:latest на фактический image, который вы хотите использовать.

    2. Дождитесь завершения TaskRun:

      $ kubectl get taskruns.tekton.dev -n $NAMESPACE -w
      
      NAME                               SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
      build-push-run-output-image-test   True        Succeeded   42s         33s

      Дождитесь, пока в статусе не появится Succeeded.

    Шаг 4: Проверить подпись

    После завершения TaskRun Tekton Chains автоматически подпишет его. Давайте проверим подпись.

    1. Получите UID TaskRun:

      export TASKRUN_UID=$(kubectl get taskruns.tekton.dev -n $NAMESPACE build-push-run-output-image-test -o jsonpath='{.metadata.uid}')
    2. Извлеките подпись:

      kubectl get taskruns.tekton.dev -n $NAMESPACE -o jsonpath="{.items[0].metadata.annotations.chains\.tekton\.dev/signature-taskrun-$TASKRUN_UID}" | base64 -d > sig
    3. Извлеките payload с помощью jq:

      cat sig | jq '.payload | @base64d' | jq -r '.' | jq '.'
    Payload подписи
    {
      "_type": "https://in-toto.io/Statement/v0.1",
      "subject": [
        {
          "name": "gcr.io/foo/bar",
          "digest": {
            "sha256": "05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b5"
          }
        }
      ],
      "predicateType": "https://slsa.dev/provenance/v0.2",
      "predicate": {
        "buildConfig": {
          "steps": [
            {
              "annotations": null,
              "arguments": null,
              "entryPoint": "#!/bin/sh\necho 'gcr.io/foo/bar' | tee /tekton/results/IMAGE_URL\necho 'sha256:05f95b26ed10668b7183c1e2da98610e91372fa9f510046d4ce5812addad86b5' | tee /tekton/results/IMAGE_DIGEST",
              "environment": {
                "container": "create-image",
                "image": "oci://<registry>/ops/busybox@sha256:ce57c394018ade463dede7cbc721c41d7bc6bc858c62d810681ff41d00d8e942"
              }
            }
          ]
        },
        "buildType": "tekton.dev/v1beta1/TaskRun",
        "builder": {
          "id": "https://tekton.dev/chains/v2"
        },
        "invocation": {
          "configSource": {},
          "environment": {
            "annotations": {
              "cpaas.io/creator": "kubernetes-admin",
              "cpaas.io/updated-at": "2025-06-15T15:18:32Z",
              "pipeline.tekton.dev/release": "002f74eea37b0f5dbcfed39c13d7cd762c8fcdc4"
            },
            "labels": {
              "app.kubernetes.io/managed-by": "tekton-pipelines"
            }
          },
          "parameters": {}
        },
        "materials": [
          {
            "digest": {
              "sha256": "ce57c394018ade463dede7cbc721c41d7bc6bc858c62d810681ff41d00d8e942"
            },
            "uri": "oci://<registry>/ops/busybox"
          }
        ],
        "metadata": {
          "buildFinishedOn": "2025-06-15T15:18:41Z",
          "buildStartedOn": "2025-06-15T15:18:32Z",
          "completeness": {
            "environment": false,
            "materials": false,
            "parameters": false
          },
          "reproducible": false
        }
      }
    }
    1. Проверьте подпись с помощью cosign:

      $ cosign verify-blob-attestation --insecure-ignore-tlog --key k8s://tekton-pipelines/signing-secrets --signature sig --type slsaprovenance --check-claims=false /dev/null
      
      WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob attestation.
      Verified OK

      При успешной проверке вы увидите Verified OK.

    Ожидаемые результаты

    После выполнения этого руководства:

    • У вас будет настроенная рабочая среда Tekton Chains с ключом подписи
    • Ваши TaskRun будут автоматически подписываться после завершения
    • Вы сможете проверять подписи, чтобы убедиться в целостности сборок

    Это демонстрирует базовую функциональность Tekton Chains. В реальном сценарии вы бы:

    1. Настроили Chains на подпись container images и хранение подписей в вашем registry
    2. Добавили шаг проверки в процесс развертывания
    3. При необходимости использовали cloud KMS для более безопасного управления ключами

    Ссылки