如何安全地将SSH密钥传递给Docker构build?
我想创build一个复制我们的生产服务器的开发者的Docker镜像。 这些服务器由Ansibleconfiguration。
我的想法是运行一个ansible-pull
的适用于容器内的所有configuration。 问题是我需要使用SSH密钥来获取剧本,但我不想在Docker镜像上共享SSH密钥。
那么,有没有一种方法可以让SSH密钥在运行时没有运行时间呢?
很好的问题。 最简单的方法是在构buildAnsible之后删除SSH密钥 – 但由于Docker将图像存储为图层,所以有人仍然可以find带有密钥的旧图层。
如果你构build这个Dockerfile:
FROM ubuntu COPY ansible-ssh-key.rsa /key.rsa RUN [ansible stuff] RUN rm /key.rsa
最终的图像将具有所有Ansible状态,SSH密钥将会消失, 但是有人可以轻松地运行docker history
来查看所有图像层,并且在删除密钥之前从中间层启动一个容器,然后获取密钥。
诀窍就是做这样的事情,然后用Jason Wilder的docker-squash工具来压缩最终的图像。 在压扁的图像中,中间层已经消失,没有办法获取已删除的密钥。
我会设置一些本地文件服务设施只在您的生成环境中可用。
例如,在您的生成主机上启动lighttpd,以便只将pem文件提供给本地客户端。
在你的Dockerfile中,在一次运行中添加/拉出/清除:
RUN curl -sO http://build-host:8888/key.pem && ansible-pull -U myrepo && rm -rf key.pem
在这种情况下,它应该在单层中完成,所以应该没有跟踪提交后留下的key.pem。
您可以在运行时将SSH密钥安装到容器中。
docker run -v /path/to/ssh/key:/path/to/key/in/container image command
这是通过使用这个回购, dockito / vault ,秘密存储在Docker镜像构build中使用的另一个解决scheme。
我创build了一个服务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
你可以使用高山Linux来减less最终的构build大小,并build立图像,
docker build -f Dockerfile -t mohan08p/VaultTest .
而且,你已经完成了。 你可以检查图像。 秘密没有存储在图像内部为空。
docker run -it mohan08p/VaultTest ls /root/.ssh
这是在构build时通过.ssh的好技术。 唯一的缺点是我需要保持额外的Vault服务运行。