内容信任代表 | Delegations for content trust (Engine)
内容信任代表团
Docker引擎支持将targets/releases
委派用作可信图像标记的标准来源。
使用此委托可让您与其他发布者协作,而不共享您的存储库密钥,这是您的目标和快照密钥的组合。有关更多信息,请参阅管理内容信任的密钥)。合作者可以保留自己的授权密钥。
该targets/releases
委托当前是一项可选功能 - 为了设置委派,您必须使用公证CLI:
- 下载客户端并确保它在您的路径上可用
~/.notary/config.json
使用以下内容创建配置文件:
{ "trust_dir" : "~/.docker/trust", "remote_server": { "url": "https://notary.docker.io" } }
这告诉公证Docker内容信任数据的存储位置,以及在Docker Hub中使用用于图像的公证服务器。
有关如何在默认Docker Content Trust用例外使用公证的更多详细信息,请参阅公证CLI文档。
请注意,使用公证客户端发布和列出委托更改时,您的Docker Hub凭据是必需的。
生成授权密钥
您的协作者需要生成私钥(RSA或ECDSA)并为您提供公钥,以便将其添加到targets/releases
委派中。
他们生成这些密钥的最简单方法是使用OpenSSL。以下是如何生成2048位RSA部分密钥的示例(所有RSA密钥必须至少为2048位):
$ openssl genrsa -out delegation.key 2048
Generating RSA private key, 2048 bit long modulus
....................................................+++
............+++
e is 65537 (0x10001)
他们应该保持delegation.key
私密 - 这是他们将用于签署标签的内容。
然后他们需要生成一个包含公钥的x509证书,这是他们会给你的。这是生成CSR(证书签名请求)的命令:
$ openssl req -new -sha256 -key delegation.key -out delegation.csr
然后他们可以将它发送给您信任的任何CA来签署证书,或者他们可以自行签署证书(在本示例中,创建有效期为1年的证书):
$ openssl x509 -req -sha256 -days 365 -in delegation.csr -signkey delegation.key -out delegation.crt
然后他们需要给你delegation.crt
,无论是自签名还是由CA签署。
将授权密钥添加到现有存储库
如果您的存储库是使用1.11之前的Docker Engine版本创建的,那么在添加任何代理之前,应该将快照密钥轮换到服务器,以便协作者不需要您的快照密钥来签署和发布代码:
$ notary key rotate docker.io/<username>/<imagename> snapshot -r
这会告诉公证员为您的特定图像存储库轮换一个密钥 - 请注意,您必须包含docker.io/
前缀。snapshot -r
指定要特别旋转快照键,并且希望服务器对其进行管理(-r
代表“远程”)。
在添加委派时,您必须使用您希望委派给协作者的公钥来获取PEM编码的x509证书。
假设您有证书delegation.crt
,您可以为该用户添加一个委派,然后发布委派更改:
$ notary delegation add docker.io/<username>/<imagename> targets/releases delegation.crt --all-paths
$ notary publish docker.io/<username>/<imagename>
前面的示例说明了将委派添加targets/releases
到图像存储库的请求(如果它不存在)。请务必使用targets/releases
- 公证员支持多个委派角色,因此如果您错误地输入委派名称,公证人CLI将不会出错。但是,Docker引擎仅支持从中读取targets/releases
。
它还将协作者的公钥添加到委托中,targets/releases
只要他们拥有与此公钥对应的私钥,就可以对委派进行签名。该--all-paths
标志告诉公证员不要限制可以登录的标签名称targets/releases
,这是我们强烈建议的targets/releases
。
发布更改会告诉服务器关于targets/releases
委派的更改。
发布后,查看委派信息以确保您正确地将密钥添加到targets/releases
:
$ notary delegation list docker.io/<username>/<imagename>
ROLE PATHS KEY IDS THRESHOLD
---------------------------------------------------------------------------------------------------------------
targets/releases "" <all paths> 729c7094a8210fd1e780e7b17b7bb55c9a28a48b871b07f65d97baf93898523a 1
你可以看到targets/releases
它的路径和刚刚添加的密钥ID。
公证人目前不会将协作者名称映射到密钥,因此我们建议您一次添加并列出一个委托密钥,并在需要删除协作者时自己将密钥ID映射到协作者。
从现有存储库中删除委派密钥
要撤消协作者为图片存储库签署标签的功能,您需要从targets/releases
代表团中删除其密钥。要做到这一点,你需要他们的钥匙的ID。
$ notary delegation remove docker.io/<username>/<imagename> targets/releases 729c7094a8210fd1e780e7b17b7bb55c9a28a48b871b07f65d97baf93898523a
Removal of delegation role targets/releases with keys [729c7094a8210fd1e780e7b17b7bb55c9a28a48b871b07f65d97baf93898523a], to repository "docker.io/<username>/<imagename>" staged for next publish.
撤销将在您发布后立即生效:
$ notary publish docker.io/<username>/<imagename>
请注意,通过删除targets/releases
委派中的所有关键字,委派(以及任何登录到它的标记)都将被删除。这意味着这些标签将全部被删除,并且您最终可能会使用由目标键直接签名的较旧的旧版标签。
完全从存储库中删除委派targets/releases
如果您确定代表团不适合您,您可以targets/releases
完全删除代表团。targets/releases
但是,这也会删除当前所有的标签,并且最终可能会使用由目标键直接签名的较旧的旧标签。
要删除targets/releases
委派:
$ notary delegation remove docker.io/<username>/<imagename> targets/releases
Are you sure you want to remove all data for this delegation? (yes/no)
yes
Forced removal (including all keys and paths) of delegation role targets/releases to repository "docker.io/<username>/<imagename>" staged for next publish.
$ notary publish docker.io/<username>/<imagename>
推动可信数据成为合作者
作为已添加到存储库targets/releases
委派中的私钥的协作者,您需要将您生成的私钥导入到Content Trust中。
为此,您可以运行:
$ notary key import delegation.key --role user
delegation.key
包含您的PEM编码私钥的文件在哪里?
完成之后docker push
,在targets/releases
代理中运行的包含密钥的任何存储库都将使用此导入的密钥自动对标签进行签名。
docker push 行为
当docker push
使用Docker Content Trust 运行时,如果Docker Engine存在,它将尝试签署并推送该代码targets/releases
。如果没有,则如果密钥可用,则使用目标密钥来签署标签。
docker pull和docker build行为
在运行Docker Content Trust docker pull
或docker build
Docker Content Trust时,Docker Engine将只提取由targets/releases
代理角色签名的标签或直接用targets
密钥签名的旧版代码。
相关信息
- Docker中的内容信任
- 管理内容信任的密钥
- 内容信任的自动化
- 在内容信任沙箱中播放