了解 Tekton Chains
Tekton Chains 是 Tekton 生态系统中一个强大的安全组件,通过为使用 Tekton Pipelines 构建的工件生成、签名和存储溯源信息,帮助保障您的软件供应链安全。本文档深入讲解了 Tekton Chains 的工作原理及其关键组件。
目录
术语
术语 | 描述 |
---|
SLSA | 软件工件供应链等级(Supply-chain Levels for Software Artifacts)——软件供应链完整性的安全框架 |
Signature | 用于验证溯源数据真实性和完整性的密码学证明 |
Attestation | 关于软件工件的经过认证的元数据,遵循 in-toto 认证格式 |
Verification | 检查认证数据真实性和完整性的过程 |
Type Hinting | 一种特殊命名的结果/参数,帮助 Tekton Chains 理解输入和输出 |
Storage Backend | Tekton Chains 用于存储溯源和签名的系统 |
认证有多种谓词类型。
谓词类型 | 描述 |
---|
SLSA Provenance | 描述工件如何生成的元数据,包括构建过程、输入和环境信息 |
SBOM | 列出软件产品所有组件及其关系的文档 |
Vulnerability Scan Results | 列出软件产品中发现的所有漏洞的报告 |
Custom Metadata | 关于软件产品的自定义元数据 |
为什么需要 Tekton Chains
软件供应链安全挑战
在传统的软件开发和交付流水线中,确保供应链中工件的完整性和安全性面临诸多挑战:
- 缺乏可追溯性:没有适当的溯源信息,难以验证工件的来源及构建方式
- 篡改风险:工件可能在各个阶段被修改而不被发现
- 验证困难:工件的消费者无法可靠地验证其真实性
- 合规挑战:组织难以满足日益严格的软件供应链安全法规要求
这些挑战导致了诸如 SolarWinds 这类高调的供应链攻击事件,恶意代码被植入构建流程,影响数千家机构。
Tekton Chains 的解决方案
Tekton Chains 通过以下方式应对这些挑战:
- 自动生成溯源:捕获构建过程的详细元数据
- 密码学签名:确保溯源数据的完整性和真实性
- 标准化格式:支持行业标准格式如 SLSA 溯源
- 灵活存储:提供多种溯源存储和检索选项
- 与现有工具集成:支持 Cosign、Syft、Trivy、Kyverno、Rekor 及云 KMS 服务
- Cosign:用于容器镜像签名、验证和管理签名的工具
- Syft:用于生成容器镜像 SBOM 的工具
- Trivy:用于生成容器镜像 SBOM 和漏洞扫描结果及漏洞扫描的工具
- Kyverno:Kubernetes 的策略引擎,可用于强制执行容器镜像安全策略
- Rekor:签名工件的公共透明日志
通过实施 Tekton Chains,组织能够提升供应链安全水平,满足 SLSA 合规要求。
优势
- 自动化:自动生成并签署溯源,无需人工干预
- 标准化:支持 SLSA 和 in-toto 等行业标准格式
- 灵活性:兼容多种签名机制和存储后端
- 集成性:无缝集成 Tekton Pipelines 生态系统
- 透明性:清晰展示工件的生成过程
- 合规性:助力满足供应链安全的法规和行业要求
场景
场景 1:镜像签名验证
开发团队希望通过密码学签名确保容器镜像的完整性。使用 Tekton Chains,可以自动为构建的镜像签名,并在部署过程中验证签名,防止未授权修改,确保仅部署受信任的镜像。
场景 2:构建系统溯源验证
组织需要验证构建过程的真实性,确保符合安全要求。通过实施 Tekton Chains,可以为容器镜像生成 SLSA 溯源,详细记录每个镜像的构建方式,维护安全且可审计的构建流程。
场景 3:源代码仓库验证
团队希望确保容器镜像是基于受信任的源代码仓库构建。使用 Tekton Chains,可以自动生成包含源代码仓库信息和提交详情的溯源,帮助验证镜像是否来自正确的源代码和特定提交。
场景 4:漏洞扫描与验证
安全团队需要确保容器镜像在部署前无已知漏洞。通过结合漏洞扫描工具使用 Tekton Chains,可以自动扫描镜像安全问题并验证扫描结果,维护安全的镜像仓库,防止漏洞镜像部署。
场景 5:基础镜像和 SBOM 验证
组织希望维护容器镜像组件的完整清单,并确保使用受信任的基础镜像。结合 SBOM 生成工具使用 Tekton Chains,可以自动生成并验证镜像的软件物料清单,跟踪依赖关系,确保符合安全策略。
场景 6:许可证合规验证
法务团队需要确保容器镜像中的所有软件组件符合许可证要求。通过结合 SBOM 验证使用 Tekton Chains,可以自动检查镜像中所有组件的许可证,帮助维护软件许可合规,避免潜在法律风险。
场景 7:无密钥签名验证
开发团队希望实现零信任签名方式,无需管理签名密钥。使用支持无密钥签名的 Tekton Chains,可以自动使用临时密钥和透明日志为工件签名,消除密钥管理负担,同时保持强安全保障。
约束与限制
- 依赖 Kubernetes:需要安装了 Tekton Pipelines 的 Kubernetes 集群
- 配置复杂性:准确的 type hinting 配置是生成正确溯源的前提
- 密钥管理:签名密钥的安全管理至关重要
- 存储需求:溯源和签名需要额外存储空间
- 性能影响:签名和存储溯源会增加构建过程的开销
原理
Tekton Chains 的工作方式
Tekton Chains 通过一个控制器观察 Kubernetes 集群中的 TaskRun 和 PipelineRun 资源。工作流程如下:
- 观察:控制器监视已完成的 TaskRun 和 PipelineRun
- 快照:运行完成时,Chains 对其状态进行快照
- 格式化:Chains 生成配置格式(如 SLSA)的溯源
- 签名:使用配置的方法对溯源进行密码学签名
- 存储:将溯源和签名存储到配置的后端

