快速开始

本指南帮助新用户快速设置 Tekton Chains,通过为 Tekton TaskRuns 生成和验证加密签名,保障其 CI/CD 流水线的安全。

目录

介绍

使用场景

Tekton Chains 通过自动为构建产物生成加密签名,帮助您保障软件供应链的安全。本指南演示如何设置 Tekton Chains、生成签名密钥、运行简单任务并验证其签名。

预计阅读时间

10-15 分钟

重要说明

  • 使用 Alauda Devops Pipelines Operator 时,Tekton Chains 默认安装在 tekton-pipelines 命名空间中
  • 签名密钥应安全管理;在生产环境中,建议使用密钥管理系统(KMS)
  • 本指南使用最简单的配置进行演示

前提条件

  • 已安装 Tekton Pipelines 和 Tekton Chains 的 Kubernetes 集群
  • 已安装并配置好访问集群的 kubectl CLI
  • 已安装 cosign CLI 工具
  • 已安装 jq CLI 工具

流程概览

步骤操作说明
1生成签名密钥创建用于签名产物的密钥对
2配置 Tekton Chains设置 Chains 使用 Tekton 存储后端
3运行示例任务创建并运行一个简单的 TaskRun
4验证签名提取并验证 TaskRun 的签名

逐步操作指南

步骤 1:生成签名密钥

更多详情请参考 Signing Key Configuration

Tekton Chains 使用加密密钥对产物进行签名。默认情况下,它会在 Chains 命名空间中查找名为 signing-secrets 的 Secret。

  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

    该密码将存储在 tekton-pipelines 命名空间中的 Kubernetes Secret signing-secrets 中。

  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.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. 获取 TaskRun 的 UID:

    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 以实现更安全的密钥管理

参考资料