GNU/Linux >> Tutoriels Linux >  >> Linux

Comment se connecter en SSH à un conteneur Docker

Comment utilisez-vous SSH pour entrer dans un conteneur Docker ? L'approche traditionnelle consiste en deux étapes :

Étape 1  :SSH sur votre serveur Linux distant (si vous exécutez le conteneur sur un système distant).‌

ssh [email protected]_ip_address

Étape 2 :Et puis vous entrez dans le shell de votre conteneur Docker en cours d'exécution en mode interactif comme ceci :

docker exec -it container_ID_or_name /bin/bash

Avec cela, vous pouvez exécuter la commande Linux ou effectuer une maintenance du service exécuté à l'intérieur du conteneur.

Il n'y a rien de mal avec la méthode ci-dessus. C'est la manière traditionnelle et recommandée d'entrer sans effort dans les conteneurs.

Cependant, avec quelques efforts, vous pouvez en fait vous connecter directement en SSH à un conteneur en cours d'exécution, sans vous connecter au préalable au système hôte.

SSH dans un conteneur Docker :mais pourquoi ?

C'est un peu bizarre, n'est-ce pas ? Connexion à un conteneur, via SSH. Bien que cela semble non traditionnel, cela pourrait vous être toujours utile, selon vos cas d'utilisation.

Voici quelques choses que vous pouvez réaliser avec la possibilité de vous connecter en SSH à un conteneur :

  1. Vous pouvez configurer un faux hôte pour tout attaquant potentiel. En utilisant un port non standard pour le démon SSH de votre hôte et en servant une connexion SSH au port 22 pour les attaquants.
  2. Un niveau d'autorisation totalement séparé, c'est-à-dire des identifiants de connexion par mot de passe ou différentes clés ssh à vous de choisir et distinct de ce que votre hôte utilise actuellement.
  3. Exécuter n'importe quel processus automatisé à distance, sans utiliser les mêmes clés SSH que celles utilisées pour se connecter par les membres de votre équipe.

Avant de vous montrer comment faire toutes les choses ci-dessus, je vais vous expliquer comment cela fonctionne réellement.

L'utilisation de la connexion ssh pour le conteneur existant n'est pas recommandée. Cela tue tout l'intérêt de l'isolation de l'hôte.

Configuration de l'accès SSH pour les conteneurs Docker [Intermédiaire à Expert]

Si vous n'êtes pas intéressé par le fonctionnement de ceci, vous pouvez ignorer cette section en toute sécurité. Je vais vous montrer avec un bidon factice. Vous pouvez suivre les étapes pour vous entraîner.

Exécuter un conteneur

Tout d'abord, vous devez démarrer un conteneur Docker. J'utiliserai le très petit alpine:latest image pour l'instant. Démarrez le conteneur avec cette commande :

docker run --rm --name ssh-test -it -p 7655:22 alpine:latest ash 

Certains points notables concernant les options de ligne de commande sont les suivants

  • Avec le --rm option, vous n'avez pas à supprimer explicitement le conteneur par la suite.
  • Le -it les options sont là pour que vous puissiez avoir un shell fonctionnel et interactif du conteneur.
  • Enfin, vous liez le port 22 du conteneur au numéro de port 7655 de l'hôte (ou à tout autre numéro de port qui n'est pas déjà utilisé par le démon SSH sur votre système hôte). Gardez à l'esprit le port que vous utilisez.

Configurer le démon SSH dans le conteneur

Vous devez maintenant installer le serveur ssh à l'intérieur du conteneur. Dans Alpine Linux, vous pouvez utiliser ces commandes :‌

apk update; apk add openssh-server

Ensuite, vous devez modifier rapidement un paramètre de configuration pour autoriser les connexions root. Vous pouvez le faire en éditant manuellement le fichier /etc/ssh/sshd_config ou en utilisant cette commande :

sed -E 's/^#(PermitRootLogin )no/\1yes/' /etc/ssh/sshd_config -i 

Générez les clés de l'hôte avec :

ssh-keygen -A

Enfin, démarrez le serveur ssh, exécutez /usr/sbin/sshd & . Vérifiez s'il est en cours d'exécution par ps aux .

Définissez un mot de passe pour le compte root de votre conteneur

Par défaut, le compte root de votre conteneur n'a pas de mot de passe. Si vous lui ouvrez un accès SSH, vous devez définir le mot de passe du compte root.

Vous pouvez utiliser la commande passwd sans aucune option et suivre les instructions à l'écran :

passwd

Se connecter au conteneur via SSH

À partir d'un autre hôte, essayez de vous connecter au conteneur maintenant.

ssh [email protected]_address_of_host_server -p port_number

Vous n'avez pas besoin du -p option si vous vous êtes lié au port 22 précédemment. Pour IP, utilisez l'adresse IP du serveur hôte (pas celle du conteneur).

Lorsque vous exécutez la commande, vous devriez voir une sortie semblable à celle-ci :

[email protected]:/mnt/data/documents/Linux Handbook/container-ssh$ ssh [email protected]
   [email protected]'s password: 
   Welcome to Alpine!
   
   The Alpine Wiki contains a large amount of how-to guides and general
   information about administrating Alpine systems.
   See <http://wiki.alpinelinux.org/>.
   
   You can setup the system with the command: setup-alpine
   
   You may change this message by editing /etc/motd.
   
   c4585d951883:~#

Comment ça marche ?

Cela se comprend mieux visuellement. Jetez un oeil au schéma suivant :‌

Considérez les conteneurs comme une machine virtuelle dont le port 22 est collé avec le port 7655 de l'hôte (ou celui que vous avez choisi). Cela vous permet d'avoir deux processus ssh différents exécutés sur la même machine liée à des ports différents.

