====== Contrôle à distance avec ssh-callback, ou comment jouer les passe-murailles====== ==== Présentation ==== Kevin veut pouvoir aider sa mère qui habite à l'autre bout de la France.\\ Le but de ce tutoriel est de présenter une technique de prise de contrôle à distance sécurisée (tunnel ssh), ayant l'avantage de ne pas avoir à ouvrir ni à faire de redirection de ports chez "maman". Une fois le laptop de maman configuré, peu importe si elle se trouve derrière telle borne wifi ou tel routeur, pour se faire dépanner elle devra simplement cliquer sur une icône de son bureau. Ce document est inspiré en grande partie de la conférence d'[[http://olivieraj.free.fr|Olivier Allard-Jacquin]] organisée au sein de la [[http://www.guilde.asso.fr/|Guilde]], dont vous pouvez trouver les transparents [[http://www.guilde.asso.fr/rencontres/20080409/|ici]]. === Paquets à installer === Maman installe __x11vnc__ (ou pas, sur debian il ya déjà vino, le server vnc de Gnome) \\ Kevin installe __openssh-server__ et __xtightvncviewer__ ==== Mode d'emploi ==== * Si besoin Kevin configure son routeur (redirection du port 22 vers sa machine). \\ * Kevin crée un compte utilisateur "maman" sur sa machine (avec éventuellement un pseudo shell, voir plus bas) * Maman démarre son server vnc. * Maman crée le tunnel ssh que Kevin pourra ensuite "remonter" \\ ~$ ssh -R 5901:localhost:5900 -R 10022:localhost:22 maman@adresse_ip_de_kevin //Ici l'option -R (Remote) implique une redirection à distance : ssh écoute le port 5901 (resp 10022) de Kevin, et dès qu'une connection est établie sur ce port, la redirige à travers le cannal sécurisé, et se connecte à maman (localhost) sur le port 5900 (resp 22). \\ Si l'on avait souhaité une redirection locale (dans l'autre sens), on aurait utilisé l'option -L.// \\ . * Kevin prend le contrôle du bureau de maman \\ ~$ xtightvncviewer -encodings tight localhost:1 //Pourquoi 1? Parce que la relation entre le numéro du port TCP du serveur VNC et le "numéro d'écran" VNC se calcul comme suit: Numéro_écran_VNC = Port_TCP_serveur_VNC - 5900.// \\ . * Kevin peut aussi se connecter en mode console \\ ~$ ssh -p 10022 login_de_maman@localhost ==== Kevin n'a pas tellement confiance en maman ==== Maman a quand même ouvert une connexion ssh sur l'ordi de Kevin, et ce dernier est paranoïaque. Il crée donc un pseudo shell pour le compte utilisateur maman, dont voici le code, plutôt simple :-) \\ #include #include int main (int argc, char* argv[]) { printf("Le tunnel SSH callback est actif\n\ L'utilisateur à distance peut maintenant se connecter\n\ Vous pouvez arrêter cette connexion en tapant plusieurs fois Ctrl+C\n"); sleep(-1); return 0; } ~# gcc ssh-cb.c -o /usr/local/sbin/ssh-cb Bien entendu il faut installer les paquets nécéssaires pour la compilation (build-essential pour Debian/Ubuntu). Il faut aussi rajouter la ligne /usr/local/sbin/ssh-cb au fichier /etc/shells, afin de pouvoir attribuer ce pseudo shell à l'utilisteur maman. ==== Script "un clic" pour maman ==== #!/bin/bash -norc SERVER_NAME=adresse_ip_de_Kevin SERVER_PORT=22 ACCOUNT_NAME=maman REMOTE_SSH_PORT=10022 REMOTE_VNC_PORT=5901 echo + Starting x11vnc server... x11vnc -ncache 10 -display :0 -loop -allow localhost & sleep 5s # Le -ncache 10 est une option que x11vnc nous enjoint de mettre si l'on oublie. Cela permet de sauvegarder des pixels en cache et donc une meilleure fluidité. # Le -loop permet de redémarrer automatiquement le serveur X11vnc lorsque la connexion avec le client VNC s'interrompt. # Le -allow localhost n'autorise les connexions au serveur VNC que sur l'interface loopback. # Une personne située à distance ne pourra pas donc contacter directement le serveur VNC, seule une connexion à travers un tunnel SSH fonctionnera. echo echo + Calling remote callback host... ssh -C -p $SERVER_PORT $ACCOUNT_NAME@$SERVER_NAME \ -R $REMOTE_SSH_PORT:localhost:22 \ -R $REMOTE_VNC_PORT:localhost:5900 echo + Kill x11vnc server... killall x11vnc || (sleep 2s ; killall -9 x11vnc)