理解 Tekton Chains
Tekton Chains 是 Tekton 生态系统内一个强大的安全组件,它通过生成、签名和存储与使用 Tekton Pipelines 构建的工件相关的来源信息,帮助保护您的软件供应链。本文档提供了关于 Tekton Chains 如何工作及其关键组件的深入解释。
术语
术语 | 描述 |
---|
来源 | 描述工件如何产生的元数据,包括构建过程、输入和环境 |
SLSA | 软件工件供应链级别 - 一个用于软件供应链完整性的安全框架 |
证明 | 关于软件工件的经过认证的元数据,遵循 in-toto 证明格式 |
签名 | 验证来源数据的真实性和完整性的加密证明 |
类型提示 | 特殊命名的结果/参数,帮助 Tekton Chains 理解输入和输出 |
存储后端 | Tekton Chains 存储来源和签名的系统 |
为什么需要 Tekton Chains
软件供应链安全挑战
在传统的软件开发和交付管道中,确保工件在整个供应链中的完整性和安全性面临重大挑战:
- 缺乏可追溯性:没有适当的来源信息,很难验证工件的来源和构建方式
- 篡改风险:工件在各个阶段可能被修改而未被检测到
- 验证困难:工件的使用者没有可靠的方式验证其真实性
- 合规挑战:组织在满足日益增加的软件供应链安全监管要求方面遇到困难
这些挑战导致了高调的供应链攻击事件,如 SolarWinds,其中恶意代码被插入到构建过程中,影响到成千上万的组织。
Tekton Chains 的解决方案
Tekton Chains 通过以下方式应对这些挑战:
- 自动来源生成:捕获关于构建过程的详细元数据
- 加密签名:确保来源数据的完整性和真实性
- 标准化格式:支持行业标准格式,如 SLSA 来源
- 灵活存储:提供多种选项用于存储和检索来源
- 与现有工具集成:与 Sigstore、Cosign 和云 KMS 服务等工具协同工作
通过实施 Tekton Chains,组织可以实现更高水平的供应链安全性,并满足 SLSA 合规要求。
优势
- 自动化:自动生成和签名来源,无需手动干预
- 标准化:支持行业标准格式,如 SLSA 和 in-toto
- 灵活性:与各种签名机制和存储后端兼容
- 集成:与 Tekton Pipelines 生态系统无缝集成
- 透明性:提供工件生产过程的清晰可见性
- 合规性:帮助满足软件供应链安全的监管和行业要求
场景
场景 1:保护容器镜像构建
一个开发团队使用 Tekton Pipelines 来构建容器镜像。通过实施 Tekton Chains,他们可以自动生成每个镜像的签名来源,其中包括有关源代码、构建环境和构建步骤的详细信息。这些来源与镜像一起存储在他们的容器注册表中,使下游消费者能够验证镜像的真实性和构建过程。
场景 2:遵循安全要求合规
一个组织需要遵循安全要求,这要求对所有部署的软件实现可追溯性和完整性验证。通过使用 Tekton Chains,他们可以为所有工件生成 SLSA 来源,提供每个工件的构建过程及其来源的加密证明。这有助于他们满足审计要求,并在保护其供应链的尽职调查中展示其努力。
场景 3:检测供应链攻击
一个安全团队希望确保构建过程没有未经授权的更改。通过 Tekton Chains,任何试图篡改构建过程的行为都会导致来源不符合预期值。通过在其部署过程中实施验证步骤,他们可以自动检测和阻止具有可疑来源的工件的部署。
约束与限制
- Kubernetes 依赖性:需要一个安装了 Tekton Pipelines 的 Kubernetes 集群
- 配置复杂性:需要适当的类型提示配置以确保准确的来源
- 密钥管理:安全管理签名密钥是必不可少的
- 存储要求:需要额外的存储用于来源和签名
- 性能影响:签名和存储来源会增加构建过程的一定开销
原则
Tekton Chains 的工作原理
Tekton Chains 通过一个控制器在 Kubernetes 集群中观察 TaskRun 和 PipelineRun 资源。工作流程遵循以下步骤:
- 观察:控制器观察已完成的 TaskRuns 和 PipelineRuns
- 快照:当一个运行完成时,Chains 会对其状态进行快照
- 格式化:Chains 生成以配置格式(如 SLSA)表示的来源
- 签名:来源使用配置的方法进行加密签名
- 存储:来源和签名都存储在配置的后端中

来源生成
Tekton Chains 使用类型提示来理解构建过程的输入和输出。这些信息然后被用来以指定格式生成来源:
- 输入收集:Chains 通过类型提示识别输入工件
- 构建过程捕获:记录关于构建环境和步骤的详细信息
- 输出识别:通过类型提示识别输出工件
- 来源组装:将所有信息组装为标准化格式
签名过程
Tekton Chains 支持多种签名方法,以适应不同的安全要求:
- 密钥检索:从配置来源检索签名密钥
- 有效负载准备:准备用于签名的来源数据
- 签名生成:生成加密签名
- 验证数据:包括验证所需的附加数据
配置示例
基本 SLSA v1.0 配置
apiVersion: v1
kind: ConfigMap
metadata:
name: chains-config
namespace: tekton-chains
data:
artifacts.taskrun.format: "slsa/v2alpha3"
artifacts.taskrun.storage: "tekton,oci"
artifacts.taskrun.signer: "x509"
artifacts.pipelinerun.format: "slsa/v2alpha3"
artifacts.pipelinerun.storage: "tekton"
artifacts.pipelinerun.signer: "x509"
artifacts.oci.format: "simplesigning"
artifacts.oci.storage: "oci"
artifacts.oci.signer: "x509"
Git 源的类型提示示例
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
name: build-from-source
spec:
taskSpec:
results:
- name: CHAINS-GIT_URL
description: Git 仓库 URL
- name: CHAINS-GIT_COMMIT
description: Git 提交 SHA
- name: IMAGE_URL
description: 构建镜像的 URL
- name: IMAGE_DIGEST
description: 构建镜像的摘要
steps:
# 任务实现
重要参数
存储配置
存储后端决定来源和签名存储的位置。这对于确保来源在需要时可用于验证至关重要。
用例
- Tekton 存储:用于调试和内部验证
- OCI 存储:在容器镜像旁边存储来源的理想选择
- GCS/DocDB 存储:适合集中存储和管理
配置示例
artifacts.taskrun.storage: "tekton,oci"
artifacts.pipelinerun.storage: "tekton"
artifacts.oci.storage: "oci"
签名配置
签名配置决定了如何对来源进行加密签名,这对验证其真实性至关重要。
用例
- x509:基于标准证书的签名
- KMS:增强安全性的云密钥管理
- 无密钥:使用临时密钥进行零信任签名
配置示例
artifacts.taskrun.signer: "x509"
artifacts.pipelinerun.signer: "x509"
artifacts.oci.signer: "x509"
参考