openSUSE:软件包源代码验证

跳转到:导航搜索

软件包源码验证

为什么

Open Build Service 和 openSUSE 发行版项目(Tumbleweed 和 Leap)由来自众多上游站点数千个软件包组成。

通常,软件是“善意”打包的,依赖于上游不在其软件发布中添加恶意代码。然而,偶尔也有黑客试图在发布的软件压缩包中植入后门。

由于在常规软件包集成过程中,我们很难甚至不可能审查上游压缩包中的所有更改,因此我们希望依赖上游社区提供某种形式的完整性保证。最合适的成熟方法是使用 GPG(GNU Pretty Good Privacy)对发布的压缩包进行签名。

大量项目已经这样做,以便为我们提供一种自动检查这些签名的方式。

包含验证的源码

GPG 签名和 GPG 密钥环包含在源码软件包中,并列在其来源中。

例如,查看 GNU Hello(RPM 软件包“hello”)

Source0:  http://ftp.gnu.org/pub/gnu/hello/hello-%{version}.tar.gz
Source1:  http://ftp.gnu.org/pub/gnu/hello/hello-%{version}.tar.gz.sig
Source2:  %{name}.keyring

给定的源码 URL 必须有效,并且该文件也必须作为本地副本包含在 OBS 仓库中。这是因为当软件包提交到 Factory 时,源码文件将被重新下载并与上传的版本进行验证。

如果您希望重命名源码文件,请使用以下 URL 语法(其中文件上传到 OBS 命名为“some-other-name-%{version}.tar.gz”)

Source0:  http://ftp.gnu.org/pub/gnu/hello/hello-%{version}.tar.gz#/some-other-name-%{version}.tar.gz

不包含验证的源码

如果源码 URL 不再存在(“已失效”)或在上传之前需要修改压缩包,只需在“Source:”标签中列出软件包的名称。请务必留下评论,说明您上次从哪里检索到该文件或如何重新创建修改后的压缩包。

# URL no longer exists, last downloaded from http://example.com/mypackage-v0.5.9.tar.xz on 22 Nov 2016
Source:  mypackage-v%{version}.tar.xz

创建 .keyring 文件

为了创建密钥环文件,您必须导入与用于签名发布密钥相对应的公钥。

密钥环应从可靠的来源(通常是网站)检索。如果可能,请在 .spec 文件中的 Source 行上方注释您获取它的 URL。

您还可以验证该密钥是否在 GPG 信任网络中并链接到更多帐户,尽管这通常是不存在的。

非常重要的是,此密钥来自可信来源,不是恶意密钥——请在验证时务必谨慎。

密钥环的任何更改都应记录在软件包的 .changes 文件中,以避免被恶意密钥替换。

密钥环文件可以是 GPG 可以导入的任何内容,例如导出的公钥环。常见的 mypackage.asc 可以直接复制到 mypackage.keyring

请不要将其与例如 mypackage-version.tar.gz.asc 混淆,后者将包含 PGP 签名,而不是 PGP 公钥块。一个例子是 ModemManager,我们可以看到文件 0xAECE0239C6606AD5.asc,其中包含 ModemManager 的最新公钥 PGP 密钥,当前(2022-11)。在同一目录下,我们可以看到许多 .asc 文件,例如 ModemManager-1.18.12.tar.xz.asc,它对应于不带 .asc 扩展名的同名压缩包,在本例中为 ModemManager-1.18.12.tar.xz

如果可能,请使用来自软件提供商的确切副本,并在 spec 文件中指定下载 URL 或位置,类似于 Sources 标签。

如果您从 GPG 密钥服务器下载公钥,请验证它是否真的是正确的密钥,然后使用

$ gpg --export -a KEYID > mypackage.keyring

在源码标签中验证签名(推荐)

由于构建过程需要时间来检查,并且还将 GnuPG 拉入构建依赖项中,因此我们已在“source_validator”服务(在“obs-service-source_validator”RPM 中)中实现了签名检查。

该服务不仅在软件包检查期间运行,还由 factory bot 检查脚本运行。该脚本检查与源码目录中的 %name.keyring 文件匹配的签名。它可以处理压缩包的 .asc 和 .sig(n) 扩展名。

如果签名验证失败,则检查或提交将被拒绝。

您可以使用以下命令在本地运行它:

$ osc service runall source_validator

代码位于 obs-service-source_validator RPM 软件包中,位于脚本 /usr/lib/obs/service/source_validators/25-keyring-validate