User Tools

Site Tools


formationsecurite:vpnlinux

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

formationsecurite:vpnlinux [2013/01/30 17:52] (current)
Line 1: Line 1:
 +=== Introduction ===
  
 +[[VPN]]: accéder à un réseau à distance comme si on était à l'intérieur.
 +Il y a une phase d'authentification (mais pas forcément d'encryption).
 +
 +Un paquet encrypté prend de l'ordre de mille fois plus de ressources processeur qu'un paquet sans encryption.
 +
 +
 +
 +=== Protocoles [[VPN]] ===
 +==== PPTP ====
 +Au paquet IP de base, on rajoute
 +  * une en-tête PPP
 +  * une en-tête GRE
 +  * une en-tête IP
 +
 +=== PPP ===
 +  * encapsulation
 +
 +Session PPP:
 +  * initialisation de la connexion: le client envoie un paquet LCP (link control protocol, couche 3)
 +  * si demande d'authentification du serveur, il envoie une demande en PAP, CHAP ou Kerberos
 +  * quand authentifié, PPP envoie des informations de configuration via le protocole NCP (network control protocol), dans les 2 sens
 +  * quand déconnexion, paquet LCP envoyé pour décrocher la session
 +
 +==== GRE ====
 +Generic Routine Encapsulation (couche 4), transporté par IP.
 +Permet de transporter les paquets couche 3 (IP le plus souvent)
 +Pas d'encryption, pas d'authentification aux extrémités (effectué par PPP)
 +
 +==== IPSec ====
 +Il y a 3 modules
 +  * IP Authentification Header (AH): s'assure de l'authentification de l'émetteur du paquet et s'assure qu'il n'a pas été modifié (intégrité)
 +  * Encapsulating Security Payload (ESP): chiffrement des données, authentification, intégrité et mécanisme d'anti-répétition des sessions (! il renvoie les paquets perdus, mais pas le même numéro de //session// TCP)
 +  * Security Association (SA): échange des clefs et des paramètres de sécurité entre les 2 extrémités du tunnel: information sur le traitement à appliquer aux paquets IP (AH, ESP, mode tunnel ou transport, algorithmes de chiffrement, clefs). Echange des clefs soit manuel, soit avec le protocole d'échange IKE (Internet Key Exchange)
 +
 +2 modes de fonctionnement
 +  * mode transport: un serveur [[VPN]], des clients
 +  * mode tunnel: de gateway à gateway: on prend 2 réseaux distants et faire comme s'ils étaient ensemble: MAN
 +
 +==== Ports et protocoles utilisés par les [[VPN]] ====
 +  * PPTP
 +    * GRE (protocole numéro 47)
 +    * TCP / 1723
 +  * IPSec
 +    * ESP (protocole 50)
 +    * AH (protocole 51)
 +    * UDP / 500 (ISAKMP: pre-shared keys en automatique ou IKE: serveur d'authentification exteren qui fournit les clefs)
 +
 +=== Configuration ===
 +
 +==== [[VPN]] sous PPTP ====
 +Il faut compiler un noyau.
 +  * récupérer les sources linux 2.6.11.10
 +  * décompresser dans /usr/src
 +   <code>tar xjf linux-2.6.11.10.tar.bz2 -C /usr/src/</code>
 +  * Serveur PPTP: poptop
 +    * télécharger ((http://poptop.sourceforge.net/ poptop)) v. 1.2.1 
 +    * décompresser
 +     <code>tar xzf pptpd-1.2.1.tar.gz</code>
 +    * installer
 +     <code>cd pptpd-1.2.1
 +./configure
 +make
 +make install</code>
 +    * pptpd est le serveur qui va permettre de se connecter
 +  * configurer et compiler le noyau
 +   <code>cd /usr/src
 +rm linux
 +ln -s linux-2.6.11.10 linux
 +cd linux
 +make menuconfig</code>
 +    * choisir les options
 +      * PPP support  Device Drivers -> Networking support -> PPP support (cocher toutes les options)
 +      * GRE tunnel over IP: Device Drivers -> Networking support -> Networking options -> ~TCP/IP networking -> IP: GRE tunnels over IP (cocher juste celui-là)
 +      * pour le reste, comme d'habitude
 +      * sauver la config en .config
 +   <code>make
 +make install
 +cp /vmlinuz /boot/vmlinuz-2.6.11.10</code>
 +    * editer /etc/lilo.conf (rajouter une section avec le nouveau noyau)
 +   <code>lilo</code>
 +
 +On va créer les  fichier de configuration
 +  * /etc/pptpd.conf qui comprendra:
 +    * l'adresse IP virtuelle du serveur
 +    * les IP disponibles pour les clients (= IP virtuelles que le client va recevoir une fois connecté
 +    * il faut décommenter #debug
 +  * /etc/ppp/options.pptp
 +    * contient les méthodes d'authentification et d'encryptage: ici nous allons toutes les décommenter pour que le clients puisse choisir:
 +     <code># Encryption
 +# (There have been multiple versions of PPP with encryption support,
 +# choose with of the following sections you will use.)
 +
 +
 +# BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o
 +# {{{
 +#refuse-pap
 +#refuse-chap
 +#refuse-mschap
 +# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
 +# Challenge Handshake Authentication Protocol, Version 2] authentication.
 +#require-mschap-v2
 +# Require MPPE 128-bit encryption
 +# (note that MPPE requires the use of MSCHAP-V2 during authentication)
 +#require-mppe-128
 +# }}}
 +</code>
 +    * autres options (proxy, mtu (maximum trame unit, par défaut 1500), etc.)
 +  * /etc/ppp/chap-secrets
 +    * gestion des mots de passe d'authentification (indépendants des users sur la machine)
 +    * détermine les IP qui peuvent accéder au [[VPN]]
 +
 +Copier le répertoire pptpd:
 +<code>cp -R /usr/local/lib/pptpd/ /usr/lib</code>
 +ainsi que les exécutables suivants:
 +<code>cp /usr/local/sbin/pptp* /usr/sbin/</code>
 +
 +Problème: /Slackware 10.1 est livré avec ppp 2.4.2 et pptpd 1.2.1 a besoin de ppp 2.4.3.
 +Donc, on doit télécharger ppp-2.4.3-4.src.tgz et l'installer.
 +<code>tar xzf ppp-2.4.3-4.src.tgz 
 +cd ppp-2.4.3-4
 +tar xzf ppp-2.4.3.tar.gz
 +cd ppp-2.4.3
 +./configure --prefix=/usr
 +make
 +make install</code>
 +
 +Puisque debug est activé, on peut voir les logs dans /var/log/syslog:
 +<code>tail -f /var/log/syslog</code>
 +
 +Sur le client: [[Windows]] XP
 +Start -> Connexions -> Afficher toutes les connexions -> créer une nouvelle connexion -> connexion au réseau d'entreprise -> connexion réseau privé virtuel -> entrer le nom de la connexion -> entrer l'IP du serveur (10.10.3.101) -> mon utilisation uniquement -> OK
 +La fenêtre de connexion s'ouvre -> propriétés -> onglet sécurité -> décocher //exiger le cryptage des données//
 +Ensuite entrer le login et le mot de passe.
 +
 +On est ensuite connecté au [[VPN]] sans encryption.
 +
 +On peut vérifier que le client a maintenant 2 adresses IP en tapant en console:
 +<code>ipconfig</code>
 +
 +==== Avec encryption ====
 +Pour avoir le tunnel encrypté, il faut ajouter MPPE sur le serveur -> patch noyau: http://www.polbox.com/h/hs001/
 +Il faut télécharger un patch pour le noyau (2.6.11) et pour pppd (2.4.3) et les appliquer.
 +<code>wget http://www.polbox.com/h/hs001/linux-2.6.11-mppe-mppc-1.3.patch.gz
 +gunzip linux-2.6.11-mppe-mppc-1.3.patch.gz
 +cp linux-2.6.11-mppe-mppc-1.3.patch /usr/src/linux
 +cd /usr/src/linux
 +patch -p1 < linux-2.6.11-mppe-mppc-1.3.patch</code>
 +<code>make menuconfig</code>
 +Device Drivers -> Networking Support -> PPP support -> Microsoft PPP compression/encryption (MPPC/MPPE) (cocher)
 +Ajouter les pilotes d'encryption:
 +Cryptographic options -> cocher Cryptographic API et dans le sous-menu, cocher (optionnel):
 +  * DES and Triple DES EDE cipher algorithms
 +  * AES cipher algorithms (i586)
 +Recompiler:
 +<code>make
 +make install</code>
 +Ajouter une entrée dans /etc/lilo.conf et
 +<code>lilo</code>
 +
 +Patcher pppd 2.4.3
 +<code>wget http://www.polbox.com/h/hs001/ppp-2.4.3-mppe-mppc-1.1.patch.gz
 +gunzip ppp-2.4.3-mppe-mppc-1.1.patch.gz
 +cp ppp-2.4.3-mppe-mppc-1.1.patch /usr/src/ppp-2.4.3/
 +cd /usr/src/ppp-2.4.3
 +patch -p1 < ppp-2.4.3-mppe-mppc-1.1.patch
 +./configure --prefix=/usr
 +make
 +make install</code>
 +
 +Il faut ensuite changer les options des fichiers de configuration.
 +Je me suis inspiré de ((http://www.phparchitecture.com/howto_show.php?id=3&showall PoPToP PPTP + MPPE 128bit Encryption + MPPC Compression [[VPN]] Server HOWTO)):
 +Dans /etc/ppp/options.pptpd
 +<code># BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o
 +# {{{
 +require-mschap-v2
 +mppe required
 +# }}}</code>
 +
 +
 +27/05/05
 +
 +=== Rappel ===
 +Hier, nous avons mis en oeuvre un server PPTP sans puis avec encryption:
 +==== Installation ====
 +  * PPTP: installation
 +    * paquet pptpd
 +    * compilation du noyau
 +    * mise à jour de PPP
 +  * pour l'encryption
 +    * MPPE
 +      * compilation du noyau après patching (avec module cryptographique: RC4, SHA-1 obligatoires, DES, 3DES et AES en plus)
 +      * compilation de PPP après patching
 +==== Configuration ====
 +  * /etc/pptpd.conf
 +    * options de base (debug, fichier d'options ci-dessous, adresses IP données aux clients au bout du tunnel, adresse IP du serveur = à l'autre bout du tunnel)
 +  * /etc/ppp/options.pptpd (types d'authentification possibles ou requises)
 +  * /etc/ppp/chap-secrets (login et password
 +
 +=== [[VPN]] over SSL ===
 +Nous allons réaliser cela à l'aide d'((http://openvpn.net/ OpenVPN)) qui utilise SSL et un périphérique ~TUN/TAP.
 +Principe de ~TUN/TAP: offre la possibilité de transmettre des paquets aux programmes.
 +TUN (tunnel) pour le point à point
 +TAP pour ethernet
 +
 +==== Installation ====
 +Nous n'utiliserons pas les bibliothèques LZO.
 +<code>wget http://openvpn.net/release/openvpn-2.0.tar.gz
 +tar xzf openvpn-2.0.tar.gz  
 +cd openvpn-2.0
 +./configure --prefix=/usr --disable-lzo
 +make
 +make install</code>
 +
 +Recompilation noyau
 +<code>cd /usr/src/linux
 +make menuconfig</code>
 +Device Drivers -> Networking support -> Network device support -> Universal TUN/TAP device driver support (cocher)
 +Pour bien montrer que ça marche dans PPP et GRE (nécessaires pour PPTP), nous les retirons du noyau.
 +Enlever PPP: Device Drivers -> Networking support -> PPP (décocher)
 +Enlever GRE: Device Drivers -> Networking support -> Networking options -> ~TCP/IP networking -> IP: GRE tunnels over IP (décocher)
 +<code>make
 +make install
 +cp /vmlinuz /boot/vmlinuz-2.6.11.10-tuntap</code>
 +rajouter une entrée dans /etc/lilo.conf
 +<code>lilo</code>
 +Et redémarrer avec le nouveau noyau.
 +
 +==== Configuration ====
 +Clefs: une par machine (c'est une pre-shared key)
 +<code>openvpn --genkey  --secret static.key
 +mkdir /etc/openvpn
 +mv static.key /etc/openvpn/</code>
 +
 +Il y a des exemples de fichiers de configuration dans openvpn-2.0/sample-config-files/.
 +Nous allons nous inspirer de static-home.conf d'un côté et de static-office.conf de l'autre côté du tunnel SSL.
 +<code>cp openvpn-2.0/sample-config-files/static-home.conf /etc/openvpn/
 +cp openvpn-2.0/sample-config-files/static-office.conf /etc/openvpn/
 +cp openvpn-2.0/sample-config-files/home.up /etc/openvpn/
 +cp openvpn-2.0/sample-config-files/office.up /etc/openvpn/</code>
 +
 +Dans static-home.conf, replacer la ligne:
 +<code>remote 1.2.3.4</code>
 +par l'adresse du serveur
 +<code>remote 10.10.3.102</code>
 +
 +Echanger la clef entre le serveur et le client (avec ssh par exemple).
 +
 +Du côté client:
 +<code>cd /etc/openvpn
 +openvpn --config /etc/openvpn/static-home.conf</code>
 +
 +Du côté serveur:
 +<code>cd /etc/openvpn
 +openvpn --config /etc/openvpn/static-office.conf</code>
 +
 +Quand la connexion est établie, regarder ifconfig, il y a une interface supplémentaire tun0:
 +<code>carl@forma301:~$ /sbin/ifconfig
 +eth0      Link encap:Ethernet  HWaddr 00:02:A5:CC:9E:FD
 +          inet addr:10.10.3.101  Bcast:10.10.3.255  Mask:255.255.255.0
 +          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
 +          RX packets:3866 errors:0 dropped:0 overruns:0 frame:0
 +          TX packets:3262 errors:0 dropped:0 overruns:0 carrier:0
 +          collisions:0 txqueuelen:1000
 +          RX bytes:4343594 (4.1 Mb)  TX bytes:447732 (437.2 Kb)
 +          Interrupt:11
 +
 +lo        Link encap:Local Loopback
 +          inet addr:127.0.0.1  Mask:255.0.0.0
 +          UP LOOPBACK RUNNING  MTU:16436  Metric:1
 +          RX packets:110 errors:0 dropped:0 overruns:0 frame:0
 +          TX packets:110 errors:0 dropped:0 overruns:0 carrier:0
 +          collisions:0 txqueuelen:0
 +          RX bytes:7100 (6.9 Kb)  TX bytes:7100 (6.9 Kb)
 +
 +tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
 +          inet addr:10.1.0.2  P-t-P:10.1.0.1  Mask:255.255.255.255
 +          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
 +          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 +          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 +          collisions:0 txqueuelen:100
 +          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)</code>
 +
 +Faire un ping du serveur:
 +<code>ping 10.1.0.1
 +PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data.
 +64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=1.66 ms
 +64 bytes from 10.1.0.1: icmp_seq=2 ttl=64 time=0.542 ms
 +64 bytes from 10.1.0.1: icmp_seq=3 ttl=64 time=0.543 ms
 +
 +--- 10.1.0.1 ping statistics ---
 +3 packets transmitted, 3 received, 0% packet loss, time 2000ms
 +rtt min/avg/max/mdev = 0.542/0.916/1.665/0.530 ms</code>
 +
 +J'ai maintenant accès aux ressources de ce réseau.
 +Exemple: serveur Apache:
 +<code>telnet 10.1.0.1 80
 +Trying 10.1.0.1...
 +Connected to 10.1.0.1.
 +Escape character is '^]'.
 +HELO
 +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
 +<HTML><HEAD>
 +<TITLE>501 Method Not Implemented</TITLE>
 +</HEAD><BODY>
 +<H1>Method Not Implemented</H1>
 +HELO to /index.html not supported.<P>
 +Invalid method in request HELO<P>
 +<HR>
 +<ADDRESS>Apache/1.3.33 Server at forma302.tf3.be Port 80</ADDRESS>
 +</BODY></HTML>
 +Connection closed by foreign host.</code>
 +
 +On utilise ce type de connexion pour relier 2 réseaux distants et en faire un MAN.
 +
 +Dimitri fait le serveur [[VPN]]. Il a plusieurs clients à travers un réseau 192.168.0.0. De l'autre côté, Carl sur un autre réseau (10.10.3.0).
 +Il a dû rajouter dans static-office.conf la ligne:
 +<code>push "route 10.10.3.0 255.255.255.0"</code>
 +(route veres le client dans le subnet)
 +
 +Comme la machine de Dimitri n'était pas mon default gateway, j'ai rajouté la route suivante dans ma table de routage:
 +<code>route add -net 10.3.0.0 netmask 255.255.255.0 gw 10.10.3.102</code>
 +
 +=== [[VPN]] avec IPSec ===
 +==== Installation ====
 +  * installer les ((http://ipsec-tools.sourceforge.net/ IPSec tools)): 
 +   <code>wget http://ovh.dl.sourceforge.net/sourceforge/ipsec-tools/ipsec-tools-0.5.2.tar.bz2
 +tar xjf ipsec-tools-0.5.2.tar.bz2
 +cd ipsec-tools-0.5.2
 +./configure --prefix=/usr
 +make
 +make install</code>
 +  * recompiler le noyau
 +  <code>cd /usr/src/linux
 +make menuconfig</code>
 +    * Device Drivers -> Networking support -> Networking options -> 
 +      * PF_KEY sockets (cocher) 
 +      * IP tunneling
 +      * IP: GRE tunnels over IP
 +      * IP: AH transformation 
 +      * IP: ESP transformation
 +      * IP: IPComp transformation
 +      * IPsec user configuration interface
 +    * Cryptographic options -> Cryptographic API 
 +      * Null algorithms
 +      * MD5 digest algorithm
 +      * SHA1 digest algorithm
 +      * DES and Triple DES EDE cipher algorithms
 +      * AES cipher algorithms (i586)
 +    <code>make
 +make install
 +cp /vmlinuz /boot/vmlinuz-2.6.11.10-ipsec</code>
 +Ajouter une entrée dans /etc/lilo.conf
 +<code>lilo</code>
 +Redémarrer
 +
 +==== Configuration ====
 +
 +So long, s...!
formationsecurite/vpnlinux.txt · Last modified: 2013/01/30 17:52 (external edit)