【问题标题】:How to pass securely SSH Keys to Docker Build?如何安全地将 SSH 密钥传递给 Docker Build?
【发布时间】:2017-09-17 19:42:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: ssh docker ansible ansible-pull


    【解决方案1】:

    好问题。简单的方法是在构建中的 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 压缩最终图像。在压扁的图像中,中间层消失了,无法获取已删除的键。

    【讨论】:

    • 正是问题所在:信息保留在图层上。不知道你可以挤压图像。谢谢!
    【解决方案2】:

    我会设置一些仅在您的构建环境中可用的本地文件服务工具。
    例如。在您的构建主机上启动 lig​​httpd 以仅将您的 pem 文件提供给本地客户端。

    并在您的 Dockerfile 中一次性运行添加/拉取/清理:

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

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

    【讨论】:

    • 通过 HTTP 发送私钥听起来不太安全。
    【解决方案3】:

    这是使用此 repo dockito/vault 的另一种解决方案, 用于 Docker 镜像构建的秘密存储。

    我创建了一个服务 dockito/vaultUbuntu 映像,在其中我将我的私钥附加到卷并使用它作为进程运行它,

    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 . 
    

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 你能扩展一下吗?现在它只是一个真正的评论,而不是一个完整的答案。
      • 问题是我只需要构建时的 SSH 密钥。
      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 2019-12-30
      • 1970-01-01
      • 2016-08-23
      • 2020-10-26
      相关资源
      最近更新 更多