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

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

    Введение

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

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

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

    10-15 минут

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

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

    Требования

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

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

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

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

    Шаг 1: Генерация ключей подписи

    Для подробностей смотрите Signing Key Configuration

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

    1. Установите cosign, если он ещё не установлен

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

      $ 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 секрете с именем signing-secrets в пространстве имён tekton-pipelines.

    3. Проверьте, что секрет создан:

      $ 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.taskrun.format: Формат артефакта taskrun. Установлен в in-toto для использования формата in-toto.
    • artifacts.taskrun.storage: Тип хранилища для артефактов taskrun. Установлен в tekton для хранения в аннотациях 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

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

    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. Извлеките полезную нагрузку с помощью jq:

      cat sig | jq '.payload | @base64d' | jq -r '.' | jq '.'
    Полезная нагрузка подписи
    {
      "_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 с ключом для подписи
    • Ваши TaskRuns автоматически подписываются после завершения
    • Вы можете проверять подписи для обеспечения целостности сборок

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

    1. Настроили Chains для подписи контейнерных образов и хранения подписей в вашем реестре
    2. Добавили этап проверки в процесс деплоя
    3. Возможно, использовали облачный KMS для более безопасного управления ключами

    Ссылки