信任链

信任链

每当系统通知我有软件更新时,我都会定期更新系统。这是那些我信任它能正常工作而无需了解细节的事情之一,但最近我开始好奇:我怎么知道

  • 检查更新的过程是否只显示合法的更新?
  • 我收到并安装的更新不是恶意的吗?

我知道我有一组我自己通过 URL 指定的软件源,并且我是否信任这些源由我自己决定。但是一旦我指定了这些 URL,会发生什么?

从现在的常见情况来看,我怀疑这些来源的真实性是通过类似 HTTPS / SSL 的方式进行验证的,即我有一些经过某些机构验证的证书,这意味着我需要在某处安装可靠的根证书(可能它们随系统一起提供)。

此外,我猜测这些包是经过加密签名的,就像 GPG 或类似的一样。

这些假设正确吗?我在哪里可以检查使用的密钥/证书?我如何验证它们是否正确?我如何验证它们确实被使用了?是否有配置选项可以使该过程更加谨慎或不那么谨慎,它们的默认值是什么?是否存在已知的攻击,或者最近是否存在漏洞?我似乎记得不久前 Windows 也遇到过类似的问题。

我使用的是 12.04,但我假设这个问题可以得到更普遍的回答。

答案1

据我所知,没有 SSL/https,并且在您自己的计算机之外也没有认证机构。

要检查更新,您的计算机将联系您指定为源的服务器。它将使用普通 http 从这些服务器下载索引文件。此索引文件已签名,因此没有人可以为您提供错误的索引,但任何计算机都可以提供正确的文件,从而可以轻松使用镜像。

使用此索引,您的计算机将计算出需要下载哪些新软件包。同样,这些软件包将使用常规 http 检索。每个软件包的 md5 总和将与发布文件一起进行检查。此外,Ubuntu 官方存储库软件包也已签名。一些第三方来源可能有未签名的软件包(但仍使用 md5 检查),当发生这种情况时,安装程​​序(apt、Ubuntu 软件中心等)将向您发出警告。

总结一下,安全不在于服务器或连接,而在于软件包本身。入侵更新服务器的攻击者无法损坏您的计算机,但能够获得有效签名的人却可以。

您可以在 Secure APT 的解释中找到更多详细信息这里总结一下:所有软件包都有 GPG 签名,apt 信任那些由公钥在 apt 钥匙串中的人员发布的软件包 ( /etc/apt/trusted.gpg)

答案2

这是个好问题。答案(当然)相当复杂,但让我试着为您分解一下。我们先来看看技术流程:

信任链

我们不使用 SSL 来保护 APT,而是使用加密哈希(目前是 SHA256)和 OpenPGP 签名。这样您就可以信任不受信任的镜像,而不必信任 CA PKI。

当您将存储库添加到 APT 时sources.list,您还必须使用命令将其 PGP 密钥添加到 APT 的受信任密钥环apt-key。密钥环附带了 Ubuntu 存储库的密钥。当您使用命令apt-add-repository添加 PPA 时,它会为您添加密钥(通过 SSL 从 Launchpad 获取)。

信任链是:

  1. 每个sources.list条目将 APT 指向Release存储库中的一个文件,并带有Release.gpg签名(或者可以将它们组合为一个InRelease文件)。此文件描述了存储库,并且必须由 APT 密钥环中的密钥签名。
  2. Release文件包含所有PackagesSources文件的加密哈希值。这些列出了存储库中可用的所有软件包和版本。
  3. Packages和文件Sources包含每个包的加密哈希值。
  4. 软件包本身没有签名。这是不必要的,它们有一个信任链,从发布文件开始,由镜像签名。但是,用于构建二进制软件包的源软件包是由上传它们的开发人员用 PGP 签名的。

您可以在以下位置阅读有关存储库格式的更多信息Debian 维基

这个链意味着我们不必信任任何中间镜像,我们可以相信我们安装的包与签署 Release 文件时存在的包相同。

您可以通过运行来检查 APT 的密钥环sudo apt-key finger

验证 Ubuntu 的存档密钥

您怎么知道那里应该有什么?如果您不信任您的计算机,您就不能相信它上面的任何程序不会欺骗您(例如apt-key),而这种做法是徒劳的。因此,让我们假设这只是出于学术兴趣,并从最终源包中验证密钥环的内容,该源包由上传它的开发人员进行 PGP 签名。

下载ubuntu-keyring源包,并查看其中的内容:

