Partager des clés SSH avec un conteneur Docker
Lorsque l’on est amené à utiliser Docker, il arrive que l’on ait parfois besoin d’accéder aux clés SSH de l’hôte. C’est notamment le cas si l’on utilise un conteneur pour déployer une application. Il existe pour cela plusieurs solutions plus ou moins bonnes.
La première solution qui vous viendra peut-être à l’esprit et d’ajouter les clés SSH directement dans l’image du conteneur. Cette solution est de loin la pire ! Même si vous êtes la seule personne à l’utiliser. Et si ce n’est pas le cas, c’est une solution à proscrire, car de ce fait, vous allez partager des clés à tout un panel d’utilisateurs. C’est une catastrophe d’un point de vue sécurité.
La solution qui devrait vous venir naturellement, est de créer un volume afin de
partager les clés SSH de l’hôte avec le conteneur via une commande du style :
docker run -it -v $HOME/.ssh:/root/.ssh my-container
(oui, j’utilise root
et c’est mal).
La contrainte avec cette méthode, c’est que vous allez obtenir avec un message
d’erreur expliquant que l’utilisateur n’est soit pas le propriétaire des fichiers,
soit que les droits de ces dernières sont trop ouverts.
Pour résoudre ce problème, j’ai vu des développeurs modifier directement les UID des clés de leur machine pour le faire correspondre avec celui du conteneur. Cette méthode n’étant pas universelle, relativement contraignante et vous obligeant à modifier les droits et/ou le propriétaire des fichiers, est loin d’être la méthode idéale.
La meilleure solution a mon sens, est de partager les clés SSH de l’hôte dans un répertoire temporaire du conteneur et de vérifier leurs présences au démarrage de ce dernier. Si elle existe, elles seront alors copiées dans les répertoires de configuration adéquate et on affectera les droits requis. Ce système est donc universel et fonctionne peu importe l’utilisateur du conteneur et du système hôte.
De manière concrète, j’ai tendance à utiliser un script de démarrage de mes conteneurs
que je définis en tant qu’ENTRYPOINT
dans lequel j’effectue les opérations suivantes :
Il ne vous restera plus qu’à démarrer votre conteneur Docker en définissant les fichiers
à partager : docker run -it -v $HOME/.ssh/id_rsa:/var/tmp/sshid -v $HOME/.ssh/config:/var/tmp/sshconf my-container