468 votes

Utilisation de clés SSH dans un conteneur docker

J'ai une application qui exécute divers trucs amusants avec Git (comme exécuter git clone et git push) et j'essaie de la dockeriser.

Je rencontre cependant un problème : je dois pouvoir ajouter une clé SSH au conteneur pour que l'"utilisateur" du conteneur puisse l'utiliser.

J'ai essayé de le copier dans /root/.ssh/ en changeant $HOME créer un wrapper git ssh, et toujours pas de chance.

Voici le Dockerfile pour référence :

#DOCKER-VERSION 0.3.4                                                           

from  ubuntu:12.04                                                              

RUN  apt-get update                                                             
RUN  apt-get install python-software-properties python g++ make git-core openssh-server -y
RUN  add-apt-repository ppa:chris-lea/node.js                                   
RUN  echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list
RUN  apt-get update                                                             
RUN  apt-get install nodejs -y                                                  

ADD . /src                                                                       
ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa                             
RUN   cd /src; npm install                                                      

EXPOSE  808:808                                                                 

CMD   [ "node", "/src/app.js"]

app.js exécute les commandes git comme git pull

29 votes

Quiconque aborde cette question doit penser à la finalité du jeu, car il est facile de créer une faille de sécurité et de l'oublier si l'on ne fait pas attention. Lisez toutes les réponses et choisissez judicieusement.

0 votes

Il est disponible dès maintenant, voir stackoverflow.com/a/66301568/9926721

0 votes

J'ai une réponse aquí en utilisant ssh-add qui est considéré comme sûr (comme Josh Habdas le dit plus haut, choisissez judicieusement). J'ai eu de réelles difficultés à le faire fonctionner sur Ubuntu 20.04, principalement à cause du fait que le débogage de Docker est difficile (cf. Débogage de la construction Docker ) mais aussi à cause d'AppArmor et du nom de la clé qui par défaut doit être id_rsa .

102voto

ebensing Points 377

Il s'avère que lorsqu'on utilise Ubuntu, le ssh_config n'est pas correct. Vous devez ajouter

RUN  echo "    IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

à votre Dockerfile afin qu'il reconnaisse votre clé ssh.

2 votes

Vous devez probablement aussi définir le nom d'utilisateur correct comme ceci RUN echo " Host example.com" >> /root/.ssh/config RUN echo " User <someusername>" >> /root/.ssh/config

3 votes

Pourquoi quelqu'un copierait-il une clé privée d'une machine hôte à un conteneur. La commande est OK, mais je ne vois pas le sens de faire ce qui est mentionné ci-dessus...

21 votes

Ce n'est pas sécurisé ! Voir ma solution ci-dessous pour la dernière version 1.13 de Docker. @ebensing

94voto

yellowcap Points 789

Nota : n'utilisez cette approche que pour les images qui sont privé et sera toujours !

La clé ssh reste stockée dans l'image, même si vous la supprimez dans une commande de calque après l'avoir ajoutée (voir les commentaires dans la section ce poste ).

Dans mon cas, cela convient, c'est donc ce que j'utilise :

# Setup for ssh onto github
RUN mkdir -p /root/.ssh
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN echo "Host github.com\n\tStrictHostKeyChecking no\n" >> /root/.ssh/config

123 votes

Cela permettra de garder votre clé dans l'image, ne le faites pas.

23 votes

@CppLearner vous avez raison, cela stocke la clé dans l'image, et cela peut être un problème de sécurité dans certains cas. Merci de l'avoir souligné. Cependant, il y a de nombreuses situations où cela est parfaitement sûr. Par exemple pour les images qui sont stockées dans un dépôt privé, ou les images qui sont construites directement sur un serveur de production en copiant les clés locales sur l'image.

2 votes

En outre, si vous installez vos fournisseurs dans le Dockerfile, rien ne vous empêche de supprimer la clé ssh une fois les fournisseurs installés.

41voto

creack Points 11635

Afin d'injecter votre clé ssh, dans un conteneur, vous avez plusieurs solutions :

  1. Utilisation d'un Dockerfile avec le ADD vous pouvez l'injecter pendant votre processus de construction.

  2. Il suffit de faire quelque chose comme cat id_rsa | docker run -i <image> sh -c 'cat > /root/.ssh/id_rsa'

  3. Utilisation de la docker cp qui vous permet d'injecter des fichiers pendant l'exécution d'un conteneur.

2 votes

Pour l'instant, j'ai essayé de la copier dans /Root/.ssh/id_rsa mais je reçois toujours des erreurs "Host key verification failed. fatal : The remote end hung up unexpectedly" de la part de Git, ce qui, j'en suis sûr, signifie que la clé n'est pas utilisée pour une raison quelconque. Je pense donc qu'il y a quelque chose d'autre que je dois faire pour dire au système de l'utiliser comme clé ssh ? Je ne sais pas exactement comment déboguer cette situation. (et je sais que cette clé fonctionne car elle s'exécute sans problème depuis l'hôte).

0 votes

Pouvez-vous vous assurer que le fichier /etc/ssh/ssh_config cible le bon fichier clé ?

1 votes

Existe-t-il un bon moyen d'inspecter les fichiers du conteneur docker ? Ou dois-je simplement essayer de copier une configuration valide ?

15voto

Dan Keder Points 101

Cette ligne est un problème :

ADD ../../home/ubuntu/.ssh/id_rsa /root/.ssh/id_rsa

Lorsque vous spécifiez les fichiers que vous souhaitez copier dans l'image, vous ne pouvez utiliser que des chemins relatifs - relatifs au répertoire où se trouve votre Dockerfile. Vous devez donc plutôt utiliser :

ADD id_rsa /root/.ssh/id_rsa

Et mettez le fichier id_rsa dans le même répertoire que celui où se trouve votre Dockerfile.

Consultez cette page pour plus de détails : http://docs.docker.io/reference/builder/#add

7 votes

Cela pose également un problème de sécurité, car cela place une clé privée dans une image qui peut être facilement oubliée.

0 votes

docker cp le met juste dans le conteneur et non dans l'image, n'est-ce pas ?

8voto

arreche Points 55

Vous pouvez sélectivement laisser des serveurs distants accéder à votre agent ssh local comme s'il était exécuté sur le serveur".

https://developer.github.com/guides/using-ssh-agent-forwarding/

4 votes

Docker run -i -t -v $(readlink -f $SSH_AUTH_SOCK):/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent ubuntu /bin/bash

2 votes

Fruitl00p a créé un conteneur docker-tunnel de cette manière : github.com/kingsquare/docker-tunnel

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X