繁体   English   中英

在Docker构建期间如何使用机密?

[英]How can I use secrets during docker build?

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

我研究了Docker机密,但似乎它只能在部署(例如docker-compose)中工作,而不能解决以下问题:如果项目无法访问Docker中的私有nuget服务器,则该项目无法在docker build映像中构建为了恢复软件包。

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

充其量,您可以在群集模式下运行初始容器,但要限制在构建节点上运行。 除了将绑定卷绑定到主机上的目录之外,该容器还可以安装秘密。 从该容器中,您可以将秘密从安全秘密中复制到主机目录(docker将保护您的秘密安全,但是没有什么可以阻止您自己对该秘密进行不安全的操作)。 复制密钥后,就可以将密钥作为构建arg运行。

不幸的是,由于您现在正在将机密写入磁盘,并将该机密作为构建过程的一部分,因此我不会考虑任何这种安全性。

通常,我更喜欢只将机密信息从构建中取出,然后使用生成的数据执行构建,因此您不需要构建本身内部的秘密。 例如,不要从具有登录凭据的容器内部提取私有代码存储库,而应从docker外部的存储库中提取,然后使用生成的代码存储库进行构建。 这也是一个多阶段构建可以在注入秘密值的情况下完成某些工作,然后将结果复制到没有任何秘密的映像中的地方。 构建主机将在某些阶段的某些层中具有秘密,但在推送到注册表服务器的最后阶段的任何层中均不会具有秘密。

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

  1. 从协调器中提取加密的机密,例如:

    Kubernetes的秘密

    Docker Swarm的秘密

  2. Hashicorp保险库

  3. 在容器中安装Ansible并使用Ansible保管库提取秘密

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM