目录搜索
ComposeAbout versions and upgrading (Compose)ASP.NET Core + SQL Server on Linux (Compose)CLI environment variables (Compose)Command-line completion (Compose)Compose(组成)Compose command-line reference(组合命令行参考)Control startup order (Compose)Django and PostgreSQL (Compose)Docker stacks and distributed application bundles (Compose)docker-compose build(docker-compose构建)docker-compose bundledocker-compose configdocker-compose createdocker-compose downdocker-compose eventsdocker-compose execdocker-compose helpdocker-compose imagesdocker-compose killdocker-compose logsdocker-compose pausedocker-compose portdocker-compose psdocker-compose pulldocker-compose pushdocker-compose restartdocker-compose rmdocker-compose rundocker-compose scaledocker-compose startdocker-compose stopdocker-compose topdocker-compose unpausedocker-compose upEnvironment file (Compose)Environment variables in ComposeExtend services in ComposeFrequently asked questions (Compose)Getting started (Compose)Install ComposeLink environment variables (deprecated) (Compose)Networking in ComposeOverview of Docker ComposeOverview of docker-compose CLIQuickstart: Compose and WordPressRails and PostgreSQL (Compose)Sample apps with ComposeUsing Compose in productionUsing Compose with SwarmEngine.NET Core application (Engine)About images, containers, and storage drivers (Engine)Add nodes to the swarm (Engine)Apply custom metadata (Engine)Apply rolling updates (Engine)apt-cacher-ngBest practices for writing Dockerfiles (Engine)Binaries (Engine)Bind container ports to the host (Engine)Breaking changes (Engine)Build your own bridge (Engine)Configure container DNS (Engine)Configure container DNS in user-defined networks (Engine)CouchDB (Engine)Create a base image (Engine)Create a swarm (Engine)Customize the docker0 bridge (Engine)Debian (Engine)Default bridge networkDelete the service (Engine)Deploy a service (Engine)Deploy services to a swarm (Engine)Deprecated Engine featuresDocker container networking (Engine)Docker overview (Engine)Docker run reference (Engine)Dockerfile reference (Engine)Dockerize an applicationDrain a node (Engine)EngineFAQ (Engine)Fedora (Engine)Get started (Engine)Get started with macvlan network driver (Engine)Get started with multi-host networking (Engine)How nodes work (Engine)How services work (Engine)Image management (Engine)Inspect the service (Engine)Install Docker (Engine)IPv6 with Docker (Engine)Join nodes to a swarm (Engine)Legacy container links (Engine)Lock your swarm (Engine)Manage nodes in a swarm (Engine)Manage sensitive data with Docker secrets (Engine)Manage swarm security with PKI (Engine)Manage swarm service networks (Engine)Migrate to Engine 1.10Optional Linux post-installation steps (Engine)Overview (Engine)PostgreSQL (Engine)Raft consensus in swarm mode (Engine)Riak (Engine)Run Docker Engine in swarm modeScale the service (Engine)SDKs (Engine)Select a storage driver (Engine)Set up for the tutorial (Engine)SSHd (Engine)Storage driver overview (Engine)Store service configuration data (Engine)Swarm administration guide (Engine)Swarm mode key concepts (Engine)Swarm mode overlay network security model (Engine)Swarm mode overview (Engine)Understand container communication (Engine)Use multi-stage builds (Engine)Use swarm mode routing mesh (Engine)Use the AUFS storage driver (Engine)Use the Btrfs storage driver (Engine)Use the Device mapper storage driver (Engine)Use the OverlayFS storage driver (Engine)Use the VFS storage driver (Engine)Use the ZFS storage driver (Engine)Engine: Admin GuideAmazon CloudWatch logs logging driver (Engine)Bind mounts (Engine)Collect Docker metrics with Prometheus (Engine)Configuring and running Docker (Engine)Configuring logging drivers (Engine)Control and configure Docker with systemd (Engine)ETW logging driver (Engine)Fluentd logging driver (Engine)Format command and log output (Engine)Google Cloud logging driver (Engine)Graylog Extended Format (GELF) logging driver (Engine)Journald logging driver (Engine)JSON File logging driver (Engine)Keep containers alive during daemon downtime (Engine)Limit a container's resources (Engine)Link via an ambassador container (Engine)Log tags for logging driver (Engine)Logentries logging driver (Engine)PowerShell DSC usage (Engine)Prune unused Docker objects (Engine)Run multiple services in a container (Engine)Runtime metrics (Engine)Splunk logging driver (Engine)Start containers automatically (Engine)Storage overview (Engine)Syslog logging driver (Engine)tmpfs mountsTroubleshoot volume problems (Engine)Use a logging driver plugin (Engine)Using Ansible (Engine)Using Chef (Engine)Using Puppet (Engine)View a container's logs (Engine)Volumes (Engine)Engine: CLIDaemon CLI reference (dockerd) (Engine)dockerdocker attachdocker builddocker checkpointdocker checkpoint createdocker checkpoint lsdocker checkpoint rmdocker commitdocker configdocker config createdocker config inspectdocker config lsdocker config rmdocker containerdocker container attachdocker container commitdocker container cpdocker container createdocker container diffdocker container execdocker container exportdocker container inspectdocker container killdocker container logsdocker container lsdocker container pausedocker container portdocker container prunedocker container renamedocker container restartdocker container rmdocker container rundocker container startdocker container statsdocker container stopdocker container topdocker container unpausedocker container updatedocker container waitdocker cpdocker createdocker deploydocker diffdocker eventsdocker execdocker exportdocker historydocker imagedocker image builddocker image historydocker image importdocker image inspectdocker image loaddocker image lsdocker image prunedocker image pulldocker image pushdocker image rmdocker image savedocker image tagdocker imagesdocker importdocker infodocker inspectdocker killdocker loaddocker logindocker logoutdocker logsdocker networkdocker network connectdocker network createdocker network disconnectdocker network inspectdocker network lsdocker network prunedocker network rmdocker nodedocker node demotedocker node inspectdocker node lsdocker node promotedocker node psdocker node rmdocker node updatedocker pausedocker plugindocker plugin createdocker plugin disabledocker plugin enabledocker plugin inspectdocker plugin installdocker plugin lsdocker plugin pushdocker plugin rmdocker plugin setdocker plugin upgradedocker portdocker psdocker pulldocker pushdocker renamedocker restartdocker rmdocker rmidocker rundocker savedocker searchdocker secretdocker secret createdocker secret inspectdocker secret lsdocker secret rmdocker servicedocker service createdocker service inspectdocker service logsdocker service lsdocker service psdocker service rmdocker service scaledocker service updatedocker stackdocker stack deploydocker stack lsdocker stack psdocker stack rmdocker stack servicesdocker startdocker statsdocker stopdocker swarmdocker swarm cadocker swarm initdocker swarm joindocker swarm join-tokendocker swarm leavedocker swarm unlockdocker swarm unlock-keydocker swarm updatedocker systemdocker system dfdocker system eventsdocker system infodocker system prunedocker tagdocker topdocker unpausedocker updatedocker versiondocker volumedocker volume createdocker volume inspectdocker volume lsdocker volume prunedocker volume rmdocker waitUse the Docker command line (Engine)Engine: ExtendAccess authorization plugin (Engine)Docker log driver pluginsDocker network driver plugins (Engine)Extending Engine with pluginsManaged plugin system (Engine)Plugin configuration (Engine)Plugins API (Engine)Volume plugins (Engine)Engine: SecurityAppArmor security profiles for Docker (Engine)Automation with content trust (Engine)Content trust in Docker (Engine)Delegations for content trust (Engine)Deploying Notary (Engine)Docker security (Engine)Docker security non-events (Engine)Isolate containers with a user namespace (Engine)Manage keys for content trust (Engine)Play in a content trust sandbox (Engine)Protect the Docker daemon socket (Engine)Seccomp security profiles for Docker (Engine)Secure EngineUse trusted imagesUsing certificates for repository client verification (Engine)Engine: TutorialsEngine tutorialsNetwork containers (Engine)Get StartedPart 1: OrientationPart 2: ContainersPart 3: ServicesPart 4: SwarmsPart 5: StacksPart 6: Deploy your appMachineAmazon Web Services (Machine)Digital Ocean (Machine)docker-machine activedocker-machine configdocker-machine createdocker-machine envdocker-machine helpdocker-machine inspectdocker-machine ipdocker-machine killdocker-machine lsdocker-machine provisiondocker-machine regenerate-certsdocker-machine restartdocker-machine rmdocker-machine scpdocker-machine sshdocker-machine startdocker-machine statusdocker-machine stopdocker-machine upgradedocker-machine urlDriver options and operating system defaults (Machine)Drivers overview (Machine)Exoscale (Machine)Generic (Machine)Get started with a local VM (Machine)Google Compute Engine (Machine)IBM Softlayer (Machine)Install MachineMachineMachine CLI overviewMachine command-line completionMachine concepts and helpMachine overviewMicrosoft Azure (Machine)Microsoft Hyper-V (Machine)Migrate from Boot2Docker to MachineOpenStack (Machine)Oracle VirtualBox (Machine)Provision AWS EC2 instances (Machine)Provision Digital Ocean Droplets (Machine)Provision hosts in the cloud (Machine)Rackspace (Machine)VMware Fusion (Machine)VMware vCloud Air (Machine)VMware vSphere (Machine)NotaryClient configuration (Notary)Common Server and signer configurations (Notary)Getting started with NotaryNotary changelogNotary configuration filesRunning a Notary serviceServer configuration (Notary)Signer configuration (Notary)Understand the service architecture (Notary)Use the Notary client
文字

