Contourner un proxy (la suite…) ssh le retour

Posted by on Fév 10, 2009 in Blog, Planet-Libre, Tutoriaux | No Comments
Suite à quelques problèmes rencontrés récemment, en voyant qu’autour de moi certaines personnes avait des difficultés, qu’elles s’étaient auto bloqués derrière un firewall, ou derrière une livebox….

De ce fait il devient « impossible » pour moi de me connecter chez eux, puisque tout est bloqué.

Dans cette hypothèse il devient alors évident qu’il vaut mieux que ce soit eux qui établissent la connexion vers ma machine et non l’inverse.

Il convient donc de faire quelques petits aménagements sur putty et VNC

1. But :


Le but est de parvenir à ce Schéma :

schéma tunnel inversé

schéma tunnel inversé

2. Outils :


  • Plink, PSFTP, PSCP (les outils de PuTTY en version portable)
  • OpenSSH, (là j’explique pas de nouveau)
  • et si on peut considérer ça comme un outils CHROOT et SCPONLY

3. Mise en place de CHROOT :


là c’est simple (au début) il suffit de créer un environnement CHROOTé. En fait nous allons créer 2 utilisateurs :

  • le premier Remote qui n’aura le droit de faire que du SCP ou ou du SFTP, voir les 2 (là c’est vous qui déçidez…)
  • le deuxième Assistance qui ne pourra rien faire si ce n’est d’ouvrir une session et et un port sur votre machine.

#adduser remote

Le répertoire de remote devra ressembler au final à ça :


