
Méthodes pour le suivit de connection SSH
By WORMS David
11 nov. 2024
- Catégories
- DevOps & SRE
- Tags
- Bash
- DevOps
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.
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. LorsqueLOCAL_HOST
est omis, la valeur par défautlocalhost
est utilisée. Tout numéro de port supérieur à1024
commeLOCAL_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 parroot
.TARGET_PORT
: le port de l’hôte cible, par défaut est22
.
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 commandessh
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.