我正在使用需要访问安全NuGet服务器的项目,这意味着它需要用户信誉。在开发过程中,我们只需运行几个nuget命令即可将这些信息存储在本地计算机上。在构建服务器上,这些命令在构建之前使用加密的值运行,以便可以安全地存储在构建配置中。现在的问题是,当从该项目构建新的docker镜像时,该docker构建镜像将需要相同的值才能在容器中构建项目。如何以安全的方式将这些值放入docker构建映像中?
我查看了docker的秘密,但它似乎只适用于部署(例如docker-compose),它无法解决问题,即如果无法访问项目,则无法在docker构建映像中构建私有nuget服务器,以恢复包。
答案 0 :(得分:1)
Docker机密仅在Swarm Mode服务中可用。 Docker将它们存储在swarm管理器的数据库中,该数据库不能在群集模式外部使用。 docker构建在swarm模式之外运行,并且没有选项在swarm模式内运行构建。您也不会在构建内部获得卷安装,这将在以后发生。
充其量,您可以在swarm模式下运行初始容器,并在构建节点上运行约束。除了绑定装载卷之外,该容器还可以安装秘密到主机上的目录。从该容器中,您可以将安全秘密中的秘密复制到主机目录(docker将保密您的机密,但是没有什么能阻止您自己做一些不安全的秘密)。一旦你将秘密复制出来,就可以使用秘密作为构建arg来运行你的构建。
不幸的是,我不会考虑任何这种安全问题,因为您现在正在将秘密写入磁盘,并将该秘密作为构建过程的一部分。
通常我更喜欢只在构建之外拉出秘密,然后使用生成的数据执行构建,这样您就不需要构建本身内部的秘密。例如。而不是使用登录凭据从容器内部拉出私有代码repo,从docker外部的repo中拉出,然后使用生成的代码repo进行构建。这也是某个地方,多阶段构建可以执行一些注入秘密值的工作,然后将结果复制到没有任何秘密的图像。构建主机在某些阶段的某些层中会有秘密,但不会在推送到注册服务器的最后阶段的任何层中。
答案 1 :(得分:0)
在建立时间在docker镜像中烘焙/嵌入机密是不安全的,并导致不可移植的图像。相反,我建议采用以下更安全的方式:
从协调器中拉出加密的秘密,如:
在容器中安装Ansible并使用Ansible vault
从受信任的证书颁发机构中提取机密