在此页面上,您将看到公证服务体系结构的概述。

TUF 密钥和角色简要概述

本文档假定您熟悉更新框架,但这里简要回顾一下 TUF 角色和相应的密钥层次结构:

根元数据文件,其中列出了根,目标,快照和时间戳公钥的 ID。客户端使用这些公钥来验证存储库中所有元数据文件的签名。这个密钥由一个集合所有者持有,并且应该保持离线和安全,比其他密钥更重要。

  • 快照键签名快照元数据文件文件枚举集合的根,目标和委托元数据文件的文件名,大小和散列值。该文件用于验证其他元数据文件的完整性。快照关键字由集合所有者/管理员持有,或由公证服务持有以便于多个协作者通过委派角色进行签名。

  • 时间戳记密钥为时间戳记元数据文件签名,文件通过使任何特定元数据的到期时间最短并通过指定集合的最近快照的文件名,大小和散列来为集合提供新鲜度保证。它用于验证快照文件的完整性。时间戳密钥由公证服务持有,因此时间戳可以在服务器请求时自动重新生成,而不是要求集合所有者在每个时间戳到期之前联机。

  • 目标键对目标元数据文件进行签名,目标元数据文件列出集合中的文件名,以及它们的大小和相应的散列值。该文件用于验证存储库某些或全部实际内容的完整性。它也用于通过委派角色将信任委托给其他协作者。目标键由集合所有者或管理员持有。

  • 委托键为委托元数据文件签名,其中列出了集合中的文件名以及它们的大小和相应的散列。这些文件用于验证存储库某些或全部实际内容的完整性。它们还用于通过较低级别的委派角色将信任委托给其他协作者。委托密钥由集合所有者或管理员到集合协作者的任何人持有。

