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 :
Cette architecture est construite avec :
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.
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.
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.
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.
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
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 :
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
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.
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.
L'installeur fonctionne par défaut de manière interactive. Il suffit d'accepter les paramètres proposés.
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 :
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
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.
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 :
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
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é.
Pensez à fermer votre session ssh, par appui sur les touches <ctrl> <D> dans la fenêtre ad-hoc.
Si vous voulez imposer que la prise de main à distance ne soit réalisable qu'en mode chiffré, deux possibilités s'offrent à vous :
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"
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).
Si vous avez besoin de vous connecter à plusieurs postes en parallèle, vous devez :
ssh -l sshcompte poste_distant1 -L 5901:localhost:5900 -C
ssh -l sshcompte poste_distant2 -L 5902:localhost:5900 -C
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/