apt-key的Ubuntu 手册页包含以下说明apt-key add
:
注意:不应使用此命令,应将密钥环直接放在 /etc/apt/trusted.gpg.d/ 目录中,并使用描述性名称和“gpg”或“asc”作为文件扩展名。
我想我在其他任何地方都没有看到过这个建议。大多数托管自己的存储库的项目都说要下载他们的密钥文件并将其添加到apt-key
.
- 这个建议背后的动机是什么?
- 这是 Ubuntu 主义,还是适用于任何基于 APT 的发行版?
apt-key的Ubuntu 手册页包含以下说明apt-key add
:
注意:不应使用此命令,应将密钥环直接放在 /etc/apt/trusted.gpg.d/ 目录中,并使用描述性名称和“gpg”或“asc”作为文件扩展名。
我想我在其他任何地方都没有看到过这个建议。大多数托管自己的存储库的项目都说要下载他们的密钥文件并将其添加到apt-key
.
这些项目的说明已过时。我知道这一点是因为我发布了一个 Debian 存储库,并且当我发现 Debian 9 APT 中的更改时我更新了我的说明。事实上,这部分手册现在已经过时了,因为它是错误的目录。
这实际上与
.d
目录无关,更多的是与防止 APT 中的跨站点漏洞有关。为了方便起见,旧系统使用单独的密钥环文件,但现在这是安全的必要条件;你的安全。这就是漏洞。考虑两个存储库发布者 A 和 B。在 Debian 8 及之前的世界中,两个发布者的密钥都放在用户机器上的单个全局密钥环中。如果发布者 A 能够以某种方式安排取代发布者 B 的存储库 WWW 站点,那么 A 可以发布使用 A 自己的密钥签名的破坏性包, APT 会很乐意接受并安装它。毕竟,A 的密钥对于所有存储库都是全局可信的。
缓解措施是让用户为各个发布者使用单独
Signed-By
的密钥环,并在其存储库定义中使用单独的设置引用这些密钥环。具体来说,发布者 A 的密钥仅用于Signed-By
存储库 A 的密钥,而发布者 B 的密钥仅用于Signed-By
存储库 B 的存储库由发布者 A 的密钥而不是发布者 B 的密钥签名。手头的
/etc/apt/trusted.gpg.d
机制是一个年长的穷人从 2005 年左右开始,在这方面有点缺陷,这还不够好。它将密钥环设置在一个单独的文件中,以便它可以像任何其他文件一样被包管理器打包和安装(或使用fetch
/curl
/下载)。wget
(包管理器处理阻止发布者 A 的特殊this-is-my-repository-keyring包安装在发布者 B 上,以通常处理包之间的文件冲突的正常方式。)但它仍然将其添加到密钥集中这对所有存储库都是全球信任的。现在存在的完整机制在/usr/share/keyrings/
.我的指示已经在那里了。☺ 正在采取措施将 Debian 自己的存储库移至此机制,以便它们也不再使用全局受信任的密钥。您可能想对您找到的那些“大多数项目”说一句话。毕竟,他们目前正在指示您将您机器上对 APT 的全局访问权限移交给他们。
进一步阅读
/etc/apt/trusted.gpg.d/
. Debian 错误 #861695。sources.list
条目应该有指向特定键的签名选项。Debian 错误 #877012。apt-key del
接受keyid
,这是密钥的无意义哈希。如果您可以使用有意义的名称卸载密钥,那就更简单了……比如文件名。
正如 JdeBP 所说,这与作为 debian 包的一部分安装的受信任的密钥文件很好地配合。我认为手动安装密钥文件也会更好。
在目前处于“初步测试”阶段的新机制中,这一点被进一步简化。您只需删除/禁用一件事:存储库(在 sources.list / sources.list.d 中)。这将自动停止允许为该存储库配置的密钥(除非它也被另一个存储库使用)。
我不知道如何利用新的安全机制。我只是假设如果我使用他们的包裹,我需要信任某人。包安装过程仍在运行
root
:-)。