架构和组件

公证人客户从一个或多个(远程)公证服务中提取元数据。一些公证客户将把元数据推送到一个或多个公证服务。

公证服务由公证服务器组成,公证服务器存储和更新关联数据库中多个可信集合的签名 TUF 元数据文件,以及公证签名人,公证签名人存储私钥并为公证服务器签署元数据。下图说明了这种架构:

根,目标和(有时)快照元数据由客户端生成并签署,客户端将元数据上传到公证服务器。服务器负责:

  • 确保上传的元数据有效,签名和自我一致

  • 生成时间戳(有时是快照)元数据

  • 存储并向客户提供任何可信收集的最新有效元数据

公证人签名人负责:

  • 将使用 Javascript 对象签名和加密进行打包和加密的私人签名密钥存储在与公证服务器数据库分开的数据库中

  • 每当公证服务器请求时使用这些密钥执行签名操作

示例客户端 - 服务器 - 签名者交互

下图说明了公证客户端,服务器和签署者之间的交互:

  1. 公证服务器可选择支持使用 JWT 令牌的客户端进行身份验证。这需要一个管理访问控制的授权服务器,以及来自该授权服务器的包含用于签署令牌的公钥的证书包。如果在公证服务器上启用令牌认证,则任何没有令牌的连接客户端将被重定向到授权服务器。有关更多信息,请参阅 Docker Registry v2身份验证的文档。

  1. 客户端将通过基于 HTTPS 的基本身份验证登录授权服务器,获取不记名令牌,然后在将来的请求中将令牌提供给公证服务器。

  1. 当客户端上传新的元数据文件时,公证服务器会针对任何以前的版本检查冲突,并验证上传的元数据的签名,校验和和有效性。

  1. 一旦所有上传的元数据都得到验证,公证服务器就会生成时间戳(也可能是快照)元数据。它将这个生成的元数据发送给公证签名者进行签名。

  1. 公证人签名人从其数据库中检索必要的加密私钥(如果有的话),解密密钥并使用它们签署元数据。如果成功,它将签名发送回公证服务器。

  1. 公证服务器是可信数据集状态的真实来源,将客户端上传的和服务器生成的元数据存储在 TUF 数据库中。生成的时间戳和快照元数据证明客户端上传的元数据文件是该受信任集合的最新信息。最后,公证服务器将通知客户他们的上传成功了。

  1. 客户端现在可以立即从服务器下载最新的元数据,使用仍然有效的持票人令牌进行连接。公证服务器只需要从数据库中获取元数据,因为没有元数据已经过期。在时间戳已过期的情况下,公证服务器将遍历整个序列,并在其中生成新时间戳,请求公证签名人签名,将新签名的时间戳存储在数据库中。然后它将这个新的时间戳以及剩余的元数据发送给请求客户端。

