仓库列表安全吗?有HTTPS版本吗?

软件仓库更新安全吗?

作为一个开发者,我是个蠢笨的熊,无法理解为什么仓库列表是http://security.ubuntu.com,而其他列在/etc/apt/sources.list中的网站都是http(不安全的)。没有证书链匹配的话,这看起来就像是“向任何响应者请求要更新的软件包列表”而不是“向ubuntu.com网站请求...”

任何网络都可以选择伪造更新站点吗?这是一种常见做法,以提供本地缓存和经过验证的副本吗?

3个回答

2022年更新:现在仓库主机/镜像通常支持HTTPS,因此您可以使用它来提供额外的保证,以增强APT所提供的安全性。请阅读下文,了解为什么仅仅使用HTTPS不足以保护您,以及为什么APT添加了自己的加密安全性。


简而言之,没有HTTPS也可以有安全性,因为所有的软件包都经过加密签名,并且APT会验证这些签名。
APT系统是一种安全的打包解决方案,软件包使用只有Ubuntu和APT知道的密钥进行签名,APT使用APT密钥环上的公钥对软件包的签名进行验证。这有效地提供了端到端的保证,即无论您是从官方Ubuntu服务器还是其他镜像获取的软件包,该软件包都未被Ubuntu以外的任何人修改过。
Ubuntu的存储库系统(作为Debian的一部分)的构建方式使您不必信任所使用的镜像,只需确保其未对通过分发内部签名的软件包进行修改。这允许存储库实现去中心化,并允许任何志愿者设置一个镜像。
例如,您可以将example.com作为一个镜像使用 - 如果您使用HTTPS并验证您是否真正在与example.com通信,这并不提供有用的信息,比如该镜像是否经过您的分发版(Ubuntu)批准,或者该镜像是否在从Ubuntu获取软件包后修改它们以添加病毒,它只告诉您确实在与example.com通信。但是APT内置的签名验证提供了这些保证。
这是一个关于如何工作的技术解释,可以在Ubuntu(以及使用相同系统的Debian)上找到。
APT可以通过HTTPS工作,并且您可以在APT源条目中使用HTTPS来为您的连接提供另一层保证(如果您使用的存储库支持)。这可以作为APT的额外保障,尤其是现在对HTTPS连接增加的额外开销的担忧已经不那么相关了。
使用HTTPS的理由:
不使用HTTPS可能会引起隐私问题,因为窃听者可以看到您正在下载的文件,尽管从历史上来看,隐私并没有被认为是一个问题,因为这些文件是公开可用的,并且APT的验证仍然可以检测到修改。尽管如此,使用HTTPS可以使攻击者更难看到您正在安装什么。
APT的签名机制无法提供的另一个保证是您收到的软件包是最新版本。为了减轻这个问题,签名的发布文件中包含一个“Valid-Until”日期字段,该字段之后引用的文件应被视为过时。在此有效期内,中间人或恶意镜像可能会替换存档,并使用存档的早期未修改版本延迟软件包的更新。但他们不能对软件包进行任意修改,也不能回到过去超过该时间点。
您考虑使用HTTPS的另一个原因是防止APT自身签名和验证的缺陷。过去已经发现并修复了这方面的漏洞。

