【问题标题】:How can I use secrets during docker build?如何在 docker build 期间使用秘密?
【发布时间】:2018-02-12 19:13:09
【问题描述】:

我正在处理一个需要访问安全 NuGet 服务器的项目,这意味着它需要用户凭据。在开发过程中,我们只需运行几个 nuget 命令即可将这些凭据存储在本地计算机上。在构建服务器上,这些相同的命令在构建之前使用加密的值运行,以便它们可以安全地存储在构建配置中。现在的问题是,当从该项目构建新的 docker 镜像时,该 docker build 镜像将需要这些相同的值才能在容器中构建项目。如何以安全的方式将这些值放入 docker build 映像?

我查看了 docker 机密,但它似乎只适用于部署(例如 docker-compose),这并不能解决如果项目无法访问私有项目,则无法在 docker build 映像中构建的问题nuget 服务器以恢复软件包。

【问题讨论】:

    标签: .net docker


    【解决方案1】:

    Docker 机密仅在 Swarm 模式服务中可用。 Docker 将它们存储在 swarm 管理器的数据库中,不能在 swarm 模式外部使用。 docker build 在 swarm 模式之外运行,并且没有选项可以在 swarm 模式内运行构建。您也不会在构建中获得卷安装,这会在以后发生。

    充其量,您可以在 swarm 模式下运行一个初始容器,并在构建节点上运行一个约束。除了绑定挂载卷到主机上的目录之外,该容器还可以挂载机密。从该容器中,您可以将安全机密中的机密复制到主机目录中(docker 将确保您的机密安全,但没有什么能阻止您自己使用该机密做不安全的事情)。将密钥复制出来后,您可以使用密钥作为构建 arg 运行构建。

    不幸的是,我不认为这些安全措施是安全的,因为您现在正在将机密写入磁盘,并将该机密作为构建过程的一部分包含在内。

    通常我更喜欢只在构建外部提取秘密,然后使用生成的数据执行构建,这样您就不需要构建本身内部的秘密。例如。与其使用登录凭据从容器内部提取私有代码仓库,不如从 docker 外部的仓库中提取,然后使用生成的代码仓库进行构建。这也是多阶段构建可以通过注入秘密值完成一些工作,然后将结果复制到没有任何秘密的图像的地方。构建主机在某些阶段的某些层中会有秘密,但在推送到注册服务器的最终阶段的任何层中都没有。

    【讨论】:

    • 啊,我没有考虑过。我想我基本上会将构建作为“发布”进行,然后更改 dockerfile 以将这些工件复制到图像上的应用程序目录中。这样,外部构建环境负责保守这些秘密。 AppVeyor 为这些东西提供了一个加密工具,在本地,它只是普通的全局凭据,它们也被加密了。我会试试看。
    【解决方案2】:

    在构建时在 Docker 映像中烘焙/嵌入机密是不安全的,并且会导致映像不可移植。相反,我建议以下更安全的方式:

    1. 从编排器中提取加密的秘密,例如:

      Kubernetes secrets

      Docker Swarm secrets

    2. Hashicorp Vault

    3. 在容器中安装 Ansible 并使用 Ansible vault 提取机密

    4. 从受信任的证书颁发机构提取机密

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 2018-04-19
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多