
                         HOWTO Rseaux Privs Virtuels

Arpad Magosanyi <mag@bunuel.tii.matav.hu> v0.2,7 Aug1997 Traduction par Nicolas
Prigent <prigentn@cicrp.jussieu.fr>

   v0.2, 7 August 1997

1. Modifications

   Le problme de 'pas de contrle du tty' -> -o 'BatchMode yes' par Zot
   O'Connor <zot@crl.com>

   Avertissements au sujet du kernel 2.0.30 par mag

2. Burps

   Vous avez sous les yeux le howto Rseaux Privs Virtuels, un
   rassemblement d'informations concernant la manire de monter un Rseau
   Priv Virtuel sous Linux (et les autres Unix en gnral).

2.1 Copyright

   Sauf indication contraire, les droits d'auteur des HOWTO Linux sont
   dtenus par leurs auteurs respectifs. Les HOWTO Linux peuvent tre
   reproduits et distribus, en totalit ou en partie, sur tout mdia
   physique ou lectronique dans la mesure o ce copyright est prserv
   dans chaque copie. La distribution commerciale en est autorise et
   encourage. L'auteur apprcierait toutefois qu'on lui notifie
   individuellement ce genre de distribution. Le prsent copyright doit
   couvrir toute traduction, compilation et autre travail driv des
   HOWTO Linux. C'est--dire qu'il est interdit d'imposer des
   restrictions de diffusion allant au del du prsent copyright  des
   ouvrages inspirs, ou incorporant des passages, de HOWTO Linux. Sous
   certaines conditions, des exceptions  ces rgles seront tolres :
   contactez le coordinateur des HOWTO  l'adresse donne ci-dessous.
   Pour rsumer, nous souhaitons une diffusion aussi large que possible
   de ces informations. Nanmoins, nous entendons garder la proprit
   intellectuelle (copyright) des HOWTO, et apprcierions d'tre informs
   de leur redistribution. Pour toute question plus gnrale, merci de
   contacter le coordinateur des HOWTO, Tim Bynum,  l'adresse
   lectronique tjbynum@wallybox.cei.net.

2.2 Mise en garde

   Comme d'habitude : L'auteur n'est en aucun cas responsable de tout
   dommage occasionn. Pour la formulation exacte, se rfrer  la partie
   correspondante de la GNU GPL 0.1.1

2.3 Mise en garde

   Il est question de scurit : vous n'tes pas en scurit si vous
   n'instaurez pas une politique de scurit efficace, et autres choses
   ennuyeuses de ce genre.

2.4 Remerciements

   Merci  tous ceux qui ont crit les outils utiliss.

   Merci  Zot O'Connor <zot@crl.com> pour m'avoir montr le problme de
   "no controlling tty", et sa solution.

   Le traducteur voudrait remercier Aude Hurtrel pour son aide prcieuse.

2.5 Etat de ce document.

   Voici les prliminaires. Vous devez avoir une connaissance gnrale de
   l'administration IP, au moins quelques connaissances sur les
   firewalls, ppp et ssh. Vous tes de toute facon cens les connaitre si
   vous voulez monter un VPN. J'ai simplement dcid d'crire mes
   expriences afin de ne pas les oublier. En fait, Il se peut qu'il y
   ait des trous de scurit. Pour tre honnte, j'ai ralis mes essais
   sur des machines configures comme des routeurs, et pas des firewalls,
   c'est plus simple.

