使用 Travis CI 签名您的软件

分享此内容
分享此内容

软件供应链安全是指保护创建和部署软件过程中涉及的组件、活动和实践。这些实践之一是在发布软件之前由开发人员对其进行数字签名。数字证书的目的是确保软件未被篡改,接收者可以安全地下载它。

现在,在使用 CI/CD 系统部署软件之前,您可以使用 Travis CI 安全地对其进行签名。

自 2021 年 5 月美国总统发布行政命令以来,软件开发行业,尤其是 CI/CD 社区,在安全意识和功能方面都有了显著提升,这些功能可以提高软件供应商遵守安全软件供应链计划的能力。无论您是小型软件团队还是大型、成熟的软件提供商,您都可能面临以下要求

  • 随您的发布提供软件物料清单 (SBOM)。
  • 必须定期执行安全扫描报告。
  • 软件发布(无论是二进制文件、源代码包还是包含您的应用程序或系统的容器镜像)必须进行安全签名。

现代 CI/CD 系统为了简化和自动化满足上述要求的过程,会与工具集成,允许在 CI/CD 流程中生成所需元素。Travis CI 也不例外。

什么是安全签名软件?(服务器端)

以 Docker 镜像为例,签名是为 Docker 镜像进行数字签名的过程,以确认软件作者的身份,可以把它理解为 PGP 密钥。它可以确保代码未被更改或损害。镜像签名有两种方式

  • 在客户端。
  • 在服务器端。

让我们通过图表来了解它在服务器端的工作原理

任何声称支持特定 Docker 分发镜像规范的注册表或运行时都会与各种清单类型进行交互。现在您已经了解了它在服务器端的工作原理,我们再来一步一步地详细介绍一下它在服务器端的工作方式

  • 原始镜像(有时称为清单)首先通过散列算法进行散列,这通常称为“加盐”。加盐只是在通过散列算法进行散列之前将随机选择的位模式与镜像组合在一起,流程如下:如果 相等 则表示镜像  被篡改。
  • 然后,我们得到的散列 Docker 镜像会使用开发者自己的私钥进行签名。
  • 然后,已签名的散列 Docker 镜像与原始镜像和数字证书一起打包,它们一起也被称为镜像签名证书。
  • 现在,它可以被上传或传输给客户。

实际上,您可以使用以下命令查询 DockerHub 关于存储库的签名和签署者状态

docker trust inspect --pretty travisci/signatures

这将列出镜像背后的公证人。

客户端

现在,让我们看一下该过程在客户端是如何进行的

  • 原始 Docker 镜像通过散列算法进行处理,以获得镜像的散列值,换句话说,此时镜像正在进行“加盐”。
  • 从证书中提取公钥并将其应用于 Docker 镜像的已签名散列值以提取镜像的散列值,此时您可以看到公证人。
  • 比较步骤 1 和 2 中创建的两个散列值,如果两个散列值相同,则表示镜像未被更改,并且签名被认为是有效的。
  • 同时,检查镜像签名证书以确保它是由受信任的 CA 签名的。检查镜像签名证书的过期日期,并根据吊销列表检查证书以确保它有效。

如何在 Travis CI 上签名您的软件

Travis CI 提供使用 cosign 工具和密钥对您的软件进行签名的功能。

Cosign 是 Sigstore 项目的一部分,它有助于确保安全软件供应链所需的工具。

准备好用于签名软件的专用密钥

要使用 Travis CI 对您的软件进行签名,您需要准备一个专用密钥。要获取专用密钥,您有两个选择

  • 您可以将无密码 SSH 密钥以 PEM 格式上传到 Travis CI 帐户(个人或组织设置) - 设置选项卡中有一个名为“构建作业的 SSH 密钥”的新选项;向下滚动到底部。
  • 第二个选择是,您可以拥有一个自管理的 Hashicorp Vault,Travis CI 可以访问它并在那里存储密钥,供与 Travis CI 关联的用户获取。

在构建作业期间签名容器镜像

如果您使用的是上传到 Travis CI 的密钥,请使用以下示例

keys:
  - SSH_KEY_FOR_SIGNING # must match the key identifier set in the UI
env:
  secret: “...” # encrypted COSIGN_PASSWORD=...  string; see cosign doc
before_script: 
  - travis_key SSH_KEY_FOR_SIGNING cosign.key  # cosign requires the key to be in a file
script: 
  - cosign sign --key cosign.key [whatever_the_image_identifier_is]

如果您希望在构建作业期间直接从 Hashicorp Vault 获取密钥,请尝试以下操作

vault:
  api_url: [single value endpoint address:port] #mandatory
  token:
    secure: “...” #mandatory
    # This will make the default VAULT_ADDR and VAULT_TOKEN available for cosign.
script:
  - cosign sign --key hashivault://some-key-identifier [whatever_the_image_identifier_is]

部署发布或容器镜像

对文件或容器镜像进行签名后,您可以将其部署到指定位置,就像您之前所做的一样。

注意事项

由于安全签名软件旨在验证发布,因此保护用于签名的密钥非常重要。对于云 CI/CD 系统,存在某些安全注意事项,尤其是针对恶意行为者的攻击面。细节因 CI/CD 提供商而异,例如,取决于构建日志是公开还是私有,向作业提供密钥的具体机制、访问控制和特定设置。

请务必熟悉我们在安全签名软件文档页面中与之相关的部分,以便在您考虑使用 Travis CI 安全签名您的软件时参考。

了解更多

© 版权所有 2024,保留所有权利
© 版权所有 2024,保留所有权利
© 版权所有 2024,保留所有权利