$ apt-get source ubuntu-keyring
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Need to get 20.0 kB of source archives.
Get:1 http://localhost/ubuntu/ quantal/main ubuntu-keyring 2012.05.19 (dsc) [1542 B]
Get:2 http://localhost/ubuntu/ quantal/main ubuntu-keyring 2012.05.19 (tar) [18.5 kB]
Fetched 20.0 kB in 0s (0 B/s)               
dpkg-source: info: extracting ubuntu-keyring in ubuntu-keyring-2012.05.19
dpkg-source: info: unpacking ubuntu-keyring_2012.05.19.tar.gz
$ gpg --verify ubuntu-keyring_2012.05.19.dsc
gpg: Signature made Sat May 19 03:33:12 2012 SAST
gpg:                using RSA key 0x393587D97D86500B
gpg: Good signature from "Colin Watson <[email protected]>"
gpg:                 aka "Colin Watson <[email protected]>"
gpg:                 aka "Colin Watson <[email protected]>"
gpg:                 aka "Colin Watson <[email protected]>"
$ gpg --no-default-keyring --keyring ubuntu-keyring-2012.05.19/keyrings/ubuntu-archive-keyring.gpg --fingerprint
ubuntu-keyring-2012.05.19/keyrings/ubuntu-archive-keyring.gpg
-------------------------------------------------------------
pub   1024D/0x40976EAF437D05B5 2004-09-12
      Key fingerprint = 6302 39CC 130E 1A7F D81A  27B1 4097 6EAF 437D 05B5
uid                            Ubuntu Archive Automatic Signing Key <[email protected]>
sub   2048g/0x251BEFF479164387 2004-09-12

pub   1024D/0x46181433FBB75451 2004-12-30
      Key fingerprint = C598 6B4F 1257 FFA8 6632  CBA7 4618 1433 FBB7 5451
uid                            Ubuntu CD Image Automatic Signing Key <[email protected]>

pub   4096R/0x3B4FE6ACC0B21F32 2012-05-11
      Key fingerprint = 790B C727 7767 219C 42C8  6F93 3B4F E6AC C0B2 1F32
uid                            Ubuntu Archive Automatic Signing Key (2012) <[email protected]>

pub   4096R/0xD94AA3F0EFE21092 2012-05-11
      Key fingerprint = 8439 38DF 228D 22F7 B374  2BC0 D94A A3F0 EFE2 1092
uid                            Ubuntu CD Image Automatic Signing Key (2012) <[email protected]>

我知道那实际上是 Colin Watson 的签名,因为我见过他几次,我们互相验证过身份,并签署过对方的密钥。如果你有 PGP 强密钥集的密钥,你应该能够找到一条通往他的信任路径。我还知道我可以信任他上传正确的ubuntu-keyring软件包。

对于 Debian,有一个软件包 ( debian-keyring) 包含所有 Debian 开发人员的 PGP 密钥,您可以使用它来验证源软件包签名。Ubuntu 没有等效软件包,但许多 Ubuntu 开发人员也是 Debian 开发人员,我们所有开发人员的 PGP 密钥都可以在 Launchpad 中的个人资料中找到。

其他问题

我如何知道更新不是恶意的?

归根结底是信任。您必须完全信任您使用的每个存储库。您授予每个存储库的维护者以 root 身份在您的计算机上运行程序的权限。

Ubuntu 软件包只能由获得以下机构授予上传权限的 Ubuntu 开发人员上传:开发者会员委员会(我目前任职于该组织)。要申请上传权,您必须得到几位与您合作过的现有 Ubuntu 开发人员的支持,并且他们相信您有能力独立工作。如果没有上传权,则上传必须由拥有上传权的开发人员赞助(这应该包括对上传内容的审核)。

对于发布后的更新,Ubuntu 有严格的政策更新内容。它们应该只包含最小的补丁来修复已知的错误。补丁在被接受之前会由 SRU/安全团队的成员进行审查。

显然,PPA 和第三方存储库没有所有这些限制。你必须相信 PPA 所有者是明智的。

所有 Ubuntu 和 PPA 软件包都有可用源代码,因此任何人都可以检查。

是否存在使流程更谨慎或更不谨慎的配置选项,以及它们的默认值是什么?

您可以在 APT 中关闭签名验证,但默认情况下它是打开的。当您尝试从未签名/不受信任的存储库中安装某些内容时,apt 会让您确认您确实要这样做。

是否存在已知的攻击,或者最近是否存在漏洞?

我记得有一个Debian 错误 499897。Debian 通过为 Release 文件指定一个到期日期来解决这个问题,到期之后这些文件将不再受信任。Ubuntu尚不支持

答案3

相关答案:除了检查包签名的真实性之外,您还可以更进一步,使用 Landscape 的合规性报告功能验证系统是否完全更新了最新的适用安全补丁。

这是一个即时更新的饼状图,显示有多少系统和哪些系统仍然易受攻击。对于个人来说,这可能有点过分,但对于大型企业和小型企业来说,这是一个常见问题解答。

相关内容