Connexion SSH, la méthode ultime?!…
Sécuriser l’accès à son serveur SSH est essentiel. Modifier le port d’écoute (22 par défaut), refuser l’authentification par mot de passe (option PasswordAuthentication no), utiliser des clés SSH ed25519 et des algorithmes de chiffrement forts (…) sont autant de bonnes pratiques mais la meilleure sécurité est encore d’empêcher la connexion directe au serveur depuis internet. C’est ce que nous allons mettre en place ici.
Le principe consiste à intercaler un serveur « de confiance » utilisé comme serveur rebond _ rbd _ pour établir la connexion entre le serveur client _ clt _ et le serveur distant _ dst _ à connecter.
Conventions:
- rbd écoute sur le port 30022 et user1 son compte d’accès ssh
- dst écoute sur le port 40022 et user2 son compte d’accès ssh
- port aléatoire 61587 de rbd transféré sur l’hôte local de dst
Commande sur dst :
dst $ ssh -N -R 61587:localhost:40022 user1@rbd -p 30022 &
où -N n’exécute aucune commande distante et -R transfère le port aléatoire sur le port de dst.
Pour garantir la connexion de dst sur rbd, on utilisera la commande autossh ainsi :
dst $ autossh -M 15695 -N -R 61587:localhost:40022 user1@rbd -p 30022 &
où -M est le port de monitoring de la commande autossh.
On utilisera cette dernière commande dans un script bash tunnel_reverse.sh
=> À présent, rbd surveille le port 61587 et le transfère à dst. On va donc demander à clt de se connecter à dst par rebond sur rbd.
Commande sur clt :
clt $ ssh -N -J user1@rbd:30022 -p 61587 user2@localhost &
où -J connecte dst en connectant d’abord rbd qui le redirige vers la destination finale.
=> Désormais, le tunnel est ouvert entre clt et dst sans que l’un et l’autre ne puissent établir une connexion directe. On obtient alors un shell sur le serveur distant dst.
On peut utiliser cette technique pour rediriger un port de notre client sur le serveur distant afin d’accéder à des services locaux de ce dernier, comme par exemple un serveur VNC…
clt $ ssh -N -J user1@rbd:30022 -L 5901:localhost:5901 -p 61587 user2@localhost &
De la même manière, on peut utiliser la commande ‘rsync’ qui repose sur ssh :
clt $ rsync -av -e ‘ssh -J user1@rbd:30022 -p 61587' /source user2@localhost:/cible
Dernier point, il est souhaitable de ne pas laisser active la connexion du serveur distant si elle n’est pas utilisée par le client. N’ayant aucun accès SSH à cette machine, on peut envisager de déclencher cette connexion en exécutant un script open.php sur son serveur web.
Il faut donc permettre à l’utilisateur www-data (ou httpd ou _www) d’exécuter le script bash tunnel_reverse.sh en tant que user2 afin de disposer de ses droits ssh.
On va associer un bash et un $HOME à cet utilisateur, générer ses clés ed25519, les autoriser pour user2 et initier une première connexion afin de renseigner son fichier known_hosts.
dst # nano /etc/passwd … www-data:x:33:33:www-data:/var/www:/bin/bash … dst # mkdir /home/www_data & chown -R 33:33 /home/www_data & su – www_data dst $ ssh-keygen -o -a 100 -t ed25519 & exit dst # cat /home/www_data/.ssh/id_ed25519.pub >> /home/user2/.ssh/authorized_keys & su – www_data dst $ ssh -p 40022 user2@localhost & exit … Are you sure you want to continue connecting (yes/no)? yes …
Utiliser ce script tunnel_reverse.sh pour activer le tunnel sur dst
#!/bin/bash autossh -M 15695 -N -R 61587:localhost:40022 user1@rbd -p 30022 & echo $? > tunnel.pid #on récupère ainsi le pid du process exit 0
Utiliser ce script open.php pour déclencher le script tunnel_reverse.sh
<?php $cmdssh = 'ssh -p 40022 user2@localhost \''; $fonction = '/bin/bash'; $script = '/chemin/du/script/tunnel_reverse.sh'; $requete = $fonction.' '.$script; $condition = 'if ! '.$requete.'; then echo "false" 2>&1; fi'; $command = $cmdssh.$requete.' 2>/dev/null >/dev/null &\''; $output = shell_exec($command); echo $output; echo "Opened ! "; ?>
Utiliser ce script tunnel_kill.sh pour fermer le tunnel sur dst
#!/bin/bash process=$(cat tunnel.pid) kill "$process" rm tunnel.pid exit 0
Utiliser ce script close.php pour déclencher le script tunnel_kill.sh
<?php $cmdssh = 'ssh -p 40022 user2@localhost \''; $fonction = '/bin/bash'; $script = '/chemin/du/script/tunnel_kill.sh'; $requete = $fonction.' '.$script; $condition = 'if ! '.$requete.'; then echo "false" 2>&1; fi'; $command = $cmdssh.$requete.' 2>/dev/null >/dev/null &\''; $output = shell_exec($command); echo $output; echo "Terminated ! "; ?>
Une fois les scripts en place, on peut (dés)activer le tunnel par le serveur web dst en pointant l’URL du script depuis un navigateur, depuis un shell ou un script bash :
clt $ curl -v https://dst/open.php clt $ curl -v https://dst/close.php & > /dev/null 2>&1
Cette dernière méthode sera utilisée pour programmer des sauvegardes automatiques sur le serveur distant via l’outil cron.
Pour me contacter par IM: regeek@im.azurs.fr ou par mail: admin@azurs.fr

WhatsApp