译文 | Witness 一个可插拔的供应链安全框架
2022-2-15 10:53:45 Author: mp.weixin.qq.com(查看原文) 阅读量:12 收藏

开卷有益 · 不求甚解


前言

Witness 可防止篡改构建材料并验证构建过程从源到目标的完整性。它通过包装在持续集成过程中执行的命令来工作。它的证明系统是可插拔的,并为大多数主要 CI 和基础设施提供商提供开箱即用的支持。对见证元数据的验证和安全的 PKI 分发系统将减轻许多软件供应链攻击向量,并可用作自动化治理的框架。

Witness 是整体规范的实现,包括ITE-5、ITE-6、ITE-7和嵌入式 rego 策略引擎。

  • 不需要提升的权限。
  • 可以在容器化或非容器化环境中运行
  • 记录 CI 过程中发生的材料、工件和事件的安全哈希
  • 与云身份服务的集成
  • 使用SPIFFE/SPIRE进行无密钥签名
  • 支持上传证明证据到 rekor 服务器 (sigstore)
  • 使用 Open Policy Agent 构建策略执行。
  • 用于跟踪和进程篡改预防的 Alpha 支持
  • 验证 CI 步骤之间以及气隙之间的文件完整性。
  • 实验性 Windows 和 ARM 支持

用法

  • 运行- 运行提供的命令并记录有关执行的证明。
  • 签名- 使用提供的密钥对提供的文件进行签名。
  • 验证- 验证见证策略。

目录

  • 见证人
    • 验证生命周期
    • 什么是证人政策?
    • 预运行证明者
    • 内部证明者
    • 运行后证明者
    • 证明集合
    • 证明人主体
    • 证明生命周期
    • 什么是见证人证明人?
    • 证明者安全模型
    • 证明者生命周期
    • 证明者类型
    • 证人政策
    • 证人验证
    • 使用 SPIRE 进行无密钥签名
    • 见证例子
    • 媒体
    • 路线图
    • 支持

入门

下载二进制文件

发布

curl -LO https://github.com/testifysec/witness/releases/download/${VERSION}/witness_${VERSION}_${ARCH}.tar.gz
tar -xzf witness_${VERSION}_${ARCH}.tar.gz

创建密钥对

Witness 支持使用SPIRE进行无密钥签名!

openssl genpkey -algorithm ed25519 -outform PEM -out testkey.pem
openssl pkey -in testkey.pem -pubout > testpub.pem

创建见证配置

  • 该文件通常与上面生成的公钥一起位于您的源代码存储库中。
  • .witness yaml是配置文件的默认位置
  • witness help将显示所有配置选项
  • 命令行参数覆盖配置文件值。
## .witness.yaml

run:
    key: testkey.pem
    trace: false
verify:
    attestations:
        - "test-att.json"
    policy: policy-signed.json
    publickey: testpub.pem

记录构建步骤的证明

  • -a {attestor}标志允许您定义哪些证明者运行
  • 前任。-a maven -a was -a gitlab将用于在 GCP 上的 GitLab 运行器上运行的 maven 构建。
  • 定义步骤名称很重要,这些将在策略中使用。
  • 这应该作为 CI 步骤的一部分发生
witness run --step build -o test-att.json -- go build -o=testapp .

查看签名的 DSSE 信封中的证明数据

  • 可以从 rekor 存储和检索这些数据!
  • 这是根据 Rego 政策评估的数据
cat test-att.json | jq -r .payload | base64 -d | jq

创建策略文件

在此处查看有关见证政策的完整文档。

  • 确保将此文件中的密钥替换为上述步骤中的密钥(下面的 sed 命令)。
  • Rego 策略应该是 base64 编码的
  • 步骤绑定到键。可以编写策略来检查证书数据。例如,我们可以要求一个步骤由具有特定CN属性的密钥签名。
  • 证人将需要所有证明才能成功
  • Witness 将针对相应证明者中的 JSON 对象评估 rego 策略
## policy.json

{
  "expires""2023-12-17T23:57:40-05:00",
  "steps": {
    "build": {
      "name""build",
      "attestations": [
        {
          "type""https://witness.testifysec.com/attestations/material/v0.1",
          "regopolicies": []
        },
        {
          "type""https://witness.testifysec.com/attestations/command-run/v0.1",
          "regopolicies": []
        },
        {
          "type""https://witness.testifysec.com/attestations/product/v0.1",
          "regopolicies": []
        }
      ],
      "functionaries": [
        {
          "publickeyid""{{PUBLIC_KEY_ID}}"
        }
      ]
    }
  },
  "publickeys": {
    "{{PUBLIC_KEY_ID}}": {
      "keyid""{{PUBLIC_KEY_ID}}",
      "key""{{B64_PUBLIC_KEY}}"
    }
  }
}

替换策略中的变量

id=`sha256sum testpub.pem | awk '{print $1}'` && sed -i "s/{{PUBLIC_KEY_ID}}/$id/g" policy.json
pubb64=`cat testpub.pem | base64 -w 0` && sed -i "s/{{B64_PUBLIC_KEY}}/$pubb64/g" policy.json

签署政策文件

妥善保管此密钥,其所有者将控制政策门。

witness sign -f policy.json --key testkey.pem --outfile policy-signed.json

验证二进制文件是否符合政策要求

