🐾 猫头虎博主来啦!今天我们深入探讨开源软件的一大优势:可重现性。搜索词条:完美可重现、经过验证的Go工具链。在Go 1.21版本中,我们迎来了首个具有完美可重现构建的Go工具链,这一进步对于加强供应链安全至关重要。让我们一起揭开Go工具链可重现性背后的神秘面纱吧!
尽管开源软件允许任何人阅读源代码,但大多数软件,即使是开源软件,也以编译后的二进制形式下载,这些形式更难以检查。为了应对潜在的供应链攻击,使开源软件构建可重现变得至关重要。Go 1.21是首个实现完美可重现构建的Go工具链,这是一个重要的里程碑。
计算机通常是确定性的,但许多构建工具却无意中纳入了我们通常不会意识到的相关输入。为了实现可重现的构建,每个相关输入都必须是可配置的,并且二进制文件必须与明确列出的配置一起发布。
从Go 1.21开始,Go工具链变得完美可重现:其唯一相关的输入是该构建的源代码。我们消除了许多相关输入,包括主机C工具链、动态链接器、源代码目录、主机操作系统和主机架构等。
Go 1.10引入了一个内容感知的构建缓存,它根据构建输入的指纹来决定目标是否是最新的,而不是依赖于文件修改时间。
我们为了简化可重现构建和工具链管理,在Go 1.20中去除了更多相关输入,例如主机C工具链。
Go 1.21完全消除了剩余的相关输入,实现了完美的可重现性。这包括彻底移除主机C工具链和动态链接器作为相关输入。
我们不仅要制作一次可重现的Go工具链,还要确保它们持续保持可重现性,并且其他人也能轻松地复制这一过程。我们现在在可信的Linux/x86-64系统和Windows/x86-64系统上构建所有Go发行版。这两个系统必须产生逐位相同的存档,否则我们不会继续发布。
通过重现Ubuntu的golang-1.21
包,我们证明了即使打包者使用不同的配置或其他更改来编译,Go工具链的易于重现性也使得重现其二进制文件变得简单。
可重现构建是加强开源供应链安全的重要工具。像SLSA这样的框架关注于软件的来源和监管链,用于通知关于信任的决策。可重现构建则是通过提供验证该信任是否得当的方式来补充这种方法。理想情况下,
所有以二进制形式分发的开源软件都应该拥有易于重现的构建。在实践中,正如我们在这篇文章中看到的,非预期输入很容易渗透到构建中。有关如何使您自己的软件构建可重现的更多信息,可以参考可重现构建项目。
本文已被猫头虎的Go生态洞察专栏收录,详情点击这里。