1
votes

Consommez le secret dans le fichier dockerfile

Est-il possible d' accéder aux secrets de docker dans dockerfile ? Je pensais passer le SECRET comme build ARG, comme ceci:

docker-compose:

FROM image
ARG SECRET
RUN script-${SECRET}

dockerfile:

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

Remarque: le conteneur est construit dans kubernetes, je ne peux passer aucun argument à la commande build ou exécuter aucune commande du tout.

Modifier la note: il est acceptable de passer SECRET comme ARG car ce ne sont pas des données sensibles. J'utilise SECRETS pour accéder aux données de micro-service, et je ne peux stocker des données qu'en utilisant des secrets. Considérez cela comme un environnement machine.


0 commentaires

4 Réponses :


4
votes

ARG est un argument de temps de construction . Vous voulez garder secrets les secrets et ne pas les écrire dans les artefacts. Gardez des secrets dans des variables d'environnement externes ou dans des fichiers externes.

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

et dans docker-compose:

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

ou

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

Kubernetes

Lorsque vous exécutez exactement la même image de conteneur dans Kubernetes, vous montez le secret à partir d'un objet Secret .

docker run -e SECRET_NAME=SECRET_VALUE


4 commentaires

Je ne peux pas exécuter la commande build par moi-même, elle est exécutée par un micro service dans kubernetes. Et il est normal de passer le secret comme ARG car ce ne sont pas des données sensibles.


Pourquoi utilisez-vous un secret si ce n'est pas des données sensibles ??? Sinon, vous pouvez utiliser des variables d'environnement.


Je n'ai pas accès aux variables d'environnement: /


ARG n'est pas un secret, alors n'écrivez pas que c'est un secret. Si vous n'avez que Secret dans votre Kubernetes, vous pouvez les consommer en tant que variables d'environnement . Mais dans un fichier docker, il n'y a rien de "secret", seulement arg ou env .



0
votes

Oui, pour transmettre des données secrètes en tant qu'ARG si vous devez accéder au secret pendant la construction du conteneur; vous n'avez pas (!?) d'alternative.

Les valeurs ARG ne sont disponibles que pendant la durée de la construction, vous devez donc être en mesure de faire confiance au processus de construction et qu'il soit nettoyé de manière appropriée à sa conclusion; si un acteur malveillant pouvait accéder au processus de construction (ou après coup), il pourrait accéder aux données secrètes.

Il est curieux que vous souhaitiez utiliser le secret comme script-${SECRET} car j'ai supposé que le secret serait utilisé pour accéder à un service externe. Quelqu'un pourrait déterminer le nom du script à partir de l'image Docker résultante et cela exposerait votre secret.


1 commentaires

L'environnement utilisé pour déployer ce docker peut avoir des SECRETS mais pas des variables d'environnement. L'intention est donc de consommer SECRETS comme s'il s'agissait d'environnements machine. Ces variables ne sont utilisées que pendant la construction. C'est peut-être une erreur, mais cela semble être la seule alternative à laquelle je puisse penser.



4
votes

Les secrets doivent être utilisés pendant l'exécution et fournis par l'environnement d'exécution.

De plus, tout ce qui s'exécute pendant la construction d'un conteneur est écrit sous forme de couches et est disponible plus tard à toute personne capable d'accéder à une image. C'est pourquoi il est difficile de consommer des secrets pendant la construction de manière sécurisée.

Afin de résoudre ce problème, Docker a récemment introduit une option spéciale --secret . Pour le faire fonctionner, vous aurez besoin des éléments suivants:

  1. Définir la variable d'environnement DOCKER_BUILDKIT = 1

  2. Utilisez l'argument --secret pour la commande docker build

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

  3. Ajoutez un commentaire de syntaxe tout en haut de votre fichier Docker

    # syntax = docker/dockerfile:1.0-experimental

  4. Utilisez l'argument --mount pour monter le secret pour chaque directive RUN qui en a besoin

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

Veuillez noter que cela nécessite la version 18.09 ou ultérieure de Docker .


1 commentaires

Vous devez définir la variable d'environnement DOCKER_BUILDKIT=1 pour que cela fonctionne.



3
votes

Les secrets ne sont disponibles qu'une fois la construction terminée. Donc, la réponse est non, les secrets ne peuvent pas être consommés à l'intérieur du fichier docker. Vous pouvez les consommer une fois la construction terminée, par exemple dans un fichier de point d'entrée qui est exécuté lorsque l'image est exécutée.


0 commentaires