1太好了!简而言之,传输层不安全,但每个数据包都有签名。没有可靠的可用更新和补丁列表,并且不能保证已存在的安全问题会得到修复。 - Charles Merriam
2不确定你所说的“没有可用更新的安全列表”是什么意思,但发布文件和软件包列表确实是经过签名的。只是它不验证你的镜像是否是最新的。 - thomasrutter
3嗯,如果无法验证一个镜像或主站是否为最新状态,那就无法知道是否存在可用的更新,无论是安全更新还是其他类型的更新。也就是说,没有一个安全的可用更新列表。 - Charles Merriam
但这与HTTP vs HTTPS有什么关系呢?通过HTTPS连接到镜像站点如何证明它是最新的?我不明白你想表达什么意思。 - thomasrutter
7Alice运行Ubuntu。Bob控制着Alice的互联网连接。由于每个软件包都有签名,Bob无法将恶意软件包放入Alice的安装中。在Ubuntu中发现了一个严重的安全漏洞。Alice试图找到更新的软件包,但是Bob从Alice的更新检查中删除了所有与该软件包相关的信息。Alice狠狠地敲打了一位系统管理员,然后通过HTTPS从ubuntu.com获取了更新检查,以验证她连接的是真实的网站,并且连接是安全的。现在Alice看到了安全更新,而Bob无法隐藏它。 - Charles Merriam
1经过一番查找,我发现签名的发布文件中包含一个叫做"Valid-Until"的到期日期,旨在防止这种情况发生 - APT将拒绝信任已过期的发布文件,除非您使用-o Acquire::Check-Valid-Until=false告诉它(这是一个有用的命令,如果您要测试APT的旧版本快照或者强制APT使用一个陈旧、过时的镜像)。这将限制Bob在有效日期内不被察觉地提供陈旧软件包的能力。 - thomasrutter
嗯..一个很好的改善方案。完全晦涩。谢谢。 - Charles Merriam
1如果更新列表的任何部分被Bob遗漏或更改,Alice在运行apt get时会看到一个错误。要么是“无法检索”或者来自篡改列表的gpg错误。哦,顺便说一下,即使你使用的镜像不是最新的,也没有http://security.ubuntu.com的镜像,如果你检查/etc/apt/sources.list文件的内容,你会看到这个URL。这样,安全更新始终是最新的,无论镜像是否是最新的。 - mchid
嗯...嗯,Alice无法访问security.ubuntu.com。这不是镜像问题;Bob控制着Alice的网络连接。根据@thomasrutter的说法,Alice最终会看到一个快照已过期的警告。 - Charles Merriam
@CharlesMerriam 与其使用https,dnscrypt会更加有效。 - mchid
5这当然是正确的答案。但我觉得奇怪的是,似乎没有人担心窃听者会编制一个列表,列出你按顺序安装的所有软件包,包括你更新过哪些和未更新过哪些,以便针对这些软件包中已知的安全漏洞进行攻击。 - Teekin
1我不明白为什么他们不想将其设置为https。无论是否有很大的差别,支持https都是微不足道的。如果他们愿意,甚至可以使用Caddy来更轻松地实现。https://caddyserver.com/ 与此问题的辩论所花费的精力比简单设置https还要多。 - rotten
大多数主要的镜像服务器现在已经支持它了。这个决定取决于各个镜像服务器。大多数人都能找到一个附近支持https的镜像服务器。请注意,这个答案是在2013年写的。从那时起,全球范围内https变得更加普遍。 - thomasrutter
重播攻击怎么办?攻击者可以提供一个由Ubuntu签名的旧版本易受攻击的软件包。 - Aaron Franke

这里的最佳答案显然已经过时。自那以后,由于软件包验证出现漏洞,apt已经发现了2个严重的远程代码执行漏洞。安全公告{{link1:here}}和{{link2:here}}。
这比有关隐私/信息泄漏和陈旧软件包版本的担忧要糟糕得多;它使任意代码执行为root成为可能,完全失去了安全性。而事实是:如果使用https而不是http就可以防止这些攻击。
这证明了defence in depth原则在这里适用于任何其他地方。许多声称https在apt上下文中提供无或极少的安全益处的说法简直是错误的,因为这些漏洞已经表明了这一点。
问题在于,https的安全益处是否值得以缓存、增加的开销等为代价。我不能回答这个问题,但至少我认为Ubuntu / Canonical / Launchpad应为他们的库提供可选的https端点。

7安全也涉及到隐私,而HTTPS意味着攻击者至少会更难确定您正在运行的软件包和版本。 - l0b0
我要说的是,只要apt本身没有问题,http就可以了。然而,https提供了备份,以防gpg安全性(或者更准确地说,它如何使用)出现问题。 - RoundDuckMan
我认为,即使他们试图降低传输量,从而通过HTTP公开更大的下载,至少Torrent和校验和/哈希(.md5等)应该通过HTTPS安全地公开。 这样我们就有一种方法可以根据从可信源(身份)获得的参考进行验证我们所下载的内容。 目前看来似乎并不安全... :S - brezniczky
1我对这个问题了解不够深入,所以请原谅任何不准确之处,但是“在你看到之前,网络上的其他人可以读取或修改网站,使你面临风险”显然是不可接受的,尤其是当结果是一个操作系统镜像时。https://blog.mozilla.org/security/2017/01/20/communicating-the-dangers-of-non-secure-http/ - brezniczky

重要补充:实际上,作为在线升级和初始安装下载,它需要大量的流量,而这些流量的来源,即二进制和文本代码流,是可复制的。因此,在互联网上存在着大量的网关和缓存设备来处理这些流量。为了节省出口带宽,相当多的ISP建立了基于HTTP协议的缓存,而HTTPS协议无法作为透明缓存存在。
另一个原因是基于HTTP的镜像程序更简单,不需要验证TLS-SSL证书,也不需要担心证书失效或Web服务器配置问题。
在不久前,大约20年前,互联网初期,HTTPS和互联网流量仍然非常昂贵。因此,HTTP还包括接近过时的FTP协议作为在线软件包分发的主要传送方式。
同样,微软的Windows和Office也是通过HTTP进行升级的。你可以观察到通常不是从微软服务器下载的安装包,而是你的ISP的自建缓存服务器。