SSH est l'une des commandes les plus utilisées dans la boîte à outils d'un administrateur système, mais on ne la voit pas couramment aux côtés de Docker. Voici comment vous connecter en SSH à un conteneur en cours d'exécution et pourquoi vous devriez réfléchir à deux fois avant de le faire.
Devez-vous utiliser SSH avec des conteneurs Docker ?
SSH-ing dans un conteneur Docker est généralement une mauvaise pratique que vous devriez éviter. Il est presque toujours préférable d'utiliser le docker exec
commande pour obtenir un shell à l'intérieur d'un conteneur.
Les nouveaux arrivants Docker peuvent être tentés d'utiliser SSH pour mettre à jour les fichiers à l'intérieur d'un conteneur. Les conteneurs sont censés être jetables, ils doivent donc être traités comme immuables après leur création, à l'exception des données persistantes stockées à l'intérieur des volumes. Créez une nouvelle image et redémarrez votre conteneur lorsque vous modifiez le code source.
Outre le processus de configuration en plusieurs étapes, l'installation de SSH dans une image Docker ajoute plusieurs packages 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 aux conteneurs individuels.
Tandis que docker exec
est l'approche préférée, il existe encore des scénarios où SSH pourrait être utile. Vous pouvez l'introduire comme mesure palliative à intégrer aux systèmes de déploiement hérités. Il 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 intentionnellement rationalisées. Vous devrez ajouter vous-même le serveur OpenSSH, même sur des images dérivées de distributions de systèmes d'exploitation populaires.
Voici un exemple 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 plus de sécurité, 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 -s
Le commutateur 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 le fait. L'exécution est ensuite transférée à Bash en tant que processus de premier plan du conteneur. Vous pouvez le remplacer par le binaire de votre application.
Configuration de l'authentification
Ensuite, vous devez configurer un système d'authentification. Vous pouvez attribuer un mot de passe à votre sshuser
compte et connectez-vous avec cela :
RUN echo "sshuser:Changeme" | changepasswd
Un moyen plus sûr consiste à configurer l'authentification par clé SSH. Vous devrez créer une paire de clés sur votre ordinateur client, 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 .ssh
dossier de configuration pour votre utilisateur. Copiez dans une clé publique depuis votre répertoire de travail, soit avec un docker cp
commande ou un COPY
instruction dans le Dockerfile
. Dans ce dernier cas, la clé serait intégrée à l'image, visible par toute personne 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 les authorized_keys
de SSH fichier avec le id_rsa.pub
clé publique dans votre répertoire de travail. Les autorisations du système de fichiers sont ajustées pour correspondre aux exigences de SSH.
Connexion au conteneur
Vous êtes maintenant 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écution de ssh [email protected]
vous donnera une coquille à l'intérieur de votre conteneur.
Vous pouvez ignorer la liaison du port si vous vous connectez à partir de la machine qui héberge le conteneur Docker. Utiliser docker inspect
pour obtenir l'adresse IP de votre conteneur, puis transmettez-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 [email protected] # OR ssh [email protected]
Vous devrez utiliser un autre port si vous exécutez un serveur SSH distinct 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 [email protected] -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. Modifier ~/.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
Vous pouvez maintenant exécuter ssh my-container
à déposer directement dans votre contenant. Cela permet de jongler plus facilement avec plusieurs connexions sans se souvenir des adresses IP et des ports du conteneur.
Utilisez plutôt Dockssh pour simplifier la gestion des conteneurs
Le projet Dockssh va encore plus loin en fournissant un autre démon qui vous permet d'exécuter ssh [email protected]
, sans aucune configuration SSH manuelle. Vous n'avez pas besoin d'installer un serveur SSH dans vos conteneurs ; Dockssh met automatiquement en proxy les connexions SSH et exécute le bon docker exec
commande à 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"
Téléchargez ensuite 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
Vous pouvez maintenant vous connecter à votre conteneur :
ssh [email protected] -p 22022
Dockssh écoute sur le port 22022 par défaut. Le pare-feu est ouvert pour autoriser les connexions entrantes utilisant le port.
Vous serez invité à entrer le mot de passe du conteneur lorsque vous vous connecterez. Cela a été défini comme container-password-here
dans notre dossier Redis ci-dessus.
L'utilisation de Dockssh facilite le SSH dans un grand nombre de conteneurs Docker. Cette approche est idéale lorsque vous vous connectez régulièrement à vos conteneurs à partir d'un hôte distant, car elle rationalise le processus en deux étapes "SSH puis docker exec
” séquence en une seule commande mémorable.
Enregistrez 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 [Service] type=simple Restart=always RestartSec=1 User=root ExecStart=/usr/local/bin/dockssh [Install] WantedBy=multi-user.target
Activez le service en utilisant systemctl
:
sudo systemctl enable dockssh.service sudo systemctl start dockssh
Dockssh démarrera désormais automatiquement au démarrage de votre système.
Résumé
La combinaison de SSH avec des conteneurs Docker est largement considérée comme un anti-modèle, mais elle a toujours ses utilisations dans les environnements de développement, de test et 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 une liaison de port hôte.
Les administrateurs système qui souhaitent gérer à distance un grand nombre de conteneurs Docker peuvent essayer Dockssh. Il vous permet d'exécuter ssh
familier commandes via un mappage transparent en arrière-plan vers docker exec
, vous offrant le meilleur des deux mondes en utilisant des images non modifiées.