【问题标题】:Docker: share private key via argumentsDocker:通过参数共享私钥
【发布时间】:2017-08-05 12:02:30
【问题描述】:

我想将我的 github 私钥分享到我的 docker 容器中。

我正在考虑通过 ARGs 通过 docker-compose.yml 分享它。

是否可以使用此处所述的 ARG 共享私钥? Pass a variable to a Dockerfile from a docker-compose.yml file

# docker-compose.yml file

version: '2'

services:
  my_service:
    build:
      context: .
      dockerfile: ./docker/Dockerfile
      args:
        - PRIVATE_KEY=MULTI-LINE PLAIN TEXT RSA PRIVATE KEY 

然后我希望在我的Dockerfile 中使用它:

ARG PRIVATE_KEY
RUN echo $PRIVATE_KEY >> ~/.ssh/id_rsa 
RUN pip install git+ssh://git@github.com/...

可以通过 ARGs 实现吗?

【问题讨论】:

  • 您希望将私钥存储在镜像中还是保密?
  • 不鼓励在镜像中使用私钥,因为它很容易推送到公共注册表。请考虑将其存储在外部,可以使用机密、由入口点处理的注入环境变量,也可以作为卷存储。
  • @Matt,我正在寻找更安全的解决方案,但不确定哪个更好。

标签: docker docker-compose dockerfile ssh-keys


【解决方案1】:

如果您可以使用最新的 docker 1.13(或 17.03 ce),则可以使用 docker swarm 密码:请参阅“Managing Secrets In Docker Swarm Clusters

这允许您将秘密与您正在启动的容器相关联:

docker service create --name test \
    --secret my_secret \
    --restart-condition none \
    alpine cat /run/secrets/my_secret

如果 docker swarm 在您的情况下不是一个选项,您可以尝试设置 docker credential helper
请参阅“Getting rid of Docker plain text credentials”。但这可能不适用于私有 ssh 密钥。


您可以在“Secrets and LIE-abilities: The State of Modern Secret Management (2017)”中查看其他相关选项,使用独立的秘密管理器,如Hashicorp Vault

【讨论】:

    【解决方案2】:

    虽然ARG 本身不会保留在构建的映像中,但当您在 ​​Dockerfile 的某处引用 ARG 变量时,该变量将在历史记录中:

    FROM busybox
    ARG SECRET
    RUN set -uex; \
        echo "$SECRET" > /root/.ssh/id_rsa; \
        do_deploy_work; \
        rm /root/.ssh/id_rsa
    

    作为VonC notes,现在有一个 swarm 功能来存储和管理机密,但这并没有(还)解决构建时间问题。

    构建

    Docker ~ 1.14(或任何等效的新版本名称)应该是--build-secret flag(也称为#28079),它允许您在构建期间挂载秘密文件。

    与此同时,其中一种解决方案是在某个地方运行网络服务,您可以使用客户端在构建期间从中提取机密信息。然后,如果构建将秘密放入文件中,例如~/.ssh/id_rsa,则必须在创建它的RUN 步骤完成之前删除该文件。

    我见过的最简单的解决方案是使用nc 提供文件:

    docker network create build
    docker run --name=secret \
       --net=build \
       --detach \
       -v ~/.ssh/id_rsa:/id_rsa \
       busybox \
       sh -c 'nc -lp 8000 < /id_rsa'
    docker build --network=build .
    

    然后在 Dockerfile RUN 步骤中收集、存储、使用和删除秘密。

    FROM busybox
    RUN set -uex; \
        nc secret 8000 > /id_rsa; \
        cat /id_rsa; \
        rm /id_rsa
    

    项目

    有许多实用程序具有相同的前提,但具有不同级别的复杂性/功能。有些是通用解决方案,例如 Hashicorps Vault。

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 2021-05-13
      • 2020-08-01
      • 2018-07-30
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多