2024年6月25日更新:人工制品认证现已正式提供! 立即开始 .
企业和开源生态系统越来越需要一种可验证的方式来 将软件工件链接回其源代码和构建指令 。由于有超过1亿名开发人员在GitHub上进行开发,我们希望确保开发人员拥有必要的工具来帮助保护其软件供应链的完整性。 今天,我们很自豪地宣布了人工制品认证的公开测试版,这是一项新功能,将为文化转向期望 知道 软件的来源。
工件证明允许项目维护人员毫不费力地创建一个防篡改、不可伪造的书面线索,将其软件与创建它的过程链接起来。然后,该元数据的下游消费者可以使用它作为基础,通过策略评估(通过以下工具)进行新的安全性和有效性检查 雷戈 和 提示 。我们从基于GitHub CLI的验证支持开始,但将在今年晚些时候扩展到将这些相同的控件引入Kubernetes生态系统。
工件证明由 西格斯托尔 ,一个用于签署和验证软件工件的开源项目。 这意味着开源维护者可以减少其项目受到供应链攻击的风险,并提高更广泛的软件生态系统的安全性——无论维护者在何处托管其代码或构建其工件。 让我们跳进去。
轻松的用户体验
安全功能不仅需要强大,还必须易于采用和配置,才能有效。 工件证明的设置再简单不过了:您所需要做的就是在GitHub Actions工作流中添加一点YAML,以创建证明和 安装GitHub CLI工具 到 验证 它。
启用GitHub操作工作流以写入证明存储: 权限: id-token:写入 证明:写入 目录:读取
指导工作流创建证明,确保在工件生成后放置它: -名称:Attest Build Provence 使用:操作/ 认证建造产地@897ed5eab6ed058a474202017ada7f40bfa52940 #v1.0.0版本 具有: subject-path:“bin/my-artifact.tar.gz”
构建完成并下载工件后,使用GitHub CLI( 2.49.0或更高版本 )要进行验证,请提供包含运行操作的存储库的组织的名称: gh认证验证my-artifact.tar.gz-o my-organization
还可以很容易地下载认证文档本身以进行存储或脱机验证(例如,在空包环境中),快速查看证书详细信息,或以JSON格式提取验证过的认证内容,以便您可以通过管道将其传输到类似的策略引擎 OPA公司 .
软件包认证.slsa1 import future.keywords.if approved_repos:=[ " https://github.com/sigstore/sigstore-js ", " https://github.com/github/example ", ] #故障关闭 默认允许:=false #如果存储库位于approved_repos列表中且谓词类型匹配,则允许 允许{ 一些我 #检查谓词type是否与所需类型匹配 input[i].verificationResult.statement.predicateType==“ https://slsa.dev/provance/v1 " #尝试安全分配回购变量 repo:=输入[i].verificationResult.statement.predicate.buildDefinition.externalParameters.workflow.repository repo==批准的repo[_] }
您可以获取JSON格式的证明,并使用策略进行验证 我的文件.zip
来自策略中允许的存储库,如下所示:
$gh认证验证-R github/example--格式化json myfile.zip |\ opa eval—标准输入-f原始\ -d policy.rego“data.attestation.slsa1.allow==true” 真的
我可以证明我构建中的其他东西吗,比如SBOM?
如果您有 SBOM公司 作为构建的一部分生成的,可以使用新的 证明-证明行动 将其与最终工件关联。 您只需提供该工件的路径,操作将负责将其包装在一个in-toto证明谓词中,用我们的内部Sigstore实例对其进行签名,并将其发送到我们的证明存储。 如果你 不要 您的构建中已经有一个SBOM,并且想要一种开始的方法 anchore/sbom操作 提供对容器图像和多种语言生态系统的支持。
要将构建工件与认证的SBOM关联,请执行以下步骤:
首先(就像来源一样),您需要为您的工作流授予认证存储的写入权限: 权限: id-token:写入 证明:写入 目录:读取
确保您实际拥有一个符合您特定需求的SBOM。 下面是一个使用 Anchore的Syft 要扫描生成目录,请执行以下操作: -用途:锚具/ sbom-action@v0 具有: 路径:/ 建造/ 格式:'spdx-json' 输出文件:'sbom.spdx.json'
最后,使用authest-sbom操作将生成的sbom文件内容包装在一个in-toto sbom谓词中,对其进行签名,将其与构建的工件关联,并将其发送到认证存储: -使用:操作/ 认证-sbom@v1 具有: subject-path:“bin/my-artifact.tar.gz” sbom-path:'sbom.spdx.json'
它是如何工作的
工件证明有助于降低部署和管理公钥基础设施的复杂性,而不是信任GitHub帐户的安全性。 我们通过用 暂时的 密钥对。 公钥附加到与生成系统的 工作负载标识 ,并且私钥永远不会离开进程内存,并且在签名后会立即丢弃。 这与其他依赖人类身份或长期密钥的签名方法不同。 我们认为证书吊销列表问题太大,无法有效使用,而且软件来源和签名的未来 通过工作负载标识 。方法如下:
当执行认证操作时,我们的Sigstore客户端请求 GitHub操作OIDC令牌 与该工作流运行关联。 然后,它创建一个密钥对并将公共部分发送给 富尔西奥 证书颁发机构,以及OIDC令牌。 如果是 公共存储库 ,Sigstore Public Good Instance的Fulcio签发证书 专用存储库 证书由GitHub的Fulcio内部实例颁发,确保没有客户信息离开GitHup。
当接收到令牌时,Fulcio验证令牌的签名,并铸造一个新的短期X.509证书,将公钥绑定到工作流的OIDC标识。
Fulcio将证书返回给在GitHub Actions中运行的客户端,该客户端计算主题工件的SHA-256摘要,并写出一个 toto语句 将主题绑定到 谓语 包含OIDC令牌声明中的数据。
客户端使用私钥在 DSSE签名信封 然后,它将私钥扔掉。 信封的签名被发送给TSA,以获得时间戳签名,这证明签名是在证书的10分钟有效期内生成的。
一切都被包装成 Sigstore束 并坚持使用GitHub的认证存储。 如果是 专用存储库 ,这就是流程的结束。 如果是 公共存储库 ,该证明被额外写入Sigstore公益诉讼,并于 雷科尔 项目的不可变账本。
在过去的几个月里,人工制品认证已经进入了早期访问预览阶段,我们对收到的早期反馈感到非常激动。
GitHub坚定不移地致力于使软件认证和工件完整性民主化。 在GitHub工作流中仅利用六行代码,标志着构建链安全中的一个转折点,这是我利用、体验并热情接受的一项举措。
-Victor Martinez Rubio//弹性首席工程师
GitHub现在是根证书颁发机构
当我们开始设计此功能的需求时,我们很快意识到我们希望用户能够在GitHub Actions上签署工件,然后对其进行验证 在任何地方 甚至离线。 公钥基础设施(PKI) 是复杂且高风险的,我们从客户和开源项目那里都听说他们想要一种签署方式 没有 必须建立PKI或管理可能泄露或丢失的秘密。 要做到这一点,我们首先需要将GitHub建立为签名软件的根证书颁发机构(CA),这样我们就可以拥有整个证书链。
2023年10月,我们与 X.509证书颁发机构 和 RFC 3161时间戳服务器 ,通过不同地域和角色的员工持有的法定人数的硬件令牌管理信任根。 信任根是通过来自 TUF项目 (我们是贡献者),CA和时间戳服务是Sigstore应用程序的实例。 中级证书存放在 Azure KeyVault托管HSM ,用于签署Sigstore Fulcio和Sigstore-Timestamp Authority颁发的叶证书。 签名证书自颁发之日起10分钟内有效,因此无需管理 证书吊销列表的复杂性 (CRL)。
Sigstore,公开和私下
为了与我们向企业客户和开源社区提供尖端功能的承诺保持一致,Artifact Attestions支持在两种基本模式下提供的相同用户体验,这取决于存储库的可见性。 对于 公共存储库 ,GitHub Actions生成的证明将写入Sigstore Public Good Instance,以在 不可变分类账 。对于 专用存储库 在 GitHub企业 计划中,证明被写入一个内部的、完全私有的数据库,而没有任何信息被写入公共分类账或日志。
更安全的未来
需要注意的是 来源本身并不能保证工件或构建过程的安全 .它是什么 做 要做的是创建一个防篡改的保证 执行 绝对是你 建造 ,可以阻止许多攻击向量。 维护强大的应用程序安全流程仍然至关重要,比如要求对所有补丁进行代码审查,以及及时应用依赖项更新。
换句话说:证明为您提供了一个不可伪造的书面线索,将给定工件与给定GitHub Actions工作流运行联系起来。 我们相信,这是现代信任模型的关键部分,此外,我们希望帮助实现文化向人们了解的转变 他们的软件组件来自哪里 .
工件认证将允许客户前所未有地了解其构建的软件工件的组成和使用情况,而这仅仅是一个开始。 我们将提供证明与构建过程相关的其他类型工件的能力,例如漏洞报告和 整体项目 的定义谓词类型。 寻找有关Kubernetes支持、发布新保证以及今年晚些时候更多令人兴奋的消息。
想了解更多关于GitHub如何减轻运送安全代码的压力的信息吗?
在 GitHub环球2024 ,我们将探索开发人员优先安全方面的前沿研究和最佳实践,以便您可以使用您已经熟悉和喜爱的工具来确保代码的安全。
我们的超级早鸟促销活动即将结束! 现在就买票。