chiffrer UltraVNC avec SSH

Présentation

Le protocole VNC permet de prendre la main à distance dans un ordinateur, et de partager l'écran entre les deux interlocuteurs (celui qui est à distance, et celui qui travaille devant le poste).

C'est un mécanisme particulièrement utile pour réaliser de l'assistance utilisateur.

Toutefois, le protocole VNC n'est pas crypté. Par défaut, il utilise en outre un mot de passe, non chiffré (ou très légèrement), qui est en général unique lors d'un déploiement d'un parc informatique.

Pour sécuriser VNC, deux mécanismes vont être utilisés :

    • l'activation d'un tunnel SSH, pour chiffrer la communication « de bout en bout »
    • le remplacement de l'identification VNC native (un mot de passe unique) par une identification basée sur un challenge/réponse de Windows (utilisation d'un compte du domaine).

Cette architecture est construite avec :

    • COPSSH, une implémentation d'OpenSSH, facile à installer et fonctionnant avec Cygwin ;
  • UltraVNC, un logiciel VNC qui a rajouté une surcouche permettant l'identification, au moment de la prise de main, par un compte du domaine.

Attention : UltraVNC ne fonctionne pas en réseau étendu, les performances sont insuffisantes. Si vous avez besoin de prendre la main à distance dans des machines fonctionnant avec Windows, utilisez plutôt le module intégré d'assistance à distance proposé par Microsoft.

Créer un compte dans le domaine

La connexion au serveur SSH va être réalisée avec un compte du domaine, qui devra disposer des droits les plus réduits possibles.

Groupe créé : sshgroupe

Compte créé : sshcompte

Ce compte ne fait partie que d'un seul groupe : sshgroupe (groupe primaire). Au niveau Windows, il est mappé nativement sur ce groupe (onglet Samba dans LdapAccountManager).

Attention : il est essentiel que le compte sshcompte ait, comme groupe primaire, le groupe sshgroupe. Cette information est reprise lors de la définition des droits dans le serveur ssh.

Vous pourrez faire évoluer le mot de passe comme vous le souhaitez, et notamment le modifier dès qu'un gestionnaire de parc quitte votre organisation.

Installer COPssh

COPssh peut être téléchargé depuis cette page : https://www.itefix.no/i2/copssh-get. Deux versions sont disponibles : une assez ancienne, gratuite, et une payante, plus récente, qui contient en plus des outils d'administration.

La version gratuite est suffisante pour ce qu'on veut faire.

L'installation peut être réalisée en mode interactif, ou en mode silencieux (voir plus loin). En mode interactif, validez les différents choix proposés par défaut.

Définir les droits

Notre objectif est de ne pouvoir se connecter à la machine distante qu'avec le compte du domaine sshcompte, défini précédemment. Pour cela, le plus simple est d'exécuter les commandes suivantes :

cd "c:\Program Files\ICW\Bin"
c:
mkgroup.exe -d -g sshgroupe > "c:\Program Files\ICW\etc\group"
mkpasswd -d -u sshcompte > "c:\Program Files\ICW\etc\passwd"
mkpasswd -l -u SvcCOPSSH >> "c:\Program Files\ICW\etc\passwd"
mkpasswd -l -u sshd >> "c:\Program Files\ICW\etc\passwd"

La première commande permet de définir le groupe auquel appartient le compte sshcompte. Les trois autres commandes donnent les droits d'accès aux comptes nécessaires au bon fonctionnement du service : SvcCOPSSH, le compte utilisé pour gérer le service, sshd, le compte du démon, sshcompte, le compte de connexion.

Installer en mode silencieux

Pour réaliser une installation en mode silencieux, tapez la commande :

Copssh_3.1.4_Installer.exe /u=user /p=mot_de_passe /S

L'utilisateur indiqué est celui qui est utilisé pour gérer le service. Il sera créé automatiquement avec le mot de passe indiqué.

Pour des questions de sécurité, il peut être intéressant de générer aléatoirement le mot de passe. Pour cela, utilisez le script suivant1 pour lancer l'installation et, en même temps, donner les droits adéquats (ceux définis dans le paragraphe précédent) :

