RPM - 签名后修改包

RPM - modifying the package after signing

我们使用 RPM 包来将我们的产品部署到客户的环境中。为了使 RPM 完全 self-contained,我们 'personalize' RPM 以适应特定客户的环境。这样,客户只需要安装RPM,无需按照任何向导编辑配置文件。

我的问题如下: 我们在对 RPM 包进行个性化之前对其进行签名。个性化过程涉及将信息附加到 RPM 文件(没有真正添加 RPM headers,只是附加原始数据)。此修改(自然)破坏了包的签名。

我正在寻找的是一个让我在不破坏签名的情况下修改文件的技巧。

这是我目前尝试过的方法:

  1. 包的'lead'部分包含可以使用的保留字节,但它的大小非常有限且不可扩展。
  2. 添加扩展文件属性 - 非常好用,但复制文件时属性消失(有特殊标志保留属性,但我们不能强制使用它们)。
  3. 我们想在 RPM 中插入一个虚拟 header 并欺骗 RPM 代码不检查它,但仍然不确定该怎么做。
  4. 在进行个性化后签署包裹 - 也不可扩展,因为这意味着我们需要为每个客户签署包裹而不是一次。

请注意,我知道签名应该防止修改文件的内容(它的行为符合预期)。然而,我真的不想修改 RPM 数据,只是在文件中包含额外的信息。

有什么想法吗?

谢谢!

第 5 个选择是制作一个包含您的更改并依赖于签名包的包。您是否签署您的 包裹当然取决于它是如何分发的。

如果您的包修改了原始 RPM 中的文件,您可以通过使 %pre%preun 脚本将原始文件重命名为备份版本来解决这个问题(文件名的使用冲突),并且添加一个符号 link 到你的替换。这确实会干扰验证原始包内容,但您的修改应该是您可以根据具体情况进行验证的内容。

如果您真的必须在保留现有签名的同时修改 *.rpm,则将标签添加到签名 header,最好使用十进制 ~275 到 999 之间的标签编号。现有签名明文(header-only 和 header+payload) 不会受到签名 header.

中附加 tags/data 的影响

请注意,较新版本的 RPM 已被迫显式枚举标签、类型和数据,以防止通过模糊测试发现段错误。但即使在那种情况下,也有一个填充标记(内存中的 0x3fffffff)可以填充额外的数据。再次 -- iirc -- 最新版本的 rpm 也验证填充全部为 0x00,所以买者自负。

同时您还没有描述 "personalization" 是什么,任何添加到签名 header 的标签都将在安装包时被丢弃。另请注意,在 *.rpm 中重写签名 header 的代码有点棘手,因为填充以确保签名 header 之后的元数据 header 是 8 字节对齐的。

我建议您会发现包含 "personalization" 的附加文件是更好的工程方法。黑客的艺术是知道何时停止 ;-)

Signing the package AFTER the personalization has taken place - also not scalable because it means we need to sign the package for each customer instead of just once.

为什么这不能缩放?仅仅因为 rpmsign 要你输入密码?看 obs 标志 https://en.opensuse.org/openSUSE:Build_Service_Signer (在 Suse、Fedora 和 Epel 中可用)。它能够自动签名并保持安全。