Tunnel SSH inversé vers RDP / VNC / SSH via un serveur tiers

La mise en place d'un tunnel SSH inversé se fait dans le contexte suivant:

On veut accéder à un poste dit “client” qui a un service SSH, RDP ou VNC activé mais pas disponible à l'extérieur de son réseau local

On dispose d'un serveur SSH disponible sur Internet

Le poste “client” peut se connecter sur un serveur SSH sur Internet

Le poste a partir duquel on veut accéder au “client” peut se connecter sur un serveur SSH sur Internet

Sur le serveur SSH tiers

On accepte les connections via authentification par clés publiques seulement

Un compte utilisateur assigné au poste “client” est configuré, sans shell. La clé publique correspondant au poste “client” y est installée.

Un compte “technicien” est configuré, sans shell (ou avec, selon). La clé publique correspondant au poste “technicien” y est installée.

Un compte “administrateur” est configuré, avec shell. La clé publique correspondant au poste “administrateur” y est installée.

Sur un client GNU/Linux

Les applications ssh et ssh-keygen disponibles lorsque le paquet openssh-client est installé

gSTM pour activer le tunnel sur demande (via le paquet ayant le même nom)

openssh-server installé et configuré pour accepter uniquement les connections par authentification par clés publiques

La clé publique du poste “technicien” est ajoutée à la fin du fichier .ssh/authorized_keys

Installation des applications:

sudo apt install openssh-server openssh-client gstm

Configuration du service SSH:

Dans /etc/ssh/sshd_config:

PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes

À partir de Windows

Pour mettre en place un tunnel SSH vers un poste Windows (RDP) il faut:

Puttygen.exe (générateur de clés SSH) pour générer la paire de clés publique / privée permettant la connection

Putty.exe (client SSH) pour activer le tunnel sur demande

RDP actif et l'utilisateur configuré pour accepter les connections

Putty est disponible ici (prendre les versions 64-bit de préférence): https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

Génération de paire de clés SSH

GNU/Linux - SSH

À partir du compte utilisateur:

mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa -b 4096

Vous pourrez indiquer une phrase secrète pour la paire de clés et confirmer leur emplacement. Cette phrase secrète protégera votre clé privée pendant son stockage:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/b/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/b/.ssh/id_rsa.
Your public key has been saved in /home/b/.ssh/id_rsa.pub.

La clé publique sera disponible dans le fichier .ssh/id_rsa.pub dans le dossier de l' utilisateur.

Windows - Putty

Démarrer puttygen.exe

Accepter l'avertissement d'installation Windows

*Parameters > Type of key*: RSA

*Parameters > Number of bits*: 4096

*Actions > Generate* Important: il faut bouger la souris dans la région blanche!

Une fois terminé, assigner un mot de passe

À partir d'un poste GNU/Linux, générer un mot de passe (avec pwqgen par exemple)

Mettre le mot de passe dans *Key passphrase* et *Confirm passphrase*

Cliquer dans la section *Key > Public key*, choisir *Tout sélectionner* et coller cette information dans un nouveau fichier *PCXXX-NOM_Client_SSH-pub.txt* - mettre dans *Documents*

Actions > Save the generated key > Save private key > PCXXX-NOM_Client_SSH - mettre dans Documents, l'extension est .ppk par défaut (note: pour fins de backup)

Demander à un administrateur d'ajouter l'accès au compte SSH correspondant sur $GW_HOSTNAME à l'aide de la clé publique SSH enregistrée dans *Documents*

Configuration du tunnel SSH (session Putty)

Démarrer putty.exe

Dans *Basic settings*:

*Host Name*: $GW_HOSTNAME (nom de domaine de la passerelle SSH cible)

*Port*: 22 (ou autre)

*Save Sessions*: PCXXX-NOM_Tunnel_RDP (caractères de soulignement importants)

Click *Save*

Dans *Connection*:

*Seconds between keepalives (0 to turnoff)*: 30

*Data > Login Details > Auto-login username*: $USERNAME (nom d'utilisateur GNU/Linux fourni par l'admin)

*SSH > Protocol options > Don't start a shell or command at all* (cocher)

*SSH > Protocol options > Enable compression*

*SSH > Tunnels > Add new forwarded port > Source port*: 2000 (ou autre)

*SSH > Tunnels > Add new forwarded port > Destination*: 192.168.X.XXX:3389 (IP du système Windows 7 cible, port RDP)

Click *Add*

Click sur *Session* et enregistrer la session

SSH > Auth > Private key file for authentication > Pointer vers Documents/fichier .ppk de la clé privée

Retourner à Session, clicker 1 fois sur le profil et sauvegarder

Tester le tunnel et la connection RDP

Démarrer putty.exe

Session > Load, save or delete a stored session > Saved sessions, click 1 fois sur le profil, ensuite click Load

Click Open, accepter l'avertissement clé SSH

Une fenêtre noire Putty devrait s'ouvrir, entrer le mot de passe de la clé SSH

Ouvrir l'outil RDP de Windows

Spécifier 127.0.0.1:2000 (ou autre port au lieu de 2000) comme adresse, tester avec les informations RDP du poste serveur

Faire le raccourci mRemoteNG

Installer “mRemoteNG”:https://mremoteng.org/

Ajouter le tunnel (connection SSH2): *Fichier > Nouvelle connection* (ou Ctrl-N)

Affichage > Nom: PCXXX-NOM SSH Tunnel

Affichage > Panneau: PCXXX-NOM SSH Tunnel

Connexion > Nom d'hôte/IP: $GW_HOSTNAME (nom du serveur passerelle)

Connexion > Nom d'utilisateur: fourni par l'admin système

Connexion > Mot de passe: celui qui protégeait la clé SSH

Protocole > Protocole: SSH2

Protocole > Port: 22 (ou autre)

Session Putty > choisir celle enregistrée lors de la création de session

Ajouter la connection RDP: *Fichier > Nouvelle connection* (ou Ctrl-N)

Affichage > Nom: PCXXX-NOM accès RDP

Affichage > Panneau: PCXXX-NOM accès RDP

Connexion > Nom d'hôte/IP: 127.0.0.1

Connexion > Nom d'utilisateur: celui sur le PC Windows cible

Connexion > Mot de passe: celui sur le PC Windows cible

Protocole > Protocole: RDP

Protocole > Port: 2000 (ou autre)

Session Putty > choisir celle enregistrée lors de la création de session