2.6 Documentation relative au sujet

     * Le Firewall-HOWTO /usr/doc/HOWTO/Firewall-HOWTO
     * Le PPP-HOWTO /usr/doc/HOWTO/PPP-HOWTO.gz
     * La documentation ssh /usr/doc/ssh/*
     * The Linux Network Admins' Guide
     * NIST Computer Security Special Publications
       http://csrc.ncsl.nist.gov/nistpubs/
     * Firewall list (majordomo@greatcircle.com)

3. Introduction

   Les firewalls tant de plus en plus largement utiliss dans les
   systmes de scurit internet et intranet, la capacit de raliser de
   bons VPNs est de plus en plus importante. Voici le relev de mes
   expriences. Les commentaires sont les bienvenus.

3.1 Conventions de dnomination

   J'utiliserais les termes de "firewall-matre" et "firewall-esclave",
   bien que raliser un VPN n'ait rien  voir avec l'architecture
   client-serveur. Je me rfre simplement  eux en tant que participant
   actif et passif de la mise en place de la connection. On utilisera la
   dnomination de "matre" pour l'hte qui initie la connection, et
   celle d'esclave pour le participant passif.

4. Le faire

4.1 Prparation

   Avant de commencer  mettre en place votre systme, vous devriez
   connatre les dtails concernant le rseau. Je considre que vous avez
   deux firewalls, chacun protgeant un intranet, et qu'il sont tous deux
   connects  l'internet. De fait, vous devriez avoir deux interfaces
   (au moins) par firewall. Prenez une feuille de papier et crivez leurs
   adresses IP et masques de rseau. Vous aurez besoin d'une adresse IP
   suplmentaire par firewall pour le VPN que vous voulez mettre en
   place. Ces adresses devraient tre extrieures  vos sous-rseaux
   existants. Je vous suggre d'utiliser des adresses de l'espace
   d'adressage "priv". Les voici :
     * 10.0.0.0 - 10.255.255.255
     * 172.16.0.0 - 172.31.255.255
     * 192.168.0.0 - 192.168.255.255

   Pour les besoins de l'exemple, voici une configuration : les deux
   bastions s'appellent fellini et polanski. Ils ont une interface vers
   l'internet (-out), une pour l'intranet (-in), et une pour le VPN
   (-vpn).
     * fellini-out: 193.6.34.12 255.255.255.0
     * fellini-in: 193.6.35.12 255.255.255.0
     * fellini-vpn: 192.168.0.1 point-a-point
     * polanski-out: 193.6.36.12 255.255.255.0
     * polanski-in: 193.6.37.12 255.255.255.0
     * polanski-vpn: 192.168.0.2 point-a-point

   Voici pour les prparatifs.

4.2 Rassembler les outils

   Vous aurez besoin :
     * d'un firewall pour Linux
     * d'un kernel
     * d'une configuration minimale
     * d'ipfwadm
     * de fwtk
     * des Outils pour le VPN
     * ssh
     * pppd
     * sudo
     * pty-redir

   Version actuelles (NDT :au moment de la rdaction de cet HOWTO)
     * kernel : 2.0.29 Utilisez un kernel stable, qui doit tre plus
       rcent que la version 2.0.20,  cause du bug du "ping de la mort".
       Au moment de la rdaction, la version 2.0.30 est le dernier kernel
       stable, mais il contient des bugs. Si vous voulez bnficier du
       super code efficace et rapide qu'il contient, essayez un prpatch.
       Je trouve que le 3me fonctionne plutt bien.
     * Un systme de base : Je prfre Debian. Vous n'avez pas du tout
       envie d'utiliser de gros logiciels et vous n'avez jamais eu
       l'intention d'utiliser Sendmail (comme souvent dans le cas
       d'autres htes unix). Vous ne voulez donc absolument pas permettre
       l'utilisation de telnet, ftp et des commandes "r".
     * ipfwadm : j'ai utilis le 2.3.0
     * fwtk : j'ai utilis le 1.3
     * ssh : >= 1.2.20. Il y a des problmes avec le protocole
       sous-jacent dans les versions plus anciennes.
     * pppd : j'ai utilis la version 2.2.0 por les tests, mais je ne
       suis pas sr qu'elle soit scurise, c'est pourquoi j'ai plac le
       bit setuid  0, et utilis sudo pour le lancer.
     * sudo : 1.5.2 est la dernire version dont je sois au courant.
     * pty-redir : que j'ai crit. Essayez
       ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz. On en est
        la version 0.1 mantenant. Dites-moi si vous rencontrez un
       quelconque problme en l'utilisant.

4.3 Compiler et installer

   Compilez ou installez les outils que vous venez de rassembler.
   Consultez attentivement leur documentation (et le firewall-howto) pour
   de plus amples informations. Mantenant, nous disposons des outils.

4.4 Configurer les autres sous-systmes

   Configurez correctement les paramtres des firewalls. Vous devez
   autoriser les communications ssh entre les deux htes disposant de
   firewalls. Cela signifie qu'il doit exister une connexion sur le port
   22 du matre vers l'esclave. Lancez sshd sur l'esclave et vrifiez que
   vous pouvez vous connecter. Je n'ai pas vrifi cette tape, n'hsitez
   pas  me communiquer les rsultats que vous avez obtenus.

4.5 Configurer les comptes pour le VPN

   Crez un compte sur le firewall esclave en utilisant vos outils
   favoris (par exemple vi, mkdir, chown, chmod). Vous pouvez aussi crer
   un compte sur le matre, mais je pense que vous souhaitez que la
   connexion se fasse au dmarrage, nous nous servirons donc de votre
   compte root habituel. Est-ce que quelqu'un pourrait me signaler les
   risques qu'il y a  utiliser le compte root sur le matre?

4.6 Gnrer une cl ssh pour le compte du matre

   Utilisez le programme de gnration de cl de ssh. Donnez un mot de
   passe vide pour la cl prive si vous voulez raliser une
   configuration automatique du VPN.

4.7 Configurer une connexion ssh automatique pour le compte esclave

   Copiez la cl publique frachement gnre dans le compte esclave dans
   le fichier .ssh/authorized_keys, et configurez les droits d'accs
   comme indiqu ci dessous :

drwx------ 2 esclave esclave 1024 Apr 7 23:49 ./
drwx------ 4 esclave esclave 1024 Apr 24 14:05 ../
-rwx------ 1 esclave esclave 328 Apr 7 03:04 authorized_keys
-rw------- 1 esclave esclave 660 Apr 14 15:23 known_hosts
-rw------- 1 esclave esclave 512 Apr 21 10:03 random_seed

   la premire ligne tant ~esclave/.ssh, la seconde ~esclave.

4.8 Resserrer la scurit ssh sur les bastions.

   Ce qui se traduit par la configuration suivante dans sshd_conf :

PermitRootLogin no
IgnoreRhosts yes
StrictModes yes
QuietMode no
FascistLogging yes
KeepAlive yes
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no

   L'authentification par mot de passe tant dsactive, la connexion
   n'est possible qu'avec les cls autorises. (Vous aurez bien entendu
   dsactiv telnet et la commande 'r').

4.9 Permettre l'excution de ppp et route sur les deux comptes.

   Comme le compte matre est aussi le compte root en ce qui me concerne,
   Il n'y a rien eu  faire. Pour le compte esclave, les lignes suivantes
   apparaissent dans /etc/sudoers :
Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route
esclave ALL=NOPASSWD: VPN

   Comme vous pouvez le voir, j'utilise des scripts pour mettre en place
   ppp et les tables de routage sur l'hte esclave.

4.10 Faire les scripts

   Sur l'hte matre, j'utilise un full-blown script :

#! /bin/sh
# skeleton      example file to build /etc/init.d/ scripts.
#               This file should be used to construct scripts for /etc/init.d.
#
#               Written by Miquel van Smoorenburg <miquels@cistron.nl>.
#               Modified for Debian GNU/Linux
#               by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
# Version:      @(#)skeleton  1.6  11-Nov-1996  miquels@cistron.nl
#

PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:
PPPAPP=/home/esclave/ppp
ROUTEAPP=/home/esclave/route
PPPD=/usr/sbin/pppd
NAME=VPN
REDIR=/usr/local/bin/pty-redir
SSH=/usr/bin/ssh
MYPPPIP=192.168.0.1
TARGETIP=192.168.0.2
TARGETNET=193.6.37.0
MYNET=193.6.35.0
ESCLAVEWALL=polanski-out
ESCLAVEACC=esclave

test -f $PPPD || exit 0

set -e

case "$1" in
  start)
        echo setting up vpn
        $REDIR $SSH -o 'Batchmode yes' -t -l $ESCLAVEACC $ESCLAVEWALL sudo $PPP
APP >/tmp/device
        TTYNAME=`cat /tmp/device`
echo tty is $TTYNAME
        sleep 10s
        if [ ! -z $TTYNAME ]
        then
        $PPPD $TTYNAME ${MYPPPIP}:${TARGETIP}
        else
                echo FAILED!
                logger "vpn setup failed"
        fi
        sleep 5s
        route add -net $TARGETNET gw $TARGETIP
        $SSH -o 'Batchmode yes' -l $ESCLAVEACC $ESCLAVEWALL sudo $ROUTEAPP
    ;;
  stop)
        ps -ax | grep "ssh -t -l $ESCLAVEACC " | grep -v grep | awk '{print $1}
' | xargs kill
    ;;
  *)
    # echo "Usage: /etc/init.d/$NAME {start|stop|reload}"
    echo "Usage: /etc/init.d/$NAME {start|stop}"
    exit 1
    ;;
esac

exit 0

   L'esclave utilise un script pour la prparation du routage
   (/usr/local/vpn/route) :

#!/bin/bash
/sbin/route add -net 193.6.35.0 gw 192.168.0.1

   et son .ppprc est tel qu'indiqu ci-dessous :

passive

5. Regardons ce qui se passe :

   Le matre se connecte  l'esclave, commence pppd, et redirige tout
   vers un terminal pty local. Ce qui consiste en l'enchanement
   suivant :
     * allouer un nouveau pty
     * ssh'er dans l'esclave
     * lancer pppd sur l'esclave
     * le matre lance pppd sur son pty local
     * et met en place la table de routage sur le client.

   Le temps entre en considration (ne serait-ce qu'un peu), c'est pour
   cela que l'on a ajout 'sleep 10'.

6. Le faire  la main.

6.1 Se connecter

   Vous avez dj essay de voir si ssh marche bien, n'est-ce pas ? Si
   l'esclave refuse de vous laisser vous connecter, lisez les fichiers
   logs. Peut-tre y a-t-il des problmes d'autorisation sur certains
   fichiers, ou avec la configuration de sshd.

6.2 Faire chauffer ppp

   Connectez-vous  l'esclave, et tapez :
sudo /usr/sbin/pppd passive

   Vous devriez voir les ennuis arriver  partir de ce moment. Si ca
   marche, c'est bien ; sinon, c'est qu'il y a des problmes soit avec
   sudo, soit avec pppd. Regardez ce que les commandes ont dit, ainsi que
   les fichiers _/etc/ppp/options_ et _.ppprc _. Si tout fonctionne,
   ajoutez 'passive' dans .ppprc, et essayez de nouveau. Pour vous
   dbarrasser des problmes et continuer  travailler, appuyez sur
   Enter, '~' et '^Z'. Vous devriez alors avoir l'invite du matre, et
   faire kill %1. Regardez la partie concernant les rglages si vous
   voulez en savoir plus sur les caractres d'chappement.

6.3 Runir les deux.

   Bon, alors
ssh -l esclave polanski sudo /usr/sbin/pppd

   devrait aussi marcher, et vous renvoyer son blabla en pleine tte.

6.4 Redirection du terminal

   Essayez de tout rediriger cette fois-ci :
/usr/local/bin/pty-redir /usr/bin/ssh -l esclave polanski sudo /usr/sbin/pppd


   Longue phrase, hein ? Vous tes suppos utiliser le chemin d'accs
   complet dans l'excutable ssh, du fait que le programme de redirection
   du pty n'autorise que cette forme pour des raisons de scurit.
   Maintenant, vous disposez d'un nom de fichier spcial pour le
   programme. Disons que c'est _/dev/ttyp0 _. Vous pouvez utiliser la
   commande ps pour regarder ce qui s'est pass. Regardons 'p0'.

6.5 Y a-t-il quelque chose sur le dispositif ?

   Essayez
/usr/sbin/pppd /dev/ttyp0 local 192.168.0.1:192.168.0.2

   pour tablir la connexion. Regardez la sortie de la commande ifconfig
   pour voir si le dispositif s'est install, et utilisez ping pour
   vrifier votre rseau virtuel.

6.6 Mettre en place le routage.

   Configurez les routes sur l'hte matre, ainsi que sur l'esclave. Vous
   devriez maintenant tre capable de lancer un ping sur un hte d'un
   intranet depuis un hte sur l'autre intranet. Mettez en place des
   rgles additionnelles de firewall. Maintenant que vous avez le VPN,
   vous pouvez mettre en place les rgles concernant l'interconnexion des
   deux intranets.

7. Rglages

7.1 Rglages de la configuration

   Comme je l'ai dj dit, cet HOWTO est avant tout un mmo rapide sur la
   manire dont j'ai mont un VPN. Il y a des choses dans la
   configuration que je n'ai pas encore essayes. Ces choses rejoindront
   leur place quand je les aurais essayes, ou que quelqu'un m'aura dit :
   "C'est comme a que a marche". La chose la plus importante est que la
   connexion qu'utilise ppp n'est pas en 8 bits. Je crois que l'on peut
   faire quelque chose  ce sujet avec la configuration de ssh ou celle
   de pty. Dans cette configuration, ssh utilise le caractre tilde (~)
   comme un caractre d'chappement. Cela pourait stopper ou ralentir la
   communication si une squence retour--la-ligne/tilde conduisait ssh 
   retourner une invite. Selon la documentation de ssh : <sur la plupart
   des systmes, donner au caractre d'chappement la valeur "none"
   rendra de la session transparente, mme si un tty est utilis.> Le
   drapeau correspondant  cela pour ssh est '_-e_', et vous pouvez aussi
   le placer dans le fichier de configuration.

7.2 Bande pasante contre cycles d'horloge

   Crer quelque chose, aussi virtuel soit-il, entrane l'utilisation de
   ressources du monde rel. Un VPN utilise de la bande passante et des
   ressources de calcul. Le but tant de trouver un quilibre entre les
   deux. Vous pouvez faire des rglages avec le drapeau '-C' ou l'option
   'CompressionLevel'. Vous pourriez essayer de trouver un autre
   algorithme de chiffrement, mais je ne vous le recommande pas. Notez
   aussi que le temps de transmission peut tre allong si vous utilisez
   un meilleur taux de compression. Toutes vos expriences sont les
   bienvenues.

8. Analyse de vulnrabilit

   J'essaie de couvrir ici les trous de scurit naissant de cette mise
   en oeuvre en particulier, et des VPNs en gnral. Tous les
   commentaires seront vivement apprecis.
     * sudo : en fait, j'utilise sudo de manire excessive. Je crois que
       c'est toujours plus sr que d'utiliser les bits setuid. C'est
       encore un inconvnient de Linux de n'avoir pas un contrle d'accs
       plus rigoureux. On attend la compatibilit avec POSIX.6
       <http://www.xarius.demon.co.uk/software/posix6/>. Ce qui est pire,
       c'est qu'il y a des scripts shell qui vont tre lancs avec sudo.
       Plutt mauvais. Quelqu'un a une idee ?
     * pppd : lui aussi lance suid root. Il peut tre configur par le
       .ppprc de l'utilisateur. Il se pourrait qu'il y ait de beaux
       dpassements de la mmoire tampon. Ligne de dfense : scurisez
       votre compte esclave autant que possible.
     * ssh : faites attention au fait que les versions de ssh antrieures
        la 1.2.20 contiennent des trous de scurit. Pire, nous avons
       tabli une configuration telle que lorsque le compte matre a t
       compromis, le compte esclave l'est lui aussi, et est grand ouvert
       aux attaques utilisant des programmes lancs avec sudo. C'est
       parce que j'ai choisi de ne pas avoir de mot de passe sur la cl
       secrte du matre pour permettre la configuration automatique du
       VPN.
     * firewall : avec des rgles de firewall incorrectes sur un des
       bastions, vous ouvrez les deux intranets. Je recommande d'utiliser
       le camouflage d'adresse IP (car l'installation de routes
       incorrectes est un peu moins vidente), et faire des contrles
       trs srieux sur les interfaces VPN.
