Méthodes pour le suivit de connection SSH

Méthodes pour le suivit de connection SSH

WORMS David

By WORMS David

11 nov. 2024

Catégories
DevOps & SRE
Tags
Bash
DevOps
Vous appréciez notre travail......nous recrutons !

Ne ratez pas nos articles sur l'open source, le big data et les systèmes distribués, fréquence faible d’un email tous les deux mois.

Pour des besoins d’enseigmement chez Adaltas, nous fournissons des conteneurs isolés à nos étudiants. Les étudiants disposent d’une connexion SSH commune et sont redirigés vers un conteneur dédié fonctionnant sur l’un de nos serveurs accessibles depuis Internet. Par exemple, l’utilisateur gollum se connecte en SSH au serveur public middle.land.org et se retrouve à l’intérieur du conteneur misty-mountains.

Il existe plusieurs méthodes pour transférer la connexion SSH d’un hôte à un autre. Mais après avoir recherché des instructions, nous avons remarqué qu’il y avait étonnamment peu de pages couvrant ce sujet.

Quatre méthodes différentes de transmission SSH sont présentées pour permettre un accès distant sécurisé via un serveur intermédiaire : le chaînage SSH direct, la configuration sshd, les fichiers de démarrage Bash et le tunneling SSH.

Schéma du réseau

Dans cet article, nous considérerons un schéma de réseau où le client se connecte depuis un hôte local à un hôte cible dans un réseau privé via un hôte distant exposé à Internet.

Vue d'ensemble du réseau

Ci-dessous, nous utilisons les variables REMOTE_USER, REMOTE_HOST, TARGET_USER et TARGET_HOST pour l’utilisateur et l’hôte distant et cible respectivement. Il est également supposé que les clés d’identité SSH sont correctement configurées sur tous les hôtes.

REMOTE_USER="<to_be_completed>"
REMOTE_HOST="<to_be_completed>"
TARGET_USER="<to_be_completed>"
TARGET_HOST="<to_be_completed>"

Méthode 1 - Exécution de SSH sur SSH en une seule commande

La commande ssh prend en charge l’argument command optionnel. Lorsqu’il est fourni, la commande est exécutée sur l’hôte distant au lieu d’afficher un shell de connexion. Pour exécuter SSH sur SSH, il suffit d’exécuter la commande comme ceci :

ssh -t $REMOTE_USER@$REMOTE_HOST ssh $TARGET_USER@$TARGET_HOST

Lorsqu’une connexion SSH à l’hôte distant est établie, elle exécute la commande ssh suivante. L’option -t force l’allocation pseudo-tty. Si vous ne la spécifiez pas, vous recevrez l’avertissement Pseudo-terminal will not be allocated because stdin is not a terminal et votre terminal ne fonctionnera pas correctement.

Cette commande est équivalente à l’exécution séquentielle des commandes ssh.

ssh $REMOTE_USER@$REMOTE_HOST
ssh $TARGET_USER@$TARGET_HOST

Vous pouvez même créer une chaîne de plusieurs transferts SSH. Chaque commande ssh à l’exception de la dernière doit être appelée avec l’option -t :

ssh \
  -t $REMOTE_USER@$REMOTE_HOST ssh \
  -t $TARGET_USER@$TARGET_HOST ssh \
  $NEXT_TARGET_USER@$NEXT_TARGET_HOST

Avantages et inconvénients

C’est la méthode la plus directe pour rediriger la connexion SSH. Pour l’utilisateur final, elle nécessite une connaissance du réseau interne et l’enrichissement de la commande.

Méthode 2 - Exécution de SSH sur SSH en configurant sshd_config

sshd_config is sshd est le fichier de configuration système du service sshd. Habituellement, il se trouve dans le répertoire /etc/ssh/.

La propriété ForceCommand force l’exécution de la commande passée en valeur. Elle est exécutée sur l’hôte distant après l’authentification SSH. Pour appliquer cette règle uniquement à un utilisateur spécifique, vous pouvez utiliser le mot-clé Match pour introduire un bloc conditionnel avec le critère User.

Sur l’hôte distant, enrichissez la configuration /etc/ssh/sshd_config ou créez un nouveau fichier dans le répertoire /etc/ssh/sshd_config.d/. Redémarrez le service sshd pour appliquer la configuration :

# Configuration
cat <<CONF | sudo tee /etc/ssh/sshd_config.d/forwarding.conf
Match User $REMOTE_USER
	ForceCommand ssh $TARGET_USER@$TARGET_HOST
CONF
# Changes application
sudo systemctl restart sshd

Maintenant, pour accéder à l’hôte cible depuis l’hôte local, vous pouvez simplement exécuter la commande SSH de base.

ssh $REMOTE_USER@$REMOTE_HOST

Avantages et inconvénients

L’utilisation de cette méthode permet de simplifier la commande pour l’utilisateur final pour se connecter à l’hôte cible. Cependant, elle nécessite des modifications du fichier de configuration global, ce qui peut être écrasant lorsque vous configurez de telles règles pour plusieurs utilisateurs et les connectez à différents hôtes cibles.

Méthode 3 - Exécution de SSH sur SSH en configurant les fichiers de démarrage Bash