Supposons que vous utilisiez un autre port pour SSH sur le système hôte et que vous colliez le port 22 avec le port du conteneur. Maintenant, si quelqu'un essaie de se connecter au serveur hôte en utilisant le port SSH par défaut 22, il se trouvera dans le système de fichiers racine du conteneur.

Configuration de SSH pour les conteneurs à l'aide de Docker Compose [Experts]

Ce ne serait pas juste si je vous laissais là sans vous fournir une option fiable pour un conteneur de serveur SSH.

Si vous vouliez profiter d'un serveur ssh différent et isolé avec un système de fichiers racine séparé exécuté sur votre système distant, cela pourrait être fait, mais pas en suivant la procédure pas à pas précédente, c'est-à-dire en installant et en configurant sshd sur une base en cours d'exécution récipient.

Tout simplement parce que ce n'est pas facilement reproductible, chaque modification que vous apportez au conteneur en cours d'exécution n'est pas persistante, un redémarrage du conteneur et tout est parti.

Donc, ici, je vous donne un moyen beaucoup plus simple, facilement reproductible et configurable de déployer un conteneur de serveur SSH sur votre hôte distant.

Prérequis

Vous devez évidemment installer docker compose. Une connaissance de base de docker compose est indispensable ici.

Étant donné que vous accéderez au serveur via des clés SSH, vous devez ajouter la clé SSH publique de votre système local au répertoire de votre serveur Linux hôte où se trouve le fichier docker-compose et conserver le nom "id_rsa.pub" juste pour être sûr.

Préparer le fichier de composition

Je suggère d'utiliser le linuxserver/openssh-server image. Il s'agit d'une image très légère avec des options de configuration suffisantes via des variables d'environnement.

Ici, tout le fichier de composition va être collé. Copiez ceci à un emplacement sur votre serveur et nommez le fichier docker-compose.yaml .‌

version: "3.7"

services:
    ssh:
        image: "linuxserver/openssh-server"
        ports:
            - "22:2222"
        volumes:
            - "./id_rsa.pub:/pubkey:ro"
        environment:
            PUID: ${ID}
            PGID: ${ID}
            TZ: ${TZ}
            PUBLIC_KEY_FILE: "/pubkey"
            SUDO_ACCESS: "false"
            PASSWORD_ACCESS: "false"
            USER_NAME: ${USER_NAME}
        restart: "always"

Un tout petit fichier de composition, n'est-ce pas ? Laissez-moi vous expliquer différentes parties de ce fichier de composition.

Volume : Vous n'avez qu'un seul montage de liaison, qui monte la clé publique dans le conteneur en tant que pubkey . Il est également en lecture seule.

Port : Le processus sshd à l'intérieur du conteneur s'exécute sur le port 2222. C'est pourquoi j'ai lié ce port au port 22 de mon hôte. Modifiez 22 en fonction de vos besoins, mais n'oubliez pas que vous en aurez besoin pour vous connecter au conteneur via SSH plus tard.

Variables d'environnement :

  • USER_NAME :L'utilisateur du conteneur, vous vous connecterez à partir de votre machine locale.
  • PUID et PGID :UID et GID de USER_NAME. Ceci est facultatif, le conteneur attribuera automatiquement une paire d'ID non root si les variables d'environnement ne sont pas définies.
  • TZ :votre fuseau horaire actuel. Vous pouvez l'obtenir par cat /etc/timezone .
  • PUBLIC_KEY_FILE :l'emplacement du fichier de clé publique
  • SUDO_ACCESS &PASSWORD_ACCESS :explicite.

Politique de redémarrage : J'ai défini la politique de redémarrage "toujours" qui redémarrera le conteneur même si le démon est rechargé.

Déployer le service

Pour vous faciliter la tâche, j'ai créé un script Bash qui vous posera quelques questions et, en fonction de la réponse, il déploiera le service.

#! /usr/bin/env bash

vars=("ID" "USER_NAME")
defaults=("991" "dummy")
questions=("What'd be your preferred UID & GID for the username of your choice? [default] " "Your preferred username for the container? [dummy] ")

put()
{
    echo "$1" >> .env
}

for i in {1..0}; do
    read -p "${questions[$i]}" ans
    case $ans in
        ""|"default")
            put "${vars[$i]}=${defaults[$i]}" ;;
        *)
            put "${vars[$i]}=$ans" ;;
    esac
done

put "TZ=$(cat /etc/timezone)"

docker-compose up -d

J'ai enregistré le script bash sous deploy.sh dans le même répertoire où se trouvait le fichier docker-compose.

Maintenant, si vous exécutez ce script, il vous posera quelques questions, puis exécutera le conteneur docker :

bash deploy.sh

Une fois que c'est fait, essayez de vous connecter au serveur :

ssh [email protected] -p port 

Ceci conclut cet article sur ssh avec des conteneurs docker. Si vous l'avez aimé, ou si vous avez autre chose à mentionner, n'hésitez pas à commenter ci-dessous ou à me tweeter @imdebdut.

Si vous souhaitez que j'écrive un autre article, n'hésitez pas à me le faire savoir.


Linux
  1. Comment Ssh dans un répertoire spécifique ?

  2. Comment exécuter MySQL dans un conteneur Docker

  3. Comment monter un répertoire hôte dans un conteneur Docker

  4. Comment attribuer une adresse IP statique à un conteneur Docker

  5. Comment installer Vim dans un conteneur Docker

Comment se connecter en SSH à un conteneur Docker et exécuter des commandes

Comment exécuter PHPMyAdmin dans un conteneur Docker

Comment exécuter Grafana dans un conteneur Docker

Comment se connecter en SSH aux conteneurs Docker [étape par étape]

Comment configurer un conteneur Apache Docker

Comment gérer les conteneurs Docker