【问题标题】:Consume secret inside dockerfile在 dockerfile 中使用秘密
【发布时间】:2020-03-27 08:20:01
【问题描述】:

是否可以访问 dockerfile 中的机器环境?我正在考虑将秘密作为构建 ARG 传递,如下所示:

码头工人撰写:

version: '3.5'
services:
  service:
    ...
    build:
      ...
      args:
        SECRET: ${SECRET}
    ...

码头文件:

FROM image
ARG SECRET
RUN script-${SECRET}

注意:容器是在 kubernetes 中构建的,我无法将任何参数传递给构建命令或执行任何命令。

编辑 1: 可以将 SECRET 作为 ARG 传递,因为这不是敏感数据。我正在使用 SECRETS 访问微服务数据,我只能使用机密存储数据。将其视为机器环境。

编辑 2: 这不是 docker 的问题,而是我正在使用的基础架构,它不允许将任何参数传递给 docker build。

【问题讨论】:

    标签: docker kubernetes docker-compose dockerfile


    【解决方案1】:

    秘密应该在运行时使用并由执行环境提供。

    此外,在容器构建期间执行的所有内容都被记录为层,以后任何能够访问映像的人都可以使用。这就是为什么在构建过程中很难以安全的方式使用机密。

    为了解决这个问题,Docker 最近引入了a special option --secret。要使其工作,您将需要以下内容:

    1. 设置环境变量DOCKER_BUILDKIT=1

    2. 使用 --secret 参数到 docker build 命令

      DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=mysecret.txt...

    3. 在 Docker 文件的最顶部添加 语法 注释

      # syntax = docker/dockerfile:1.0-experimental

    4. 使用 --mount 参数为每​​个需要它的 RUN 指令挂载秘密

    RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

    请注意,这需要Docker version 18.09 or later

    【讨论】:

    • 您需要设置环境变量DOCKER_BUILDKIT=1 才能工作。
    【解决方案2】:

    ARG 是一个 构建时间 参数。您希望保留 Secrets secret 而不是将它们写入工件中。将秘密保存在外部环境变量或外部文件中。

    docker run -e SECRET_NAME=SECRET_VALUE
    

    在 docker-compose 中:

    services:
      app-name:
        environment:
        - SECRET_NAME=YOUR_VALUE
    

    services:
      app-name:
        env_file:
        - secret-values.env
    

    Kubernetes

    当您在 Kubernetes 中运行完全相同的容器映像时,您会从 Secret 对象中挂载密钥。

      containers:
      - name: app-name
        image: app-image-name
        env:
          - name: SECRET_NAME
            valueFrom:
              secretKeyRef:
                name: name-of-secret-object
                key: token
    

    【讨论】:

    • 我无法自己执行构建命令,它是由 kubernetes 中的微服务运行的。并且可以将密钥作为 ARG 传递,因为它不是敏感数据。
    • 如果不是敏感数据,为什么还要使用secret?否则你可以使用环境变量。
    • 我无权访问环境变量:/
    • ARG 不是秘密,所以不要写它是秘密。如果您的 Kubernetes 中只有 Secret,您可以将它们用作 环境变量。但是在 dockerfile 中没有“秘密”,只有 argenv
    • 这样做不再是最佳实践。 Docker 现在具有一个可以正确处理机密的系统。
    【解决方案3】:

    秘密仅在构建完成后可用。所以答案是否定的,不能在 dockerfile 中使用秘密。您可以在构建完成后使用它们,例如在运行映像时执行的入口点文件中。

    【讨论】:

    • 这不是真的,来自 Slava 的最受好评的答案显示在构建期间使用了秘密
    • 斯拉瓦说的是真的。但是请看一下问题的“注意”部分。
    • 这不是真的!在构建 docker 镜像时有使用秘密的用例!
    【解决方案4】:

    是的,如果您需要在容器构建期间访问机密,则将机密数据作为 ARG 传递;你没有(!?)选择。

    ARG 值仅在构建期间可用,因此您需要能够信任构建过程并在其结束时对其进行适当清理;如果恶意行为者能够访问构建过程(或事后),它就可以访问秘密数据。

    奇怪的是,您希望将密码用作script-${SECRET},因为我认为该密码将用于访问外部服务。有人可以从生成的 Docker 映像中确定脚本名称,这会暴露您的秘密。

    【讨论】:

    • 用于部署这个 docker 的环境可以有 SECRETS 但不能有环境变量。因此,其目的是像使用机器环境一样使用 SECRETS。此变量仅在构建期间使用。这可能是一个错误,但它似乎是我能想到的唯一选择。
    猜你喜欢
    • 2020-02-14
    • 2022-11-22
    • 1970-01-01
    • 2020-07-27
    • 2019-11-14
    • 2012-03-09
    • 2022-01-06
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多