Lorsque Bash est invoqué comme shell de connexion, il lit et exécute d’abord les commandes des fichiers de démarrage Bash. L’ordre d’exécution de ces fichiers est décrit dans le manuel de documentation.

Le fichier ~/.bash_login est l’un de ces fichiers de démarrage Bash. Il peut être utilisé pour poursuivre une connexion SSH vers l’hôte cible, après la connexion SSH à l’hôte distant. Vous pouvez le créer et y mettre la commande ssh comme :

ssh $TARGET_USER@$TARGET_HOST

Pour accéder à l’hôte cible, comme dans la méthode précédente, vous devez simplement exécuter sur votre hôte local la commande SSH de base.

ssh $REMOTE_USER@$REMOTE_HOST

Avantages et inconvénients

Par rapport aux autres, cette méthode est plus facile à utiliser et à gérer. Tous les paramètres sont effectués dans les répertoires personnels des utilisateurs sur l’hôte distant. Cela implique moins d’efforts de gestion lors de la mise en service et de la désactivation de l’accès pour plusieurs utilisateurs.

Elle offre également des capacités d’automatisation. Pour tout besoin de provisionnement, vous pouvez étendre le script dans un fichier de démarrage Bash. Par exemple, vous pouvez créer un conteneur Docker à la volée puis y entrer. Le script bash d’exemple dans ~/.bash_login peut ressembler à ceci :

# Export container name
export CONTAINER=$USER-container

if [ ! "$(docker ps -aqf name=$CONTAINER)" ]
then
  # Run container if not exists
  docker run -it --name $CONTAINER IMAGE
else
  # Start container if not running
  docker start -i $CONTAINER
fi

# Exit SSH session on container exit
exit

Ici, nous construisons un nom de conteneur basé sur le nom de l’utilisateur exporté par $USER. Ensuite, nous vérifions si un conteneur avec le nom donné existe déjà. S’il n’existe pas, nous le créons, le démarrons et y entrons en utilisant les options -it pour allouer un pseudo-TTY et attacher STDIN. Sinon, nous le démarrons simplement en attachant STDIN avec l’option -i.

Finalement, lorsque l’utilisateur final se connecte à l’hôte distant via SSH, il est dirigé vers un environnement virtuel isolé fonctionnant dans un conteneur Docker.

Méthode 4 - Transfert de port local SSH (aussi connu sous le nom de tunneling SSH)

Le suivi de port local SSH (également appelé tunneling SSH) vous permet de transférer un port sur l’hôte local vers un port sur l’hôte distant, qui est ensuite transféré vers un port sur l’hôte cible.

Pour créer un transfert de port local, passez l’option -L à la commande ssh :

ssh -L [$LOCAL_HOST:]$LOCAL_PORT:$TARGET_HOST:$TARGET_PORT $REMOTE_USER@$REMOTE_HOST

En plus de TARGET_HOST, REMOTE_USER, REMOTE_HOST introduits ci-dessus, les options utilisées sont les suivantes :

  • [LOCAL_HOST:]LOCAL_PORT : l’adresse IP locale et le numéro de port. Lorsque LOCAL_HOST est omis, la valeur par défaut localhost est utilisée. Tout numéro de port supérieur à 1024 comme LOCAL_PORT peut être utilisé. Les numéros de port inférieurs à 1024 sont des ports privilégiés et ne peuvent être utilisés que par root.
  • TARGET_PORT : le port de l’hôte cible, par défaut est 22.

De plus, il est utile d’ajouter les options suivantes à la commande ssh :

  • -N : pour ne pas exécuter de commande distante lors de la connexion à REMOTE_HOST qui est un shell de connexion.
  • -f : indique à la commande ssh de s’exécuter en arrière-plan pour ne pas verrouiller la fenêtre du terminal.

La commande complète ressemblera à ceci :

ssh -N -f -L \
  [$LOCAL_HOST:]$LOCAL_PORT:$TARGET_HOST:$TARGET_PORT \
  $REMOTE_USER@$REMOTE_HOST

Une fois le transfert de port local SSH créé, vous pouvez accéder à l’hôte cible en exécutant ssh avec l’option -p avec le LOCAL_PORT spécifié ci-dessus :

ssh $TARGET_USER@localhost -p $LOCAL_PORT

Avantages et inconvénients

Cette méthode est beaucoup plus verbeuse et difficile à utiliser. L’utilisateur final doit exécuter des commandes non triviales et maintenir le processus supplémentaire du tunnel SSH en cours d’exécution sur son hôte local.

Conclusion

Cet article présente 4 méthodes différentes pour transférer une connexion SSH. Certaines sont pratiques à utiliser comme commandes ad hoc, d’autres sont adaptées à l’automatisation.

Partagez cet article

Canada - Maroc - France

Nous sommes une équipe passionnée par l'Open Source, le Big Data et les technologies associées telles que le Cloud, le Data Engineering, la Data Science le DevOps…

Nous fournissons à nos clients un savoir faire reconnu sur la manière d'utiliser les technologies pour convertir leurs cas d'usage en projets exploités en production, sur la façon de réduire les coûts et d'accélérer les livraisons de nouvelles fonctionnalités.

Si vous appréciez la qualité de nos publications, nous vous invitons à nous contacter en vue de coopérer ensemble.

Support Ukrain