@echo off
rem script d'installation de Copssh en mode silencieux
rem generation d'un mot de passe aleatoire
setlocal enableDelayedExpansion
set liste="abcdefghijklmnopqrstuvwxyz0123456789&-_@()[]=+ABCDEFGHIJKLMNOPQRSTUVWXYZ"
set pass=
for /L %%l in (1,1,11) do (
set /a rnd=!RANDOM!*72/32767 + 1
call :generate !rnd!
)
goto :exit
:generate
set pass=%pass%!liste:~%1,1!
goto :exit_call
:exit
Copssh_3.1.4_Installer.exe /u=SvcCOPSSH /p=%pass% /S
rem Definition des droits
cd "c:\Program Files\ICW\Bin"
c:
mkgroup.exe -d -g sshgroupe > "c:\Program Files\ICW\etc\group"
mkpasswd -d -u sshcompte > "c:\Program Files\ICW\etc\passwd"
mkpasswd -l -u SvcCOPSSH >> "c:\Program Files\ICW\etc\passwd"
mkpasswd -l -u sshd >> "c:\Program Files\ICW\etc\passwd"
:exit_call

Déployer le serveur SSH dans une image

Il peut être tentant d'installer le serveur SSH dans un modèle d'ordinateur, pour en faire une image qui sera répliquée en multiples exemplaires.

Le seul souci de cette approche tient au fait que la clé d'identification (clé privée – clé publique) doit être unique pour chaque machine : dans le cas contraire, il suffit de récupérer la clé privée d'une machine quelconque pour pouvoir décrypter les communications pour l'ensemble du parc...

Deux solutions sont donc possible :

    • soit on installe le serveur SSH après clonage et descente de l'image dans les postes ;
    • soit on régénère la clé après descente de l'image dans les nouveaux postes.

Les deux opérations se valent techniquement.

Pour régénérer la clé (second cas), vous pouvez utiliser ce script :

@echo off
rem Programme de regeneration des cles RSA
echo "Regeneration des cles RSA"
cd "c:\Program Files\ICW"
c:
del etc\ssh_host_rsa_key* /Q
bin\ssh-keygen -f /etc/ssh_host_rsa_key -b 1024 -N "" -t rsa

Installer UltraVNC

Rappels sur le protocole VNC

Par défaut, le serveur VNC répond sur deux ports différents : 5900 pour les requêtes natives, et 5800 pour des requêtes java (accès via http://poste_distant:5800).

En théorie, n'importe quel client VNC est capable de se connecter à n'importe quel serveur VNC, dès lors que le protocole est totalement respecté (ce n'est plus le cas avec UltraVNC, lorsqu'on utilise l'identification à partir d'un compte du domaine).

Par défaut, la connexion au serveur VNC nécessite la saisie d'un mot de passe, stocké en clair (ou quasiment...). UltraVNC permet de sécuriser un peu mieux cet aspect, en rajoutant une surcouche qui permet d'utiliser un compte du domaine à la place du mot de passe classique. Le compte doit appartenir à un groupe défini dans la configuration d'UltraVNC pour disposer des droits d'accès.

Télécharger UltraVNC

Vous pouvez télécharger UltraVNC depuis le site : www.uvnc.com

Il existe des versions 32 et 64 bits. Préférez les installations de type .msi, plus facilement automatisables.

Installer UltraVNC dans Windows en mode interactif

L'installeur fonctionne par défaut de manière interactive. Il suffit d'accepter les paramètres proposés.

Paramétrer le serveur UltraVNC

Pour pouvoir paramétrer correctement UltraVNC, vous devez impérativement arrêter au préalable le service uvnc_service, faire vos configurations, puis redémarrer le service. Dans le cas contraire, les modifications ne seront pas prises en compte.

Plusieurs paramètres sont à positionner :

    • onglet Network
        • cochez Allow LoopBack Connections (permet la connexion locale depuis le serveur ssh) ;
        • cochez Loopback Only uniquement si vous voulez forcer le tunnel ssh dans tous les cas de figure, et si vous n'activez pas le pare-feu windows. Dans ce cas, l'accès via le client Java ne fonctionnera pas.
    • Onglet Security
        • cochez Require MS Logon ;
        • cliquez sur le bouton Configure MS Logon Groups ;
            • indiquez le groupe du domaine dont les membres auront le droit de se connecter, et précisez qu'il s'agit d'un groupe de domaine ;
        • Cochez Password Required ;
        • Décochez Allow shutdown Ultravnc, Allow edit clients, Allow properties (ces informations n'ont pas à être modifiées par les utilisateurs) ;
    • onglet Input/File transfert
        • décochez Disable Viewers Inputs (l'assistance utilisateur peut réaliser des opérations) ;
        • décochez Disable local inputs (l'utilisateur peut manipuler le clavier et l'écran pendant l'opération) ;
    • Onglet Connections
        • Idle Timeout : 600 (nombre de secondes avant déconnexion sans manipulation depuis le client vnc, soit 10 minutes, ce qui correspond, en général, au temps de verrouillage de l'écran) ;
        • cocher Display Query Windows : impose l'acceptation de l'utilisateur pour la prise de main à distance ;
        • TimeOut : 10 secondes (temps au delà duquel la connexion sera fermée si l'utilisateur ne valide pas la demande) ;
        • Default Action : Refuse (par défaut, la connexion est refusée) ;
        • Multiple Connections : refuse the new connection (évite qu'une nouvelle connexion ne soit lancée alors qu'une prise de main est en cours) ;
        • Disconnect : les préconisations de sécurité exigent, en général, que le poste soit au minimum verrouillé à la déconnexion. Dans la pratique, l'utilisateur étant devant son écran, et si une stratégie de verrouillage automatique de la session est programmée, on peut tolérer de ne rien faire (Do nothing).

Installer le serveur UltraVNC en mode silencieux

L'installation va être réalisée avec un paquet MSI, qui dispose, nativement, de l'option /quiet.

Les paramètres, eux, sont stockés dans le fichier ultravnc.ini : il suffit donc de le recopier dans la nouvelle installation.

Voici le script (adapté au réseau). Le fichier ultravnc.ini a été récupéré depuis un poste correctement configuré :

ultravnc_10962_x86.msi /quiet
net stop uvnc_service
copy ultravnc.ini c:\"program files"\"uvnc bvba"\ultravnc\ /Y
net start uvnc_service

Installer le client UltraVNC dans Linux

Le client UltraVNC fonctionne dans Linux ; il suffit d'installer auparavant la couche wine, qui sert d'émulateur Windows. Lancez ensuite le programme d'installation en utilisant wine. N'installez que le client.

Se connecter au serveur SSH

Activer le tunnel SSH

Nous allons nous connecter au serveur SSH (le poste à superviser), en réalisant une redirection du port.

Depuis Windows, avec PUTTY

Lancez Putty, puis indiquez les paramètres suivants :

    • Connexion
        • data
            • Auto-login Username : sshcompte
        • SSH
            • cochez Enable compression
            • Tunnels
                • Add new Forwarder Port
                    • Source port : 5901
                    • Destination : 127.0.0.1:5900
                    • bouton Add
    • Session
        • Saved Sessions : ssh-vnc
            • Bouton Save

Pour lancer la connexion, chargez la configuration précédemment sauvegardée (bouton Load), puis renseignez soit l'adresse IP, soit le nom de la machine à atteindre. Cliquez sur le bouton Open, puis, à l'invite, tapez le mot de passe du compte ssh.

Ainsi, le port machine_distante:5900 est maintenant accessible, en mode chiffré, à partir de l'adresse localhost:5901.

Conservez la session ssh ouverte tant que dure la prise de main à distance.

Depuis Linux

La commande à utiliser est la suivante :

ssh -l sshcompte poste_distant -L 5901:localhost:5900 -C

-l : nom du compte de connexion

poste_distant: nom ou adresse IP de la machine cible

-L : indique qu'on va demander une redirection du port

5901 : port local qui va être utilisé

localhost : machine du superviseur

5900 : port utilisé par le serveur VNC

-C : activation de la compression du flux (utile en réseau étendu)

Ainsi, la connexion est établie avec le compte ssh vers la machine poste_distant, et toutes les commandes adressées à « localhost:5901 » seront redirigées, en mode crypté, vers le port 5900 de poste_distant.

Vous pouvez créer un script qui vous permettra d'éviter de tout retaper à chaque fois :

ssh -l sshcompte $1 -L 5901:localhost:5900 -C

et vous pourrez l'utiliser ainsi :

./sshvnc.sh nom_machine

Lancer la prise de main avec UltraVNC

Il ne reste plus qu'à lancer le client UltraVNC.

Comme serveur VNC (zone Vnc Server), indiquez le port local redirigé : localhost::5901 (le nom de la machine et le port doivent être séparés par deux signes deux-points - :: ).

Cette configuration est donc identique, quel que soit le serveur à atteindre ; c'est la connexion ssh qui détermine le serveur interrogé.

Une fois la prise de main terminée...

Pensez à fermer votre session ssh, par appui sur les touches <ctrl> <D> dans la fenêtre ad-hoc.

Pour aller plus loin...

N'autoriser que la prise de main à distance via SSH

Si vous voulez imposer que la prise de main à distance ne soit réalisable qu'en mode chiffré, deux possibilités s'offrent à vous :

    • dans la configuration de UltraVNC, onglet Network, cochez LoopBack only : seules les connexions locales seront possibles ;
    • vous pouvez également activer le pare-feu windows. Les ports utilisés par VNC sont bloqués par défaut (5900 en protocole natif et 5800 pour le client Java). Il faut simplement autoriser le port SSH. Pour cela, dans les paramètres du pare-feu :
        • onglet Exceptions
            • Ajouter un port...
                • nom : SSH
                • port : 22
                • TCP

L'avantage de cette seconde configuration, c'est qu'elle fonctionne quel que soit le serveur VNC installé dans le poste (la première est spécifique à UltraVNC).

Vous pouvez également exécuter le fichier .reg suivant, qui rajoutera le port dans la base de registres (redémarrez le pare-feu ensuite pour que les paramètres soient pris en compte) :

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\GloballyOpenPorts\List]
"22:TCP"="22:TCP:*:Enabled:ssh"

Chiffrer l'accès VNC depuis le navigateur en utilisant le composant Java

Vous avez la possibilité de vous connecter à un poste, depuis un navigateur, en utilisant le composant VNC Java intégré (http://poste_distant:5800 en fonctionnement normal).

Pour que le chiffrement du flux fonctionne, nous allons devoir créer deux tunnels SSH (commandes données depuis Linux, mais vous pouvez adapter à Putty, le fonctionnement est identique). D'abord, nous créons une redirection pour le serveur Java :

ssh -l sshcompte poste_distant -L 5801:localhost:5800 -C

L'applet Java va ensuite avoir besoin de se connecter au serveur VNC, en utilisant l'adresse localhost:5900. Nous devons donc créer une redirection vers ce port-là :

ssh -l sshcompte poste_distant -L 5900:localhost:5900 -C

L'accès est maintenant possible depuis le navigateur, en tapant l'adresse : http://localhost:5801

Ce mode d'accès n'est possible que vers un seul poste distant à la fois, contrairement à l'accès natif (cf. paragraphe suivant).

Ouvrir plusieurs consoles vers différents postes

Si vous avez besoin de vous connecter à plusieurs postes en parallèle, vous devez :

    • ouvrir plusieurs tunnels SSH, en indiquant à chaque fois un port local différent (commandes données pour Linux, vous pouvez adapter à Putty – champ Source port à modifier) :
ssh -l sshcompte poste_distant1 -L 5901:localhost:5900 -C
ssh -l sshcompte poste_distant2 -L 5902:localhost:5900 -C
etc.
    • lancer plusieurs instances d'UltraVNC, en indiquant, dans l'adresse de la machine :
    • localhost::5901 pour le premier poste
    • localhost::5902 pour le second
    • etc.

1Script de génération aléatoire réalisé à partir de ce forum : http://www.developpez.net/forums/d831323/general-developpement/programmation-systeme/windows/scripts-batch/generer-mdp-aleatoire/