溯源生成
Tekton Chains 利用 type hinting 理解构建过程的输入和输出信息,进而生成指定格式的溯源:
- 输入收集:通过 type hints 识别输入工件
- 构建过程捕获:记录构建环境和步骤详情
- 输出识别:通过 type hints 识别输出工件
- 溯源组装:将所有信息组装成标准格式
签名过程
Tekton Chains 支持多种签名方法以满足不同安全需求:
- 密钥获取:从配置源获取签名密钥
- 负载准备:准备待签名的溯源数据
- 签名生成:生成密码学签名
- 验证数据:包含验证所需的附加数据
配置示例
基础 SLSA v1.0 配置
apiVersion: v1
kind: ConfigMap
metadata:
name: chains-config
namespace: tekton-chains
data:
artifacts.taskrun.format: "slsa/v1"
artifacts.taskrun.storage: "oci"
artifacts.taskrun.signer: "x509"
artifacts.pipelinerun.format: "slsa/v1"
artifacts.pipelinerun.storage: "oci"
artifacts.pipelinerun.signer: "x509"
artifacts.oci.format: "simplesigning"
artifacts.oci.storage: "oci"
artifacts.oci.signer: "x509"
Type Hinting
Type Hinting 是 Tekton Chains 中的一种特殊机制,通过特定命名约定帮助 Chains 理解 PipelineRun/TaskRun 中的输入和输出工件。
目的
- 帮助 Chains 正确识别和记录构建过程中的输入和输出工件
- 生成准确的 SLSA 溯源认证
- 确保构建过程的可追溯性和完整性
指定输入和输出工件有多种方式:
1. CHAINS-GIT_URL 和 CHAINS-GIT_COMMIT 组合
- Git 仓库信息的特殊 type hints
- 用于跟踪源代码仓库详情
- 有助于生成源代码的溯源
results:
- name: CHAINS-GIT_URL
type: string
- name: CHAINS-GIT_COMMIT
type: string
TaskRun 示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: git-clone
spec:
taskSpec:
params:
- name: url
description: Repository URL to clone from.
type: string
default: "https://github.com/tektoncd/pipeline"
- name: revision
description: Revision to checkout. (branch, tag, sha, ref, etc...)
type: string
default: "main"
results:
- name: CHAINS-GIT_URL
type: string
description: The precise URL that was fetched by this Task.
- name: CHAINS-GIT_COMMIT
type: string
description: The precise commit SHA that was fetched by this Task.
steps:
- name: dummy-clone
image: bash:latest
script: |
#!/usr/bin/env bash
echo -n "https://github.com/tektoncd/pipeline" | tee $(results.CHAINS-GIT_URL.path)
echo -n "7f2f46e1b97df36b2b82d1b1d87c81b8b3d21601" | tee $(results.CHAINS-GIT_COMMIT.path)
2. *ARTIFACT_INPUTS
注意:
- 用于指定影响构建过程的输入工件
- 有助于跟踪依赖和源材料
results:
- name: first-ARTIFACT_INPUTS
type: object
properties:
uri: {}
digest: {}
TaskRun 示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: git-clone
spec:
taskSpec:
params:
- name: url
description: Repository URL to clone from.
type: string
default: "https://github.com/tektoncd/pipeline"
- name: revision
description: Revision to checkout. (branch, tag, sha, ref, etc...)
type: string
default: "main"
results:
- name: source_repo_ARTIFACT_INPUTS
description: The source code repo artifact
type: object
properties:
uri: {}
digest: {}
steps:
- name: dummy-clone
image: bash:latest
script: |
#!/usr/bin/env bash
echo -n "{\"uri\":\"https://github.com/tektoncd/pipeline\", \"digest\":\"sha1:7f2f46e1b97df36b2b82d1b1d87c81b8b3d21601\"}" > $(results.source_repo_ARTIFACT_INPUTS.path)
3. *IMAGE_URL 和 *IMAGE_DIGEST 组合
results:
- name: first-image-IMAGE_URL
type: string
- name: first-image-IMAGE_DIGEST
type: string
TaskRun 示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: image-build
spec:
taskSpec:
results:
- name: first-image-IMAGE_URL
type: string
description: The precise URL of the OCI image built.
- name: first-image-IMAGE_DIGEST
type: string
description: The algorithm and digest of the OCI image built.
steps:
- name: dummy-build
image: bash:latest
script: |
#!/usr/bin/env bash
echo -n "gcr.io/foo/bar" | tee $(results.first-image-IMAGE_URL.path)
echo -n "sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee" | tee $(results.first-image-IMAGE_DIGEST.path)
4. IMAGES
- 可指定多个镜像,逗号或换行分隔
- 每个镜像必须包含完整的摘要信息
results:
- name: IMAGES
type: string
TaskRun 示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: image-build
spec:
taskSpec:
results:
- name: IMAGES
description: The multiple image artifacts
type: string
steps:
- name: dummy-build
image: bash:latest
script: |
#!/usr/bin/env bash
echo -n "img1@sha256:digest1, img2@sha256:digest2" | tee $(results.IMAGES.path)
5. *ARTIFACT_URI / *ARTIFACT_DIGEST 组合
- 类似 IMAGE_URL/IMAGE_DIGEST,但命名不同
- 用于指定工件位置及其摘要
results:
- name: first-ARTIFACT_URI
type: string
- name: first-ARTIFACT_DIGEST
type: string
6. *ARTIFACT_OUTPUTS
- 使用对象类型结果
- 必须包含 uri 和 digest 字段
results:
- name: first-ARTIFACT_OUTPUTS
type: object
properties:
uri: {}
digest: {}
TaskRun 示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: image-build
spec:
taskSpec:
results:
- name: first-ARTIFACT_OUTPUTS
description: The first artifact built
type: object
properties:
uri: {}
digest: {}
steps:
- name: dummy-build
image: bash:latest
script: |
#!/usr/bin/env bash
echo -n "{\"uri\":\"gcr.io/foo/bar\", \"digest\":\"sha256:586789aa031fafc7d78a5393cdc772e0b55107ea54bb8bcf3f2cdac6c6da51ee\"}" > $(results.first-ARTIFACT_OUTPUTS.path)
重要参数
存储配置
存储后端决定溯源和签名的存放位置,这对于确保溯源在验证时可访问至关重要。
使用场景
- Tekton 存储:适合调试和内部验证
- OCI 存储:适合与容器镜像一起存储溯源
- GCS/DocDB 存储:适合集中存储和管理
配置示例
artifacts.taskrun.storage: "tekton,oci"
artifacts.pipelinerun.storage: "tekton"
artifacts.oci.storage: "oci"
签名配置
签名配置决定溯源如何进行密码学签名,是验证其真实性的关键。
使用场景
- x509:标准证书签名
- KMS:基于云的密钥管理,增强安全性
- Keyless:使用临时密钥的零信任签名
配置示例
artifacts.taskrun.signer: "x509"
artifacts.pipelinerun.signer: "x509"
artifacts.oci.signer: "x509"
参考资料