威胁模型

服务器和签名者都是针对公证服务的所有用户的潜在攻击媒介。客户端密钥也是潜在的攻击媒介,但并不一定针对所有的集合。本节讨论我们的架构是如何设计来处理妥协的。

公证服务器妥协

在公证服务器遭到破坏的情况下,攻击者可直接访问存储在数据库中的元数据以及访问用于与公证人签名人进行通信的凭证,因此可以使用签署人持有的任何密钥访问任意签署操作。

  • 拒绝服务 - 攻击者可以拒绝客户端请求并破坏或删除数据库中的元数据,从而阻止客户端下载或上传元数据。

  • 恶意内容 - 攻击者可以为一个或多个可信集合创建,存储和提供任意元数据内容。但是,他们无权访问任何客户端密钥,如根,目标以及潜在的现有可信集合的快照密钥。只有那些从未见过可信集合的客户,以及没有任何形式固定信任的客户,可能会被诱骗下载并信任这些可信集合的恶意内容。之前与任何受信任集合进行交互或将其信任固定到集合的特定证书的客户端将立即检测到内容是恶意的,并且不会相信这些集合的任何根目标或(可能)快照元数据。

  • 回滚,冻结,混合和匹配 - 攻击者可以请求公证签名者签署他们想要的任意时间戳(也许是快照)元数据。攻击者可以发起冻结攻击,并根据快照键是否可用,进行混合匹配攻击,直到目标文件到期。只要攻击者确保其恶意元数据的版本号高于任何客户端可能拥有的最新优质元数据的版本号,那么无论是否拥有固定信任的客户都将容易受到这些攻击。

请注意,时间戳和快照键不能在仅服务器折衷方案中受到影响,因此不需要按键轮换。例如,一旦服务器妥协被缓解,攻击者将无法生成有效的时间戳或快照元数据,并将其提供给恶意镜像。

公证签署人妥协

如果公证签名者受到损害,攻击者可以访问存储在数据库中的所有(时间戳和快照)私钥。如果密钥存储在 HSM 中,他们将能够使用或删除 HSM 中的密钥来签署任意内容,但不能泄露私有资料。

  • 拒绝服务 - 攻击者可能会拒绝所有公证服务器请求并破坏或删除数据库中的密钥(甚至从 HSM 中删除密钥),从而阻止公证服务器签名生成的时间戳或快照。

  • 密钥泄漏 - 如果公证签名人使用数据库作为其后端,攻击者可以泄露所有(时间戳和快照)私人资料。请注意,攻击者的功能与公证服务器在签署任意元数据方面的功能相同,在这种情况下,重要的细节是关键循环将有必要从攻击中恢复。

公证客户端密钥和凭证妥协

用户持有和管理的密钥的安全取决于用户采取的措施。如果公证客户端 CLI 用于创建它们,则它们受密码保护,公证 CLI 不会提供以明文形式导出它们的选项。

用户可以选择适当的密码,并保护密钥免受离线强力攻击。

信任收集所有者/管理员的解密密钥的破坏程度取决于被破坏的密钥的类型和组合(例如,快照密钥和目标密钥,或者仅仅是目标密钥)。

由于证书受损,可能发生的攻击:

只有解密的授权密钥

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

授权密钥

没有

没有

没有

解密授权密钥+公证服务可写入凭证

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

授权密钥

有限,也许*

有限,也许*

有限,也许*

*如果公证服务持有快照密钥并且攻击者拥有公证服务写入凭证,则他们可以有效访问快照和时间戳记密钥,因为服务器将为其生成并签署快照和时间戳记。