只要您拥有签名的策略文件、正确的二进制文件以及与签署该策略的私钥相对应的公钥或证书颁发机构,此过程就可以跨气隙工作。witness verify在失败的情况下将返回non-zero退出和原因。0对于需要多个步骤、需要多个证明的策略,成功将保持退出状态。

witness verify -f testapp -a test-att.json -p policy-signed.json -k testpub.pem

什么是见证人证明人?

见证证明者是断言有关系统的事实并将这些事实存储在版本化模式中的代码片段。每个证明者都有一个NameTypeRunType。这Type是与证明的 JSON 模式相对应的版本化字符串。例如,AWS 证明者定义如下:

  Name    = "aws"
  Type    = "https://witness.testifysec.com/attestation/aws/v0.1"
  RunType = attestation.PreRunType

当我们针对这些证明评估策略时,会使用证明类型。

证明者安全模型

证明仅与提供它们的数据一样安全。在可能的情况下,应验证加密材料,验证证据应包含在带外验证的证明中。

在GCP、AWS和GitLab证明者中可以找到加密验证的示例。

证明者生命周期

  • PreRun: 证明者在证明者和证明PreRun者之前运行。这些证明者通常会收集有关环境的信息。material``commandRun
  • **材料证明者:**证明material者是内部证明者,并在之后立即运行
  • CommandRun 证明者: CommandRun 证明者是内部证明者。它具有实验性跟踪支持,可以使用--trace标志启用
  • **产品证明者:**产品证明者收集证明者生产的产品commandRun并计算安全哈希,并将文件描述符提供给postRun证明者。

证明生命周期

证明者类型

预运行证明者

  • AWS - AWS 实例元数据的证明者
  • GCP - GCP 实例身份服务的证明者
  • GitLab - GitLab 管道的证明者
  • Git - Git 存储库的证明者
  • Maven项目的Maven 证明者
  • 环境- 环境变量的证明者(*注意这一点 - 还没有办法屏蔽值*
  • JWT - JWT 令牌的证明者

内部证明者

  • CommandRun - 记录有关正在运行的实际进程的跟踪和元数据
  • Material - 记录当前工作目录中文件的安全哈希值
  • 产品- 记录由 commandrun attestor 生成的文件的安全哈希(仅检测新文件)

运行后证明者

PostRun 证明者收集可以访问产品证明者发现的文件。PostRun 证明者的目的是从产品中选择元数据。例如,在 OCI 证明者中,证明者检查 tar 文件并提取 OCI 容器元数据。

  • OCI - tar'd OCI 图像的证明者

证明集合

AnattestationCollection是一组以密码方式绑定在一起的证明。因为证明是绑定在一起的,所以我们可以相信它们都是作为同一个证明生命周期的一部分发生的。见证政策定义了需要哪些证明。

证明人主体

证明者定义充当查找索引的主题。attestationCollection 可以由证明者定义的任何主题查找。

证人政策

什么是证人政策?

见证策略是一个签名文档,它对要验证的工件的要求进行编码。见证策略包括受信任的工作人员的公钥,必须找到哪些证明,以及根据证明元数据评估的 rego 策略。

我见证了策略允许管理员在工件生命周期的任何时候跟踪工件的合规性状态。

证人验证

验证生命周期

使用SPIRE进行无密钥签名

Witness 可以使用来自SPIRE节点代理的临时密钥。使用标志配置见证--spiffe-socket以启用无密钥签名。

在验证过程中,见证人将使用Rekor集成时间来确定证书的有效性。SPIRE 证书只需保持足够长的有效时间,即可将证明集成到 Rekor 日志中。

见证例子

  • 使用见证来防止 SolarWinds 类型的攻击
  • 使用 Witness 查找具有隐藏的易受攻击的 Log4j 依赖项的工件

媒体

  • 博客 - 什么是供应链证明,我为什么需要它?
  • 谈话 - 通过 in-toto 和 SPIRE 项目保护软件供应链
  • 讲座 - 使用 SBOM 和认证保护软件供应链

路线图

  • 所有主要平台的证明者
  • CaC 卡证明者
  • GovCloud 证明者
  • OIDC 证明者
  • FIDO 证明者
  • 保管库密钥提供程序
  • 云 KMS 支持
  • Kubernetes准入控制器
  • SIEM 收集代理
  • 签名签名验证
  • 公证人 v2 签名验证
  • Zarf集成
  • IronBank 证明者

译文申明

  • 文章来源为近期阅读文章,质量尚可的,大部分较新,但也可能有老文章。
  • 开卷有益,不求甚解,不需面面俱到,能学到一个小技巧就赚了。
  • 译文仅供参考,具体内容表达以及含义, 以原文为准 (译文来自自动翻译)
  • 如英文不错的,尽量阅读原文。(点击原文跳转)
  • 每日早读基本自动化发布(不定期删除),这是一项测试

最新动态: Follow Me

微信/微博:red4blue

公众号/知乎:blueteams



文章来源: http://mp.weixin.qq.com/s?__biz=MzU0MDcyMTMxOQ==&mid=2247484791&idx=1&sn=dce5ab2b25903eab9ddea3b67d784b89&chksm=fb35acbfcc4225a94f2499e4a68dd218a147c0af00365d8f118be54702fa6d8638a3576a7b99#rd
如有侵权请联系:admin#unsafe.sh