©
本文档使用
php.cn手册 发布
在此页面上,您将看到公证服务体系结构的概述。
本文档假定您熟悉更新框架,但这里简要回顾一下 TUF 角色和相应的密钥层次结构:
根元数据文件,其中列出了根,目标,快照和时间戳公钥的 ID。客户端使用这些公钥来验证存储库中所有元数据文件的签名。这个密钥由一个集合所有者持有,并且应该保持离线和安全,比其他密钥更重要。
快照键签名快照元数据文件,文件枚举集合的根,目标和委托元数据文件的文件名,大小和散列值。该文件用于验证其他元数据文件的完整性。快照关键字由集合所有者/管理员持有,或由公证服务持有以便于多个协作者通过委派角色进行签名。
时间戳记密钥为时间戳记元数据文件签名,文件通过使任何特定元数据的到期时间最短并通过指定集合的最近快照的文件名,大小和散列来为集合提供新鲜度保证。它用于验证快照文件的完整性。时间戳密钥由公证服务持有,因此时间戳可以在服务器请求时自动重新生成,而不是要求集合所有者在每个时间戳到期之前联机。
目标键对目标元数据文件进行签名,目标元数据文件列出集合中的文件名,以及它们的大小和相应的散列值。该文件用于验证存储库某些或全部实际内容的完整性。它也用于通过委派角色将信任委托给其他协作者。目标键由集合所有者或管理员持有。
委托键为委托元数据文件签名,其中列出了集合中的文件名以及它们的大小和相应的散列。这些文件用于验证存储库某些或全部实际内容的完整性。它们还用于通过较低级别的委派角色将信任委托给其他协作者。委托密钥由集合所有者或管理员到集合协作者的任何人持有。
公证人客户从一个或多个(远程)公证服务中提取元数据。一些公证客户将把元数据推送到一个或多个公证服务。
公证服务由公证服务器组成,公证服务器存储和更新关联数据库中多个可信集合的签名 TUF 元数据文件,以及公证签名人,公证签名人存储私钥并为公证服务器签署元数据。下图说明了这种架构:
根,目标和(有时)快照元数据由客户端生成并签署,客户端将元数据上传到公证服务器。服务器负责:
确保上传的元数据有效,签名和自我一致
生成时间戳(有时是快照)元数据
存储并向客户提供任何可信收集的最新有效元数据
公证人签名人负责:
将使用 Javascript 对象签名和加密进行打包和加密的私人签名密钥存储在与公证服务器数据库分开的数据库中
每当公证服务器请求时使用这些密钥执行签名操作
下图说明了公证客户端,服务器和签署者之间的交互:
公证服务器可选择支持使用 JWT 令牌的客户端进行身份验证。这需要一个管理访问控制的授权服务器,以及来自该授权服务器的包含用于签署令牌的公钥的证书包。如果在公证服务器上启用令牌认证,则任何没有令牌的连接客户端将被重定向到授权服务器。有关更多信息,请参阅 Docker Registry v2身份验证的文档。
客户端将通过基于 HTTPS 的基本身份验证登录授权服务器,获取不记名令牌,然后在将来的请求中将令牌提供给公证服务器。
当客户端上传新的元数据文件时,公证服务器会针对任何以前的版本检查冲突,并验证上传的元数据的签名,校验和和有效性。
一旦所有上传的元数据都得到验证,公证服务器就会生成时间戳(也可能是快照)元数据。它将这个生成的元数据发送给公证签名者进行签名。
公证人签名人从其数据库中检索必要的加密私钥(如果有的话),解密密钥并使用它们签署元数据。如果成功,它将签名发送回公证服务器。
公证服务器是可信数据集状态的真实来源,将客户端上传的和服务器生成的元数据存储在 TUF 数据库中。生成的时间戳和快照元数据证明客户端上传的元数据文件是该受信任集合的最新信息。最后,公证服务器将通知客户他们的上传成功了。
客户端现在可以立即从服务器下载最新的元数据,使用仍然有效的持票人令牌进行连接。公证服务器只需要从数据库中获取元数据,因为没有元数据已经过期。在时间戳已过期的情况下,公证服务器将遍历整个序列,并在其中生成新时间戳,请求公证签名人签名,将新签名的时间戳存储在数据库中。然后它将这个新的时间戳以及剩余的元数据发送给请求客户端。
服务器和签名者都是针对公证服务的所有用户的潜在攻击媒介。客户端密钥也是潜在的攻击媒介,但并不一定针对所有的集合。本节讨论我们的架构是如何设计来处理妥协的。
在公证服务器遭到破坏的情况下,攻击者可直接访问存储在数据库中的元数据以及访问用于与公证人签名人进行通信的凭证,因此可以使用签署人持有的任何密钥访问任意签署操作。
拒绝服务 - 攻击者可以拒绝客户端请求并破坏或删除数据库中的元数据,从而阻止客户端下载或上传元数据。
恶意内容 - 攻击者可以为一个或多个可信集合创建,存储和提供任意元数据内容。但是,他们无权访问任何客户端密钥,如根,目标以及潜在的现有可信集合的快照密钥。只有那些从未见过可信集合的客户,以及没有任何形式固定信任的客户,可能会被诱骗下载并信任这些可信集合的恶意内容。之前与任何受信任集合进行交互或将其信任固定到集合的特定证书的客户端将立即检测到内容是恶意的,并且不会相信这些集合的任何根目标或(可能)快照元数据。
回滚,冻结,混合和匹配 - 攻击者可以请求公证签名者签署他们想要的任意时间戳(也许是快照)元数据。攻击者可以发起冻结攻击,并根据快照键是否可用,进行混合匹配攻击,直到目标文件到期。只要攻击者确保其恶意元数据的版本号高于任何客户端可能拥有的最新优质元数据的版本号,那么无论是否拥有固定信任的客户都将容易受到这些攻击。
请注意,时间戳和快照键不能在仅服务器折衷方案中受到影响,因此不需要按键轮换。例如,一旦服务器妥协被缓解,攻击者将无法生成有效的时间戳或快照元数据,并将其提供给恶意镜像。
如果公证签名者受到损害,攻击者可以访问存储在数据库中的所有(时间戳和快照)私钥。如果密钥存储在 HSM 中,他们将能够使用或删除 HSM 中的密钥来签署任意内容,但不能泄露私有资料。
拒绝服务 - 攻击者可能会拒绝所有公证服务器请求并破坏或删除数据库中的密钥(甚至从 HSM 中删除密钥),从而阻止公证服务器签名生成的时间戳或快照。
密钥泄漏 - 如果公证签名人使用数据库作为其后端,攻击者可以泄露所有(时间戳和快照)私人资料。请注意,攻击者的功能与公证服务器在签署任意元数据方面的功能相同,在这种情况下,重要的细节是关键循环将有必要从攻击中恢复。
用户持有和管理的密钥的安全取决于用户采取的措施。如果公证客户端 CLI 用于创建它们,则它们受密码保护,公证 CLI 不会提供以明文形式导出它们的选项。
用户可以选择适当的密码,并保护密钥免受离线强力攻击。
信任收集所有者/管理员的解密密钥的破坏程度取决于被破坏的密钥的类型和组合(例如,快照密钥和目标密钥,或者仅仅是目标密钥)。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
授权密钥 | 没有 | 没有 | 没有 |
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
授权密钥 | 有限,也许* | 有限,也许* | 有限,也许* |
*如果公证服务持有快照密钥并且攻击者拥有公证服务写入凭证,则他们可以有效访问快照和时间戳记密钥,因为服务器将为其生成并签署快照和时间戳记。
攻击者可以添加恶意内容,从集合中删除合法内容,并混合集合中的目标,但只能在密钥可以签名的特定代理角色中进行。根据对该角色的限制,他们可能会受限于他们可以修改的内容类型。他们还可以添加或删除其下的其他代表团键在键层次的功能(例如,如果DelegationKey2
在上面的密钥层次被泄露,也只是能够修改的能力DelegationKey4
和DelegationKey5
)。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
授权密钥,快照密钥 | 没有 | 没有 | 没有 |
攻击者无法访问由公证服务始终持有的时间戳密钥,并且无法设置恶意镜像。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
授权密钥,快照密钥 | 有限 | 有限 | 有限 |
公证服务始终保存时间戳记密钥。如果攻击者具有公证服务写入凭证,则他们可以有效访问时间戳记密钥,因为服务器将为其生成并签署时间戳记。
攻击者可以添加恶意内容,从集合中删除合法内容,并混合集合中的目标,但只能在密钥可以签名的特定代理角色中进行。根据对该角色的限制,他们可能会受限于他们可以修改的内容类型。他们还可以添加或删除其下的其他代表团键在键层次的功能(例如,如果DelegationKey2
在上面的密钥层次被泄露,也只是能够修改的能力DelegationKey4
和DelegationKey5
)。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
目标关键 | 没有 | 没有 | 没有 |
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
目标关键 | 也许* | 也许* | 有限,也许* |
*如果公证服务持有快照密钥并且攻击者拥有公证服务写入凭证,则他们可以有效访问快照和时间戳记密钥,因为服务器将为其生成并签署快照和时间戳记。
攻击者可以添加任何恶意内容,从集合中删除任何合法内容,并混合集合中的目标。他们还可以添加或删除任何顶级代表团键或角色的能力(例如Delegation1
,Delegation2
和Delegation3
在密钥层次结构图)。如果他们完全删除角色,他们会将信任链分解为较低的委派角色(例如Delegation4
,Delegation5
)。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
目标键,快照键 | 没有 | 没有 | 没有 |
攻击者无法访问由公证服务始终持有的时间戳密钥,并且无法设置恶意镜像。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
目标键,快照键 | 是 | 是 | 有限 |
公证服务始终保存时间戳记密钥。如果攻击者具有公证服务写入凭证,则他们可以有效访问时间戳记密钥,因为服务器将为其生成并签署时间戳记。
攻击者可以添加任何恶意内容,从集合中删除任何合法内容,并混合集合中的目标。他们还可以添加或删除任何顶级代表团键或角色的能力(例如Delegation1
,Delegation2
和Delegation3
在密钥层次结构图)。如果他们完全删除角色,他们会将信任链分解为较低的委派角色(例如Delegation4
,Delegation5
)。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
所有的钥匙 | 是 | 是 | 是 |
不需要其他密钥,因为攻击者可以随意旋转或全部旋转到他们生成的密钥。利用这些密钥,他们可以设置一个镜像来提供恶意数据 - 任何恶意数据,因为他们可以访问所有密钥。
密钥泄露 | 恶意内容 | 回滚,冻结,混合和匹配 | 拒绝服务 |
---|---|---|---|
所有的钥匙 | 是 | 是 | 是 |
*如果公证服务持有快照密钥并且攻击者拥有公证服务写入凭证,则他们甚至不必旋转快照和时间戳密钥,因为服务器将为其生成并签署快照和时间戳。
如果检测到根密钥泄露,则根密钥持有者应联系运行公证服务的人员手动反转对存储库的任何恶意更改,并立即旋转根密钥。这将创建存储库历史记录的分支,从而打破已下载任何恶意更改的现有客户端。
如果检测到目标密钥泄露,则根密钥持有者必须旋转已泄密的密钥并使用新密钥推送干净的一组目标。
如果检测到授权密钥泄露,则更高级别的密钥(例如,如果Delegation4
已被泄密,则Delegation2
;如果Delegation2
已泄密,则Targets
密钥)持有者必须旋转已泄密的密钥,并使用新密钥推送干净的一组目标。
如果检测到公证服务凭证泄密,则应立即更改凭证。