攻击者可以添加恶意内容,从集合中删除合法内容,并混合集合中的目标,但只能在密钥可以签名的特定代理角色中进行。根据对该角色的限制,他们可能会受限于他们可以修改的内容类型。他们还可以添加或删除其下的其他代表团键在键层次的功能(例如,如果DelegationKey2在上面的密钥层次被泄露,也只是能够修改的能力DelegationKey4DelegationKey5)。

仅解密的委托密钥+解密的快照密钥

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

授权密钥,快照密钥

没有

没有

没有

攻击者无法访问由公证服务始终持有的时间戳密钥,并且无法设置恶意镜像。

解密的授权密钥+解密的快照密钥+公证服务可写入的凭证

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

授权密钥,快照密钥

有限

有限

有限

公证服务始终保存时间戳记密钥。如果攻击者具有公证服务写入凭证,则他们可以有效访问时间戳记密钥,因为服务器将为其生成并签署时间戳记。

攻击者可以添加恶意内容,从集合中删除合法内容,并混合集合中的目标,但只能在密钥可以签名的特定代理角色中进行。根据对该角色的限制,他们可能会受限于他们可以修改的内容类型。他们还可以添加或删除其下的其他代表团键在键层次的功能(例如,如果DelegationKey2在上面的密钥层次被泄露,也只是能够修改的能力DelegationKey4DelegationKey5)。

仅解密目标密钥

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

目标关键

没有

没有

没有

解密目标密钥+公证服务可写入凭证

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

目标关键

也许*

也许*

有限,也许*

*如果公证服务持有快照密钥并且攻击者拥有公证服务写入凭证,则他们可以有效访问快照和时间戳记密钥,因为服务器将为其生成并签署快照和时间戳记。

攻击者可以添加任何恶意内容,从集合中删除任何合法内容,并混合集合中的目标。他们还可以添加或删除任何顶级代表团键或角色的能力(例如Delegation1Delegation2Delegation3在密钥层次结构图)。如果他们完全删除角色,他们会将信任链分解为较低的委派角色(例如Delegation4Delegation5)。

仅解密目标密钥+解密的快照密钥

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

目标键,快照键

没有

没有

没有

攻击者无法访问由公证服务始终持有的时间戳密钥,并且无法设置恶意镜像。

解密目标密钥+解密快照密钥+公证服务可写入凭据

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

目标键,快照键

有限

公证服务始终保存时间戳记密钥。如果攻击者具有公证服务写入凭证,则他们可以有效访问时间戳记密钥,因为服务器将为其生成并签署时间戳记。

攻击者可以添加任何恶意内容,从集合中删除任何合法内容,并混合集合中的目标。他们还可以添加或删除任何顶级代表团键或角色的能力(例如Delegation1Delegation2Delegation3在密钥层次结构图)。如果他们完全删除角色,他们会将信任链分解为较低的委派角色(例如Delegation4Delegation5)。

解密的根密钥+无或仅解密的密钥的任何组合

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

所有的钥匙

不需要其他密钥,因为攻击者可以随意旋转或全部旋转到他们生成的密钥。利用这些密钥,他们可以设置一个镜像来提供恶意数据 - 任何恶意数据,因为他们可以访问所有密钥。

已解密的根密钥+无或已解密密钥的任意组合+公证服务可写入凭证

密钥泄露

恶意内容

回滚,冻结,混合和匹配

拒绝服务

所有的钥匙

*如果公证服务持有快照密钥并且攻击者拥有公证服务写入凭证,则他们甚至不必旋转快照和时间戳密钥,因为服务器将为其生成并签署快照和时间戳。

缓解措施

如果检测到根密钥泄露,则根密钥持有者应联系运行公证服务的人员手动反转对存储库的任何恶意更改,并立即旋转根密钥。这将创建存储库历史记录的分支,从而打破已下载任何恶意更改的现有客户端。

如果检测到目标密钥泄露,则根密钥持有者必须旋转已泄密的密钥并使用新密钥推送干净的一组目标。

如果检测到授权密钥泄露,则更高级别的密钥(例如,如果Delegation4已被泄密,则Delegation2;如果Delegation2已泄密,则Targets密钥)持有者必须旋转已泄密的密钥,并使用新密钥推送干净的一组目标。

如果检测到公证服务凭证泄密,则应立即更改凭证。

上一篇:下一篇: