1

我需要阻止所有注册表并只允许一个私有注册表供 docker 从中提取图像,这如何在 docker 中本地完成。

4

2 回答 2

2

使用 RedHat 选项将无法在上游 Docker CE 或 EE 引擎上运行,RedHat 已经分叉了 docker 引擎并添加了自己不兼容的功能。您还会发现 /etc/sysconfig/docker 是一个仅限 RedHat 的配置文件,旨在与他们的启动脚本版本一起使用。

开箱即用的官方 Docker 引擎目前不支持对注册表服务器的硬限制。您可以在出站连接上使用防火墙规则来实现这一点,但这很容易失败,除非您只允许出站连接到已知的白名单。即使您设法在网络级别实现这一点,它也不会阻止某人从 tar 文件导入图像,甚至构建与其他注册服务器上的图像相同的图像。

相反,Docker 的方法是使用 Notary/Content Trust 对图像标签/清单进行加密签名,以验证它来自已知来源。无论图像是如何在 docker 主机上拉取、加载或构建的,这都会处理图像。在 Docker CE 中,这是从客户端选项强制执行的,因此可以轻松禁用它(尽管 Docker CE 中直接访问您的 docker 套接字的客户端可以做的不仅仅是运行公共映像,它们实际上是您的主持人)。有一些工具可以插入 docker 引擎的 authz 接口,包括 Twistlock 和 Open Policy Agent,但我不知道它们是否允许您强制执行 Content Trust。

使用 Docker EE,该选项很容易在服务器端启用。UCP 中有一个开关可以强制运行具有可信签名的图像。最大的缺点是我完成的每个 docker install 都需要使用来自外部源的图像,比如 Docker Hub。要使用这些图像,您现在需要从该环境之外提取它们,并将它们推送到您自己的注册表,并使用您自己的凭据对其进行签名。维护起来很头疼。

除了令人头疼的维护之外,我看到很少有人使用此选项锁定 Docker EE,还有一个原因:它违背了 DevOps 的所有目标,即允许开发人员在不需要操作人员批准的情况下管理他们的工具集。如果他们想从 Java 8 切换到 Java 9,开发人员应该很容易实现,并且操作人员关心的应该是生成的镜像内部是否存在漏洞,而不是用于创建它的基础镜像。

于 2019-01-23T14:30:01.567 回答
1

刚刚在 redhat 文档中找到:

这可以在 docker daemon config 上完成:

/etc/sysconfig/docker

BLOCK_REGISTRY='--block-registry=all'
ADD_REGISTRY='--add-registry=registry.access.redhat.com'

然后做:

systemctl restart docker
于 2019-01-23T13:55:40.287 回答