问题描述
在开发过程中,我们需要在内部网络中构建和生成Docker镜像,并将其部署到多台主机上(开发者、内部测试、外部测试等)。其中一些主机位于内部网络,另一些主机可被第三方访问,位于互联网上。
最终部署将在客户内部网络的多个节点上进行(生产环境、不同的测试阶段)。这些节点位于防火墙后,不定期允许访问内部网络外部的内容。因此,有些节点可以通过外部镜像仓库进行部署,而另一些节点则不能,必须通过某种奇怪的软件上传工具手动传送镜像。
我们希望能够在互联网上拥有一个镜像仓库(最好不是自己在某个虚拟机上运行的),可以存储加密的镜像(最好是GPG或类似的加密方式,而不是简单的密码)。但同时也需要能够通过某种简单的手动上传机制进行部分内容的交付。由于客户非常谨慎,保持端到端的加密非常重要。
是否有一个工具可以完美处理这个问题?一种解决方案是将整个镜像仓库镜像到客户端内部网络上的专用主机上,以保持加密的部分完整。
希望能够找到一个标准的解决方案,最好是一个现成的、轻量级的、已经建立并稳定的解决方案,而不是自己拼凑。
编辑(标题编辑):类似于Portus提供的广泛权限方案是一个很好的起点,但我更希望实现实际镜像的端到端加密。客户非常谨慎,在开始使用Docker、云服务等方面刚刚起步。
解决方案
请注意以下操作可能因版本差异或存在风险,执行前务必备份并谨慎操作。
方案1
Google Container Registry 是一个潜在的选择,可以在Docker中实现端到端的镜像加密并在离线通道上传输。以下是具体步骤:
1. 创建一个 Google Cloud Platform(GCP) 账号,如果已有账号则跳过此步骤。
2. 登录到 GCP 控制台,并导航到 Container Registry 部分。
3. 创建一个新的私有镜像仓库。
4. 配置镜像仓库的权限,确保只有需要的用户或团队能够访问。
5. 构建和上传加密的 Docker 镜像至该仓库。
通过使用 Google Container Registry,你可以实现以下特性来保障镜像的安全传输和存储:
– 镜像层在 Google Cloud Storage 桶中存储,由 Google 进行 RSA 加密,并可以使用客户端密钥(RSA)进行额外加密。
– 对于存储在 GCS 桶中的每个单独对象,可以进行精细的访问控制。
– 使用 OAuth2 进行客户端端的身份验证,通过配置 Docker 使用 Google Cloud SDK 作为凭据管理器来强制执行。
– 镜像通过 SSL 连接进行拉取。
此外,由于镜像仓库是 Google Cloud Platform 的一部分,你还可以利用 GCP 提供的功能,例如设置反向代理服务器(reverse-proxy)并通过 GCP 防火墙来限制特定 IP 地址(如客户端办公室)只能访问 443 端口。
方案2
你还可以考虑使用 Senetas 的 crypto-cli
工具,它可以在推送和拉取镜像时对容器进行加密和解密。你可以按照以下步骤来使用该工具:
1. 访问 https://github.com/Senetas/crypto-cli 下载并安装 crypto-cli
工具。
2. 使用 crypto-cli
对需要上传的镜像进行加密。
3. 将加密的镜像推送到你的私有仓库。
4. 在目标主机上使用 crypto-cli
进行解密并运行镜像。
这个工具可以帮助你实现镜像的加密和解密,确保在传输和存储过程中保持端到端的加密。
方案3
如果你希望自己构建一个私有镜像仓库并实现端到端的加密,你可以考虑以下步骤:
1. 使用一个私有镜像仓库工具,如 Docker Registry 或 Harbor,搭建一个内部的镜像仓库。
2. 配置镜像仓库的权限和访问控制,确保只有授权的用户能够上传和拉取镜像。
3. 使用 GPG 或类似的加密工具对镜像进行加密,确保镜像在上传前被加密。
4. 在上传镜像之前,将加密的镜像文件上传至内部仓库。
这个方案需要你进行一些额外的配置和管理工作,但可以实现自定义的端到端加密方案。
请注意,无论哪种解决方案,都需要对你的客户进行适当的培训和指导,以确保他们正确地使用加密和解密工具,以及保持镜像传输和存储的安全性。
无论选择哪个方案,都需要根据你的具体