Comment SSH dans un conteneur Docker

0
289

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 vu aux côtés de Docker. Voici comment vous pouvez utiliser SSH dans 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 ?

SSH dans un conteneur Docker est généralement une mauvaise pratique que vous devriez é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 arrivants sur 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 dans les 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 mémoriser le 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.

Publicité

Bien que docker exec soit l'approche préférée, il existe encore des scénarios où SSH pourrait être utile. Vous pouvez l'introduire comme une mesure provisoire à intégrer aux systèmes de déploiement existants. 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.

Installation du serveur SSH dans un conteneur Docker

Les images de base Docker les plus populaires sont intentionnellement rationalisé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 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 commutateur -s définit le shell de connexion par défaut de l'utilisateur sur Bash.

L'utilisation d'ENTRYPOINT garantit que le service SSH démarre toujours lorsque le conteneur le fait. L'exécution est ensuite transmise à Bash en tant que processus de premier plan du conteneur. Vous pouvez le remplacer par le binaire de votre application.

Configuration de l'authentification

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

RUN echo “sshuser:Changeme” | Publicité 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 dossier de configuration .ssh pour votre utilisateur. Copiez dans une clé publique à partir de votre répertoire de travail, soit avec une commande docker cp ou une instruction COPY dans le Dockerfile. Dans ce dernier cas, la clé serait intégrée à l'image, visible par toute personne ayant accès.

COPIER 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 SSH&#8217 ;s fichier allowed_keys avec la clé publique id_rsa.pub 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

Maintenant, vous êtes prêt pour se 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 à partir de la machine qui héberge le conteneur Docker. Utilisez docker inspect pour obtenir l'adresse IP de votre conteneur, puis transmettez-la à la commande de connexion SSH.

docker inspect <id-or-name> | grep 'Adresse IP' | head -n 1 Advertisement

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

ssh root@172.17.0.1 # OU ssh sshuser@172.17.0.1

Vous devrez utiliser un autre port si vous exécutez un serveur SSH distinct sur l'hôte ou si plusieurs conteneurs ont besoin du port 22. Voici comment établir 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

Configurer 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

Vous pouvez maintenant exécuter ssh my-container pour le déposer directement dans votre conteneur. Cela permet de jongler plus facilement avec plusieurs connexions sans se souvenir des adresses IP et des ports des conteneurs.

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 my-container@example.com, 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 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 Publicité

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”

Ensuite, 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 # Démarrer le serveur DockSSH dockssh

Vous pouvez maintenant vous connecter à votre conteneur :

ssh my -container@example.com -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é à saisir le mot de passe du conteneur lorsque vous vous connecterez. Cela a été défini comme conteneur-mot de passe-ici dans notre enregistrement 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 les deux étapes “SSH puis docker exec” séquence en une seule commande mémorisable.

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 [ Installer] WantedBy=multi-user.target

Activer le service à l'aide de systemctl :

sudo systemctl enable dockssh.service sudo systemctl start dockssh

Dockssh démarrera désormais automatiquement au démarrage de votre système.

< h2 id="summary">Résumé

La combinaison de SSH avec des conteneurs Docker est largement considérée comme un anti-modèle, mais elle a toujours son utilité 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, le copier dans une clé publique et vous connecter via l'IP du conteneur ou une liaison de port hôte.

Les administrateurs système qui souhaitez gérer à distance un grand nombre de conteneurs Docker, vous pouvez essayer Dockssh. Il vous permet d'exécuter des commandes ssh familières via un mappage transparent en coulisses vers docker exec, vous offrant le meilleur des deux mondes en utilisant des images non modifiées.