如何安全地将SSH密钥传递给Docker Build?

时间:2016-09-20 13:54:24

标签: ssh docker ansible ansible-pull

我想为重现我们的生产服务器的开发人员创建一个Docker镜像。这些服务器由Ansible配置。

我的想法是运行ansible-pull来应用容器内的所有配置。问题是我需要SSH密钥来提取剧本,但我不想在Docker镜像上共享SSH密钥。

那么,有一种方法可以在构建时使用SSH密钥,而无需在运行时使用它们吗?

4 个答案:

答案 0 :(得分:2)

好问题。这样做的简单方法是在构建中的Ansible内容之后删除SSH密钥 - 但是因为Docker将图像存储为图层,所以有人仍然可以找到带有密钥的旧图层。

如果你构建这个Dockerfile:

FROM ubuntu                                                                       
COPY ansible-ssh-key.rsa /key.rsa                                                    
RUN [ansible stuff]
RUN rm /key.rsa

最终图片将具有您的所有Ansible状态,并且SSH密钥将消失有人可以轻松运行docker history以查看所有图片图层,并从中启动容器删除密钥之前的中间层,然后抓住密钥。

诀窍是做这样的事情,然后使用Jason Wilder's docker-squash tool压缩最终图像。在压扁的图像中,中间层消失了,无法获取已删除的密钥。

答案 1 :(得分:2)

我设置了一些仅在您的构建环境中可用的本地文件服务工具 例如。在构建主机上启动lighttpd,仅向本地客户端提供pem文件。

在你的Dockerfile中,你可以在一次运行中添加/拉取/清理:

RUN curl -sO http://build-host:8888/key.pem && ansible-pull -U myrepo && rm -rf key.pem

在这种情况下,它应该在单个图层中完成,因此在图层提交后不应留下key.pem的痕迹。

答案 2 :(得分:0)

这是使用此repo dockito/vault的另一种解决方案, 在Docker镜像构建中使用的秘密商店。

我创建了一个服务 dockito / vault Ubuntu 图像,其中我将我的私钥附加到卷并使用,

将其作为一个进程运行
docker run -it -v ~/.ssh:/vault/.ssh ubuntu /bin/bash -c "echo mysupersecret > /vault/.ssh/key"

docker run -d -p 14242:3000 -v ~/.ssh:/vault/.ssh dockito/vault

而且,这是我的Dockerfile

FROM ubuntu:14.04
RUN apt-get update -y && \
      apt-get install -y curl && \
      curl -L $(ip route|awk '/default/{print $3}'):14242/ONVAULT >   
      /usr/local   
      /bin/ONVAULT && \
      chmod +x /usr/local/bin/ONVAULT
ENV REV_BREAK_CACHE=1
RUN ONVAULT echo ENV: && env && echo TOKEN ENV && echo $TOKEN
RUN ONVAULT ls -lha ~/.ssh/
RUN ONVAULT cat ~/.ssh/key

您可以使用alpine linux来减少最终构建大小,并将图像构建为,

docker build -f Dockerfile -t mohan08p/VaultTest . 

而且,你已经完成了。您可以检查图像。秘密没有存储在图像中,因为它是空的。

docker run -it mohan08p/VaultTest ls /root/.ssh

这是在构建时传递.ssh的好方法。唯一的缺点是我需要保持额外的Vault服务运行。

答案 3 :(得分:-1)

您可以在运行时将SSH密钥挂载到Container中。

docker run -v /path/to/ssh/key:/path/to/key/in/container image command