Du VNC sur Android depuis Ubuntu tunnelisé via SSH avec authentification par clé RSA

Ayant acquis tout récemment un nouveau mobile Android (et frappé - je dois dire - d'un ennui mortel sinon je l'aurais pas fait! ) j'avais pensé à accéder en VNC à mon PC qui roulait sous Ubuntu 14.04.

Plusieurs clients VNC existent sur le Market Android mais se connecter directement en VNC peut poser des problèmes de sécurité. Une des solutions qui existent est de tunneliser la connexion VNC via SSH; ça sera ça le sujet de ce tutorial.

Les outils nécessaires:

  • Côté Ubuntu:
    • Tight VNC Server: le serveur VNC qu'on va utiliser
    • OpenSSH Client: client OpenSSH
    • OpenSSH Server: serveur OpenSSH
    • gufw: interface graphique pour ufw (parefeu Ubuntu par défaut)
    • ddclient(optionnel): permet d'automatiser la mise à jour d'une adresse IP dynamique
    • lxde: Le bureau lxde est utilisé dans ce tutorial à cause d'un bug avéré du bureau Unity avec VNC (et probablement gnome aussi bien que je n'ai pas testé): ça donne un écran gris. (xcfe marche aussi, kde et autres bureaux non testés)
  • Côté Android:

Nous allons commencer côté Ubuntu.

Installation des dépendances:

sudo apt-get install tightvncserver openssh-client openssh-server lxde ddclient

Pour ddclient mettez n'importe quoi on changera ça plus tard.

Créez une clé RSA si c'est pas déjà fait:

ssh-keygen -t rsa -b 4096

Par défaut la clé est enregistré dans le dossier ~/.ssh; la clé privé id_rsa et la clé publique id_rsa.pub. Vous pouvez changer ça en ajoutant le switch -f nom_du_fichier ou en renseignant un autre fichier lorsque demandé.

Moi j'utilise une seule clé de 4096bits pour l'ensemble de mes applications (github, ssh, launchpad..) mais ce n'est pas une très très bonne idée à faire.

Ajoutez cette nouvelle clé à l'agent SSH:

ssh-add ~/.ssh/id_rsa

Copiez le contenu du fichier id_rsa.pub dans un fichier dans le dossier .ssh nommé authorized_keys; créez-le s'il n'existe pas déjà.

Par défaut le serveur SSH admet la connexion par mot de passe et ne permet pas la redirection de ports; éditez le fichier sshd_config:

sudo gedit /etc/ssh/sshd_config
En changeant vers ces paramètres:
Port un_port_de_votre_choix
PasswordAuthentication no
X11Forwarding yes
AllowTcpForwarding yes

Autres paramétrages intéressants:

AllowUsers votre_nom_d'utilisateur
MaxStartups 2:30:10
LoginGraceTime 30

Personnellement je change le port mis par défaut à 22 vers un port plus haut question de sécurité. (exemple: 9666 histoire de brouiller les pistes! )

Redémarrez le serveur ssh:

sudo service ssh restart

Vous pouvez établir des règles via UFW pour vous protéger des attaques par bruteforce; je développerais cette partie plus tard peut-être...

Lancez le serveur VNC pour configurer un mot de passe puis fermez-le:

vncserver
vncserver -kill :1

Éditez le fichier ~/.vnc/xstartup

gedit ~/.vnc/xstartup

en remplaçant le contenu par:

#!/bin/bash
xrdb $HOME/.Xresources
startlxde &

Rendez le fichier exécutable:

sudo chmod +x ~/.vnc/xstartup

Nous allons créer maintenant une entrée dans le répertoire init.d pour que notre serveur VNC démarre automatiquement au redémarrage de l'ordinateur.

Créez ce nouveau fichier:

sudo gedit /etc/init.d/vncserver

avec comme contenu:

#!/bin/bash
PATH="$PATH:/usr/bin/"
export USER="user"
DISPLAY="1"
DEPTH="16"
GEOMETRY="600x300"
OPTIONS="-depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY} -localhost"
. /lib/lsb/init-functions
case "$1" in
start)
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;
stop)
log_action_begin_msg "Stopping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;
restart)
$0 stop
$0 start
;;
esac
exit 0

en remplaçant user (dans export USER="user") par votre nom d'utilisateur!

600x300 est la résolution que j'ai trouvé bonne pour mon téléphone mais si vous avez une tablette ou voulez une résolution plus grande vous pouvez changer ça.

Rendez le fichier exécutable:

sudo chmod +x /etc/init.d/vncserver

Maintenant vous pouvez démarrer le serveur VNC avec:

sudo service vncserver start

et le stopper avec:

sudo service vncserver stop

Ajoutez le serveur VNC aux programmes au démarrage:

sudo update-rc.d vncserver defaults

Procurez-vous un compte chez no-ip et ajoutez un nouveau hôte.

C'est pour faciliter la connexion puisque vous avez une adresse ip dynamique (n'est-ce pas?!). Personnellement j'utilise no-ip mais vous pouvez utiliser un autre fournisseur et régler le client à votre guise.

Configurez ddclient en éditant le fichier:

sudo gedit /etc/ddclient.conf

en remplaçant le contenu par:

daemon=3600
pid=/var/run/ddclient.pid
protocol=dyndns2
use=web, web=checkip.dyn.com/, web-skip='IP Adress'
server=dynupdate.no-ip.com
ssl=yes
login=votre_login_noip
password='votre_mot_de_passe_noip'
votre_hôte_noip

Redémarrez le client ddclient:

sudo /etc/init.d/ddclient restart

Via l'interface de gufw ajouter le port de votre serveur SSH aux exceptions du pare-feu:

Via l'interface de votre routeur section configuration NAT assignez le port que vous avez choisi à votre machine Ubuntu: (exemple ici l'interface de mon routeur Huawei):

Pensez à configurer Network Manager à se connecter à une ip statique aussi:

J'ai mis l'adresse ip statique ici à 192.168.1.3 mais pensez à mettre un chiffre plus grand (en fonction de l'adresse de base de votre routeur) pour que d'autres machines se connectant à votre routeur ne la prennent pas avant vous. (exemple: 192.168.1.69)

Maintenant nous avons terminé avec la configuration du PC Ubuntu et du routeur passons à la configuration du téléphone.

Installez ConnectBot et VNC Viewer

Copiez les fichiers id_rsa et id_rsa.pub qui se trouvent dans le dossier .ssh de votre home vers la racine de la carte sd de votre téléphone.

Le dossier .ssh est un dossier caché que vous pouvez visualiser dans Nautilus avec le raccourci ctrl+h)

Maintenant dans ConnectBot allez dans le menu Gérer les clés publiques puis dans le menu Importer et cliquez sur votre fichier d'identité id_rsa. La clé est verrouillée cliquez dessus et mettez le mot de passe de la clé pour la dévérouiller.

Une fois la clé ajoutée vous pouvez effacer les fichiers depuis la racine de votre carte sd.

Allez dans la fenêtre principale de ConnectBot et mettez dans l'adresse votre_nom_d'utilisateur_Ubuntu@votre_hôte_noip. Maintenant si tout marche bien vous pouvez vous connecter en SSH à votre ordinateur.

Dans le terminal de connexion cliquez sur le menu Redirections de port puis le menu Ajoutez une redirection de port. Mettez n'importe quoi comme pseudo, le type local, port source le port 5901 et le port de destination pour faire simple mettez l'adresse 127.0.0.1:5901 ou localhost:5901.

En fait par défaut le serveur VNC assigne un port à chaque nouveau serveur créé de la forme 5900+n ou n correspond au nombre de serveurs créés. Comme on n'en a créé qu'un seul le port local sur la machine Ubuntu est le 5901; on fait du port forwarding (redirection de port n'est-ce pas ) tunnelisé via SSH et on se trouve avec un port local sur la machine android que j'ai ici mis à 5901 aussi.

Maintenant on ouvre VNC Viewer alors que ConnectBot fonctionne avec notre connexion SSH et notre redirection de port actives et on ajoute une nouvelle connexion avec comme adresse 127.0.0.1:5901 et comme nom n'importe quoi.

Il vous sera demandé votre mot de passe pour le serveur VNC; le serveur VNC et non pas pour votre clé SSH!

On ouvre et voilà nous sommes connectés en VNC tunnelisé via SSH sur notre machine Ubuntu avec comme bureau LXDE.

Si vous avez besoin d'un bon clavier sur votre android pour ssh je vous conseillerais Hacker's Keyboard.

Une petite vidéo de démonstration bien que de mauvaise qualité à cause d'adb...

Des questions?! Des remarques?! N'hésitez pas!


Lire aussi: