Recherche de site Web

Comment se connecter en SSH à un conteneur Docker


SSH est l'une des commandes les plus utilisées dans la boîte à outils d'un administrateur système, mais elle n'est pas couramment associée à Docker. Voici comment vous pouvez vous connecter en SSH à un conteneur en cours d'exécution et pourquoi vous devriez y réfléchir à deux fois avant de le faire.

Devez-vous utiliser SSH avec des conteneurs Docker ?

Se connecter à un conteneur Docker via SSH est généralement une mauvaise pratique à éviter. Il est presque toujours préférable d'utiliser la commande docker exec pour obtenir un shell à l'intérieur d'un conteneur.

Les nouveaux utilisateurs de Docker peuvent être tentés d'utiliser SSH pour mettre à jour des fichiers à l'intérieur d'un conteneur. Cependant, les conteneurs sont conçus pour être jetables, ils doivent donc être considérés comme immuables après leur création, sauf pour les données persistantes stockées dans des volumes. Créez une nouvelle image et redémarrez votre conteneur lorsque vous modifiez le code source.

En plus du processus de configuration en plusieurs étapes, l'installation de SSH dans une image Docker ajoute plusieurs paquets de dépendance et expose un autre vecteur d'attaque potentiel. Sur un système avec plusieurs conteneurs actifs, vous exécuterez plusieurs processus SSH indépendants et devrez vous souvenir du port correct pour chaque conteneur.

Au lieu d'ajouter SSH à des conteneurs individuels, installez-le une fois sur l'hôte physique qui exécute Docker. Utilisez SSH pour vous connecter à votre hôte, puis exécutez

docker exec -it my-container bash

pour accéder à des conteneurs individuels.

Bien que docker exec soit la méthode préférée, il existe encore des scénarios où SSH pourrait être utile. Vous pourriez l'introduire comme une mesure temporaire pour s'intégrer aux systèmes de déploiement anciens. Cela peut également être utilisé par certains IDE et outils de construction pour fournir des capacités de rechargement en direct pendant le développement.

Installer le serveur SSH dans un conteneur Docker

Les images de base Docker les plus populaires sont volontairement simplifiées. Vous devrez ajouter le serveur OpenSSH vous-même, même sur des images dérivées de distributions de systèmes d'exploitation populaires.

Voici un exemple de Dockerfile pour une image basée sur Debian :

RUN apt-get update && apt-get install -y openssh-server

RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

ENTRYPOINT service ssh start && bash

La configuration SSH est modifiée afin que vous puissiez vous connecter en tant que root, l'utilisateur par défaut dans un conteneur Docker. Pour une sécurité accrue, configurez plutôt un compte utilisateur dédié :

RUN useradd -m -s /bin/bash sshuser

Cela crée un nouvel utilisateur appelé sshuser avec un répertoire personnel (-m). Le commutateur -s définit le shell de connexion par défaut de l'utilisateur sur Bash.

L'utilisation de ENTRYPOINT garantit que le service SSH démarre toujours lorsque le conteneur se lance. L'exécution est ensuite transférée à Bash en tant que processus principal du conteneur. Vous pourriez remplacer cela par le binaire de votre application.

Configurer l'authentification

Ensuite, vous devez configurer un système d'authentification. Vous pouvez assigner un mot de passe à votre compte sshuser et vous connecter avec cela :

RUN echo "sshuser:Changeme" | changepasswd

Une manière plus sécurisée consiste à configurer l'authentification par clé SSH. Vous devrez créer une paire de clés sur votre machine cliente, puis copier la partie publique dans le conteneur. De cette façon, le démon SSH peut vérifier l'identité de votre machine lorsque vous vous connectez.

Modifiez votre Dockerfile pour configurer le dossier de configuration .ssh pour votre utilisateur. Copiez une clé publique depuis votre répertoire de travail, soit avec une commande docker cp, soit avec une instruction COPY dans le Dockerfile. Dans ce dernier cas, la clé sera intégrée dans l'image, visible par quiconque ayant accès.

COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys

RUN chown -R sshuser:sshuser /home/sshuser/.ssh

RUN chmod 600 /home/sshuser/.ssh/authorized_keys

Cette séquence de commandes crée le fichier authorized_keys de SSH avec la clé publique id_rsa.pub dans votre répertoire de travail. Les permissions du système de fichiers sont ajustées pour correspondre aux exigences de SSH.

Connexion au conteneur

