Comment empêcher l'attachement ou l'exécution dans un conteneur Docker

9

Comment empêcher un utilisateur de mon conteneur Docker prédéfini d'accéder à un shell dans une instance en cours d'exécution de ce conteneur? J'ai googlé et lu tous les messages qui sont liés à ce scénario et sont venus sans solution de travail. J'essaie d'empêcher l'accès à une ressource donnée dans le conteneur, pour cette enquête, disons que c'est un numéro de série dans un fichier de configuration. Je m'appuie sur l' image java: 7 qui est basée sur une image ubuntu .

Pour tester votre solution, procédez comme suit:

  1. Créez et exécutez votre conteneur Docker

  2. Exportez votre conteneur

    exportation de docker [nom du conteneur] | gzip -c> mycontainer.tar.gz

  3. Importez votre conteneur sur un système externe

    gzip -dc mycontainer.tar.gz | importation de docker - [nom du conteneur]

  4. Exécutez le conteneur

  5. Shell dans le conteneur en cours d'exécution en utilisant l'une / toutes les méthodes suivantes:

    docker exec -it [nom du conteneur] bash

    docker attach [nom du conteneur]

    docker run -ti --entrypoint = / bin / bash [nom du conteneur]

[nom du conteneur] est le nom de votre conteneur

bash, dash et sh sont tous des shells valides

Paul Gregoire
la source
1
Si vous essayez de protéger les informations à l'intérieur de votre conteneur, le docker n'est pas la technologie que vous souhaitez. Même si vous pouviez restreindre l'accès au shell, il existe une myriade d'autres moyens triviaux pour accéder au système de fichiers à l'intérieur du conteneur.
EEAA
Malheureusement, je dois utiliser docker dans ce cas; Je suis bien conscient que ce n'est pas idéal dans ce cas.
Paul Gregoire
Hey @EEAA pourriez-vous me pointer vers une liste de ces "moyens insignifiants"? Que proposeriez-vous au lieu de docker alors?
nils petersohn

Réponses:

5

Pour la bashcommande en particulier, j'ai ajouté dans le fichier .bashrc la commande exità la fin du fichier, afin que l'utilisateur se connecte et finalement expulsé, mais les utilisateurs peuvent toujours utiliser la shcommande.

José Roberto García Chico
la source
3

Pour compléter la réponse de Jose, une autre solution consiste à ...

docker exec :id -it /bin/rm -R /bin/*

Cela se débarrasse de sh et de toute commande utile bin sous linux. Je ne sais pas ce que vous feriez pour entrer dans le conteneur à ce moment-là. Bien que je sache que vous pourriez être en mesure d'utiliser un débogueur de mémoire pour obtenir les variables d'environnement du conteneur en cours d'exécution, mais cela le rend beaucoup plus ennuyeux ... Je me demande s'il y a un moyen de verrouiller cette mémoire dans l'anneau 0 et d'enlever accès ssh complètement à l'hôte.

Si quelqu'un sait comment résoudre ce problème, je serais intéressé de savoir comment.

ÉDITER

Vous souhaitez utiliser les secrets de docker si vous protégez des informations sensibles. Check-out:

https://docs.docker.com/engine/swarm/secrets/

Dr.Knowitall
la source
Cela fonctionne parfaitement pour mes besoins, merci! Bien que je crois que la commande correcte est:docker exec -it 'container-id' /bin/rm -R /bin/*
ty01
Cela ne fonctionne pas pour moi Docker version 18.09.6, build 481bc77156 . L' approche par@ty01 donne ce message d'erreur /bin/rm: cannot remove '/bin/<filename>': No such file or directorypour tous les filenames dans /bin. La réponse par@Dr. Knowitall retourne Error: No such container: :id. Même si je le remplace idpar le CONTAINER_IDfrom docker ps, il donne toujours le même message d'erreur.
edesz
0

Si les informations que vous souhaitez protéger sont un numéro de série, le cryptage de ces informations est le seul moyen sûr de les protéger. Vous pouvez choisir différentes façons de crypter les données secrètes, assurez-vous que vous utilisez une clé forte. Vous pouvez également faire en sorte que votre application envoie des données secrètes à votre serveur pour identifier leur validité et en fonction des réponses de votre serveur, les applications peuvent continuer à fonctionner ou s'arrêter et afficher des messages.

En bref, supposez toujours que votre application peut être disséquée complètement et complètement. Cryptez toujours toutes les données secrètes et importantes à l'aide d'une clé forte, de sorte que le craquage de la clé prendra très longtemps (supposez que l'algorithme de cryptage est accessible au public ou bien connu).

Empêcher l'accès seul, même si vous trouvez un moyen de le faire, ne fera que donner un faux sentiment de sécurité.

Donny Kurnia
la source
... alors le secret à protéger devient la clé de cryptage, et vous devez le protéger avec une clé de cryptage. Et protégez cette clé avec une clé et protégez cette clé avec une clé et ...
Mark