Partager des clés SSH avec un conteneur Docker

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

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 :

if [ -f /var/tmp/sshconf ]; then
    cp /var/tmp/sshconf /root/.ssh/config
    chmod 600 /root/.ssh/config
fi

if [ -f /var/tmp/sshid ]; then
    cp /var/tmp/sshid /root/.ssh/id_rsa
    chmod 600 /root/.ssh/id_rsa
if [ -f /var/tmp/sshconf ]; then

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