/home/remote
|-- etc
| |-- group
| `-- passwd
|-- lib
| |-- ld-linux.so.2
| `-- tls
| |-- libc.so.6
| |-- libcrypt.so.1
| |-- libdl.so.2
| |-- libnsl.so.1
| |-- libresolv.so.2
| `-- libutil.so.1
|-- remote.txt
`-- usr
|-- bin
| |-- rssh
| |-- scp
| `-- sftp
`-- lib
|-- i686
| |-- cmov
| `-- libcrypto.so.0.9.7
|-- libz.so.1
|-- rssh
| `-- rssh_chroot_helper
`-- sftp-server
9 directories, 17 files

Pour arriver au résultat ci dessus, il faut commencer par créer les répertoires :


#mkdir /home/assistance/etc

Il faut répeter l’opération autant de fois qu’il y a de répertoires :’( , pour les fichiers la méthode à employer est la suivante :

# ldd /usr/bin/scp
libresolv.so.2 => /lib/tls/libresolv.so.2 (0x40027000)
libcrypto.so.0.9.7 => /usr/lib/i686/cmov/libcrypto.so.0.9.7 (0x40039000) libutil.so.1 => /lib/tls/libutil.so.1 (0x40139000)
libz.so.1 => /usr/lib/libz.so.1 (0x4013c000)
libnsl.so.1 => /lib/tls/libnsl.so.1 (0x4014e000)
libcrypt.so.1 => /lib/tls/libcrypt.so.1 (0x40162000)
libc.so.6 => /lib/tls/libc.so.6 (0x4018f000)
libdl.so.2 => /lib/tls/libdl.so.2 (0x402c4000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

dans ce cas il faut copier les fichiers renvoyés par la commande ldd vers le bon répertoire de l’utilisateur remote.

#cp /lib/tls/libresolv.so.2 /home/assistance/lib/tls

Il y a aussi d’autres méthodes « automatiques » que vous pourrez trouver su léa-linux là. ce tuto m’a d’ailleurs bien aidé pour faire cette manip, merci à son auteur.

Il faut aussi installer RSSH qui permet d’installer un shell très limité aux commandes SSH, du type scp ou sftp.

#apt-get install rssh

Puis il faut configurer rssh, il faut donc éditer le fichier suivant : /etc/rssh.conf et vérifier qu’il ne contient bien que ces lignes à l’intérieur.


logfacility = LOG_USER
allowscp # pour autoriser la commande SCP
allowsftp # pour autoriser la commande SFTP
umask = 022
chrootpath="/home/remote"

Ensuite il faut affecter le bon shell à l’utilisateur.

vim /etc/passwd
remote:x:1003:1003:remote,,,:/home/remote:/usr/bin/rssh

maintenant vous pouvez tester la connexion avec l’utilisateur remote.

$ sftp remote@localhost
Connecting to localhost...
Password:
sftp> ls
. .. etc lib remote.txt usr
sftp>
  • Info : si vous faites le même test avec scp il se peut que vous ayez cette erreur : unknown user 1003 où 1003 est l’ID de votre utilisateur, je n’ai pas trouver comment résoudre cette erreur sachant que ça fonctionne depuis pscp sous windows.

#adduser assistance

Quant à assistance c’est encore plus simple dailleurs un simple copier coller des 2 répertoires suffit, toutefois il ne faut oublier de supprimer les choses en trop 😉


/home/assistance
|-- .ssh
| |-- authorized_keys
| `-- remote.pub
|-- bin
| `-- bash
`-- lib
|-- ld-linux.so.2
|-- libc.so.6
|-- libdl.so.2
`-- libncurses.so.5

Toutefois il y a quand même quelques manipulations a effectuer, car dans l’état actuel, c’est plutôt bof :P.

Donc, il faut créer un « faux » shell


#vim /bin/chrootassistance
#!/bin/bash
exec -c /usr/sbin/chrootassistance_suid /home/$USER /bin/bash

Puis il faut changer les droits de l’utilisateur et copier le fichier chroot.

# chmod 755 /bin/chrootassistance
cp /usr/sbin/chroot /usr/sbin/chrootassistance_suid
chmod 4755 /usr/sbin/chrootassistance_suid

Enfin il ne faut pas oublier le contenu du fichier /etc/passwd

assistance:x:1004:1004:,,,:/home/assistance:/bin/chrootassistance

Ensuite tester la connexion :

su assistance
Password:
bash-2.05b$

Vous pouvez tenter de faire un ls, un cp, ou ce que vous voulez ce ne sera pas possible.

4. Créer les éléments de connexion :


Pour « sécuriser » un minimum la connexion il va falloir autoriser l’utilisateur externe à se connecter dans des conditions sécurisées.

il faut tout d’abord générer une paire de clef ssh

#ssh-keygen -b 2048 -t dsa -f Nom-Clef -N PassPhrase

ensuite pour que cette clef soit comprise par PuTTY il faut la convertir

$puttygen Nom-Clef -o remote.txt

le fichier remote.txt sera stocké à la racine de /home/remote attention c’est une clef privée, il faut donc la changer régulièrement et ne pas donner la passphrase à n’importe qui 😉

puis vous copiez la clef Nom-Clef.pub dans /home/assistance/.ssh puis vous changez les droits sur cette clef

# chmod 64 /home/assistance/.ssh/Nom-Clef.pub
# cat Nom-Clef.pub > authorized_keys
# chmod 64 /home/assistance/.ssh/authorized_keys
  • Résumons :
    • Nous avons créer les 2 environnements CHROOTé
    • Nous sommes capables de nous connecter sur les 2 environnements
    • un utilisateur (remote) peut récupérer et copier des fichiers
    • un utilisateur (assistance) peut uniquement se connecter.

5. Changeons d’environnement :


Sous windows il suffit ensuite de récupérer la clef du premier environnement Chrooté pour cela 2 utilitaires sont disponibles avec putty, et tout dépend de ce que vous avez autorisez dans le fichier /etc/rssh.conf.

Au choix :


pscp -P 80 -pw MotDePasseUtilisateurChrooté UtilisateurChrooté@AdresseIP:/remote.txt remote.txt

psftp -P 80 UtilisateurChrooté@AdresseIP -pw MotDePasseUtilisateurChrooté -b script.scr

UtilisateurChrooté = remote (dans notre cas)
script.scr est un fichier texte qui contient les commandes a exécuter

get remote.txt remote.txt
bye

Ensuite grâce à l’utilitaire plink il suffit d’étblir la connection :


plink -P 80 -l Assistance -R AdresseIP:59000:localhost:5900 -i remote.ppk AdresseIP

AdresseIP : est l’adresse de votre PC (dépanneur)

Cette ligne a pour incidence d’ouvrir un port le 59000 sur le pc du dépanneur en sortant par le port 80 et en utilisant l’utilisateur Assistance et la clef remote.ppk

Par la suite il faut modifier les paramètres de VNC comme dans les écrans ci dessous afin d’autoriser le loopback et uniquement le loopback ce qui empêchera toute connexion à VNC autrement qu’en local sur le port 5900 :

Propriétés avancées pour le loopback
Propriétés avancées pour le loopback

Avec cette méthode tout est « sécurisé » la seule faille étant dans la première récupération de clef, mais il suffit de ne pas communiquer les mots de passe ainsi que la passe phrase autrement que par téléphone ou mail.

Certes la procédure peu paraître compliquée surtout pour le dépanné qui est supposé être novice en informatique, mais si on extrapole un peu il devient possible de créer un petit bout de soft avec NSIS, InnoSetup ou du Script, afin de simplifier la tâche de ce pauvre utilisateur, et automatiser tout ça 😉

3 directories, 7 files

Propriétés de VNC pour le loopback
Propriétés de VNC pour le loopback

twitterlinkedin

Leave a Reply

You must be logged in to post a comment.