Comment SSH dans un conteneur Docker - CloudSavvy IT
Agence web » Actualités du digital » Comment SSH dans un conteneur Docker –

Comment SSH dans 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 vue avec 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.

Devriez-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 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épendances 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 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 une mesure provisoire à intégrer aux systèmes de déploiement existants. Il peut également être utilisé par certains IDE et créer des outils 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 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). Les -s switch 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 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

Ensuite, vous devez configurer un système d’authentification. Vous pouvez attribuer un mot de passe à votre sshuser compte et connectez-vous avec :

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 de 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 des SSH authorized_keys dossier 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

Fonctionnement ssh sshuser@example.com 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. Utilisation 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 root@172.17.0.1

# OR

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 vous avez plusieurs conteneurs nécessitant le 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. Éditer ~/.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 tu peux courir ssh my-container à déposer directement dans votre conteneur. 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 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 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"

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

# Start DockSSH server
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 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 les deux étapes « SSH puis docker exec” 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

[Install]
WantedBy=multi-user.target

Activer 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.

Sommaire

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’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 de courir familier ssh commandes via un mappage transparent en coulisses pour docker exec, vous offrant le meilleur des deux mondes en utilisant des images non modifiées.

★★★★★