Maintenant, vous êtes prêt à vous connecter à votre conteneur. Exécutez le conteneur avec le port 22 lié à l'hôte :

docker run -p 22:22 my-image:latest

Exécuter ssh sshuser@example.com vous donnera un shell à l'intérieur de votre conteneur.

Vous pouvez ignorer la liaison du port si vous vous connectez depuis la machine qui héberge le conteneur Docker. Utilisez docker inspect pour obtenir l'adresse IP de votre conteneur, puis passez-la à la commande de connexion SSH.

docker inspect <id-or-name> | grep 'IPAddress' | head -n 1

Utilisez le client SSH sur votre machine pour vous connecter au conteneur :

ssh root@172.17.0.1

OR

ssh sshuser@172.17.0.1

Vous devrez utiliser un port alternatif si vous exécutez un serveur SSH séparé sur l'hôte ou si vous avez plusieurs conteneurs nécessitant le port 22. Voici comment initier une connexion lorsque SSH est lié au port 2220 :

docker run -p 22:2220 my-image:latest

ssh root@172.17.0.1 -p 2220

Configuration des raccourcis de conteneur avec SSH Config

Vous pouvez manipuler votre fichier de configuration SSH pour simplifier les connexions aux conteneurs individuels. Modifiez ~/.ssh/config pour définir des hôtes abrégés avec des ports préconfigurés :

Host my-container

HostName 172.17.0.1

Port 2220

User sshuser

Maintenant, vous pouvez exécuter ssh my-container pour accéder directement à votre conteneur. Cela facilite la gestion de plusieurs connexions sans avoir à mémoriser les adresses IP et les ports des conteneurs.

Utilisez Dockssh pour simplifier la gestion des conteneurs à la place.

Le projet Dockssh va encore plus loin en fournissant un autre démon qui vous permet d'exécuter ssh my-container@example.com, sans aucune configuration manuelle de SSH. Vous n'avez pas besoin d'installer un serveur SSH dans vos conteneurs ; Dockssh proxy automatiquement les connexions SSH et exécute la commande docker exec correcte à la place.

Vous devez d'abord installer Redis pour stocker les données de configuration de Dockssh :

sudo apt install redis

Ensuite, définissez les conteneurs que vous souhaitez exposer en ajoutant un enregistrement Redis avec le nom du conteneur et un mot de passe pour les connexions SSH :

redis-cli set dockssh:my-container:pass "container-password-here"

Puis téléchargez Dockssh :

sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh

sudo chmod +x /usr/local/bin/dockssh

sudo ufw allow 22022

Start DockSSH server

dockssh

Maintenant, vous pouvez vous connecter à votre conteneur :

ssh my-container@example.com -p 22022

Dockssh écoute par défaut sur le port 22022. Le pare-feu est ouvert pour permettre les connexions entrantes utilisant ce port.

Vous serez invité à entrer le mot de passe du conteneur lorsque vous vous connecterez. Celui-ci a été défini comme container-password-here dans notre enregistrement Redis ci-dessus.

Utiliser Dockssh facilite la connexion SSH à un grand nombre de conteneurs Docker. Cette approche est idéale lorsque vous vous connectez régulièrement à vos conteneurs depuis un hôte distant, car elle rationalise la séquence en deux étapes "SSH puis docker exec" en une seule commande mémorable.

Enregistrer Dockssh en tant que service système pour une utilisation à long terme :

sudo nano /etc/systemd/system/dockssh.service
[Unit]

Description=Dockssh service

After=network.target

type=simple

Restart=always

RestartSec=1

User=root

ExecStart=/usr/local/bin/dockssh

WantedBy=multi-user.target

Activez le service en utilisant systemctl :

sudo systemctl enable dockssh.service

sudo systemctl start dockssh

Dockssh va maintenant démarrer automatiquement lorsque votre système démarre.

Résumé

Combiner SSH avec des conteneurs Docker est généralement considéré comme un anti-modèle, pourtant cela a encore ses utilisations dans le développement, les tests et les environnements hérités. Lorsqu'il n'y a pas d'alternative, vous pouvez ajouter le serveur SSH à votre conteneur, copier une clé publique et vous connecter via l'adresse IP du conteneur ou un port d'hôte.

Les administrateurs système qui souhaitent gérer à distance un grand nombre de conteneurs Docker peuvent essayer Dockssh. Cela vous permet d'exécuter des commandes ssh familières grâce à une intégration transparente en arrière-plan avec docker exec, vous offrant le meilleur des deux mondes en utilisant des images non modifiées.