Un Skype isolé grâce à VServer
Je suis obligé d'utiliser Skype régulièrement. Et oui, on ne peut pas toujours faire ce que l'on veut. Problème, Skype est propriétaire. Et comme tout logiciel propriétaire, nous ne savons pas ce que le programme fait réellement (exemple). De plus, tout le trafic de Skype est chiffré : impossible pour l'utilisateur de savoir ce que Skype transmet exactement à ses serveurs. Tout cela fait que j'appréhende particulièrement ce logiciel, représentant parfait du logiciel propriétaire agréable à utiliser mais potentiellement très dangereux. Il faut aussi savoir qu'il existe de nombreuses alternatives à Skype, notamment via les protocoles XMPP/Jingle ou SIP.
Pour ne pas être affecté par les côtés spyware de Skype, je l'utilisais sur une machine virtuelle Windows 7. Pas des plus pratique, sachant qu'il est porté sur GNU/Linux. Première idée donc, installer Skype sur un Linux virtuel. Pourquoi pas, mais il y a mieux. Je trouve en effet que dédier une machine virtuelle uniquement à une application, c'est gâcher beaucoup de ressources. Nous allons faire de l'isolation.
L’intérêt d'utiliser un isolateur plutôt qu'un hyperviseur classique est que nous gagnons énormément en performances, de par l'utilisation du vrai matériel d'une part, et de la gestion des différents OS isolés par un seul noyau d'autre part (on réduit l'overhead). Voici comment nous pourrions schématiser le principe de l'isolation :
Il existe plusieurs isolateurs. Mon choix s'est porté sur VServer car, comme vous allez le voir, il est très simple à mettre en place.
Installation de VServer
VServer n'étant pas intégré aux sources officielles du noyau Linux, il faudrait normalement appliquer un patch. Ce n'est pas la peine sous Debian, car un noyau pré-compilé VServer-ready est disponible dans les dépôts. Il n'y a donc qu'à installer les paquets suivants : (je suis sur du 64 bit. Bien sur à vous de changer la version du noyau si besoin)
linux-image-2.6.32-5-vserver-amd64 util-vserver vserver-debiantools
Préparation de l'hôte
Les systèmes invités sont stockés par défaut dans /var/lib/vservers/. Si comme moi vous ne trouvez pas cela judicieux, vous pouvez modifier ce chemin de destination en modifiant le lien symbolique /etc/vservers/.defaults/vdirbase.
# rm vdirbase
# ln -s /le/chemin/voulu vdirbase
Ensuite, nous allons nous occuper de la partie réseau. Notre système invité étant isolé, il va falloir lui créer une interface factice sur notre hôte, sur laquelle nous allons forwarder la connexion via du NAT.
Pour créer la "fausse" interface, le plus simple est d'ajouter les lignes suivantes dans /etc/network/interfaces :
auto dummy0
iface dummy0 inet static
address 10.1.1.1
netmask 255.255.255.0
On relance le script réseau init :
Notre interface dummy est bien à présent disponible.
4: dummy0: mtu 1500 qdisc noqueue state UNKNOWN
link/ether a2:59:08:71:42:3d brd ff:ff:ff:ff:ff:ff
inet 10.1.1.1/24 brd 10.1.1.255 scope global dummy0
inet6 fe80::a059:8ff:fe71:423d/64 scope link
valid_lft forever preferred_lft forever
Nous pouvons maintenant configurer le forwarding. Premièrement, on active le forwarding au niveau du kernel :
Ensuite, on "nate" les paquets sortants ($IP = l'adresse IP de l'interface connectée au réseau, l'interface externe):
La même chose pour les paquets entrants. Ceci va nous permettre de mapper un service du client à un port (dans notre cas, ce sera ssh). $EXTPORT et $INTPORT les ports externes et internes de votre choix, $VHOST l'adresse IP locale du client.
--dport $EXTPORT -j DNAT --to-destination $VHOST:$INTPORT
Par exemple, voici ce que ça donne pour mon cas, avec wlan0 à 192.168.0.15, dummy0 à 10.1.1.1, et la future adresse locale du client à 10.1.1.2 :
# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -m tcp -p tcp
--dport 2222 -j DNAT --to-destination 10.1.1.2:2222
Il est bon de noter que ces commandes sont à entrer à chaque reboot du host. Nous verrons plus tard comment automatiser tout cela.
Préparation du client VServer
Nous pouvons maintenant créer notre client VServer.
--interface dummy0 --dist lenny --arch i386
Notre Debian Lenny isolé s'installe via debootstrap (c'est toujours magique si c'est votre première fois). Une fois cela fait, on le lance et on s'y connecte :
# vserver skype enter
Et voilà ! Préparons à présent le terrain pour Skype. Nous allons en premier lieu créer un compte utilisateur pour Skype.
À partir de maintenant, sauf mention contraire, toutes les manipulations sont à faire sur le client VServer.
Adding user `skype' ...
Adding new group `skype' (1001) ...
Adding new user `skype' (1001) with group `skype' ...
Creating home directory `/home/skype' ...
Copying files from `/etc/skel' ...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
Modification des informations relatives à l'utilisateur skype
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Nom complet []:
N° de bureau []:
Téléphone professionnel []:
Téléphone personnel []:
Autre []:
Is the information correct? [Y/n] y
Ajoutons cet utilisateur au groupe audio pour qu'il puisse accéder aux périphériques audio (assez utile pour utiliser Skype).
Ces périphériques audio d'ailleurs, notre Debian isolé n'en a pas connaissance. Pour remédier à cela, il suffit de copier nos périphériques hôtes vers le client. Par exemple avec rsync :
Donc si vous suivez, ceci est à taper depuis l'hôte.
sending incremental file list
snd/
snd/controlC0
snd/hwC0D0
snd/hwC0D1
snd/pcmC0D0c
snd/pcmC0D0p
snd/pcmC0D1p
snd/seq
snd/timer
snd/by-path/
snd/by-path/pci-0000:00:1b.0 -> ../controlC0
sent 254 bytes received 47 bytes 602.00 bytes/sec
total size is 12 speedup is 0.04
Nous allons aussi avoir besoin d'ssh pour X forwarder Skype vers notre hôte.
Vu qu'on a mappé le port 2222 tout à l'heure, on modifie le port d'écoute de ssh en 2222 dans /etc/ssh/sshd_config.
Port 2222
Tant que nous y sommes, configurons une authentification par clés pour ne pas avoir à entrer le mot de passe à chaque connexion. On génère les clés (sans passphrase. Ce n'est pas optimal, mais l'article commence à être assez long, je n'ai pas envie d'expliquer en plus ssh-agent.) :
On génère la paire de clés depuis l'hôte.
Generating public/private rsa key pair.
Enter file in which to save the key (/home/$USER/.ssh/id_rsa): /home/$USER/ssh_key_example/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/$USER/ssh_key_example/id_rsa.
Your public key has been saved in /home/$USER/ssh_key_example/id_rsa.pub.
The key fingerprint is:
a0:65:8e:9b:83:3c:f0:cf:51:1a:d7:2c:c1:38:cf:f6 skype@10.1.1.2
The key's randomart image is:
+--[ RSA 1024]----+
| |
| o |
| o * |
| X = |
|. + O S |
| + . O o |
| = * E |
| + o |
| o |
+-----------------+
Puis on copie la clé sur le client VServeur :
skype@10.1.1.2's password:
Now try logging into the machine, with "ssh '-p 2222 skype@10.1.1.2'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
Il ne reste plus qu'à supprimer l'authentification par mot de passe et activer celle par clés, sur notre client VServer dans /etc/ssh/sshd_config.
PubkeyAuthentication yes
On vérifie également que la directive X11Forwarding est à yes.
Enfin, on redémarre le serveur SSH.
Installation de Skype
Il ne nous reste plus qu'à installer Skype, sur notre client. On installe d'abord les dépendances :
On télécharge et on installe le paquet Skype.
# dpkg -i skype.deb
Enfin, pour le lancer, il suffit de taper depuis notre host :
Notre fenêtre Skype apparaît, ce fut long mais le résultat est là !
Automatisons tout cela avec un script
Si l'on récapitule, pour lancer Skype, il faut, à chaque reboot : réactiver le forwarding au niveau du kernel, réécrire les règles de NAT iptables, relancer le VServer skype, et enfin se connecter en ssh pour X Forwarder Skype. Ce n'est pas des plus pratique. Nous allons donc écrire un petit script qui initialisera notre VServer. Pour le lancement de Skype, nous nous contenterons d'un alias.
vservers-up.sh
echo 1 >/proc/sys/net/ipv4/ip_forward
ip=$(/sbin/ifconfig wlan0 | grep "inet adr" | cut -d: -f2 | awk '{print $1}')
iptables -t nat -A POSTROUTING -s 10.1.1.1/24 -j SNAT --to-source $ip
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -m tcp -p tcp --dport 2222 -j DNAT --to-destination 10.1.1.2:2222
vserver skype start
Ici, je pars du principe que vous utilisez l'interface wlan0, à vous d'ajuster, bien sur, tout comme les adresses IP, comme nous l'avons vu plus haut.
Alias Skype, à ajouter dans ~/.bashrc
vservers-up.sh est à lancer en root, l'alias skype en tant qu'utilisateur courant. Et voilà, lancer Skype est désormais beaucoup plus simple et rapide.
Bien entendu, je me suis penché spécifiquement sur le cas de Skype, mais vous pouvez utiliser du VServer pour n'importe quelle autre application que vous souhaitez isoler.