« Point d'accès sécurisé par OpenVPN » : différence entre les versions

De Lea Linux
Aller à la navigation Aller à la recherche
(→‎Pré-requis : ajout d'un prérequis)
Ligne 23 : Ligne 23 :


= Préparation du point d'accès =
= Préparation du point d'accès =
Toutes les commandes de cette partie sont à exécuter avec les droits du super utilisateur.
== Création de l'interface réseau ==
== Création de l'interface réseau ==
Disposant d'une carte géré par le pilote madwifi, il me faut tout d'abord créer l'interface à l'aide de <code>wlanconfig</code>. Cela permet de créer plusieurs interfaces virtuelles qui fonctionnent toutes sur la même carte réseau physique, mais dans des modes différents. Allons-y :
<code>
wlanconfig ath0 create wlandev wifi0 wlanmode ap
</code>
Cela crée une interface virtuelle nommée ath0 à partir de la carte wifi0 en mode "ap", c'est-à-dire "Access Point" soit "Point d'accès".
Ensuite, il faut fixer le SSID, c'est à dire le nom du réseau Wifi qui sera identifié par le client :
<code>
iwconfig ath0 essid "Mon OpenVPN"
</code>
Vous pouvez changer d'autres paramètres sur cette interface, comme le canal utilisé. Reportez-vous à la documentation de <code>iwconfig</code> pour en savoir plus.
Et enfin, il faut démarrer l'interface nouvellement créée.
<cadre type='alert'>À partir de là, votre point d'accès peut-être rejoint par n'importe qui !
</cadre>
<code>
ifconfig ath0 192.168.1.254 netmask 255.255.255.0
</code>
Pour rendre cette configuration persistante, il suffit de modifier le fichier <code>/etc/network/interfaces</code> sous Debian et d'y rajouter ces lignes :
<code>
# Interface pour le VPN
auto ath0
iface ath0 inet manual
        madwifi-base wifi0
        madwifi-mode ap
        wireless-channel 9
        address 192.168.1.254
        netmask 255.255.255.0
        broadcast 192.168.0.255
</code>
== Installation de OpenVPN ==
== Installation de OpenVPN ==
Je suis sous Debian, donc si ça vous vexe pas, je vais décrire la procédure d'installation à la mode Debian :) Et c'est plutôt simple :
<code>
apt-get install openvpn
</code>
Pouf pouf, c'est fait. Pour les autres distributions, je doute que ce soit plus compliqué, OpenVPN étant un logiciel couramment utilisé.
== Configuration de OpenVPN ==
== Configuration de OpenVPN ==
=== Génération des certificats ===
Alors je ne vais pas réinventer la roue. Je vous renvoie au tutoriel d'Ubuntu pour [http://doc.ubuntu-fr.org/openvpn#configuration_des_vpn la génération des fichiers du VPN]
=== Création d'un VPN ===
J'ai donc un fichier monvpn.conf dans <code>/etc/openvpn</code> qui ressemble à ça :
<code>
## Pour ne répondre au VPN que sur l'interface ath0
local 192.168.1.254
port 1194
proto udp
## Utilisation du mode routé
dev tun
## Fichiers générés à la section précédente
ca ca.crt
cert monvpn.crt
key monvpn.key  # This file should be kept secret
dh dh1024.pem
## Adresse de l'interface de sortie du VPN
server 192.168.254.0 255.255.255.0
ifconfig-pool-persist ipp.txt
## Permet de faire passer tout le trafic du client à travers le VPN
push "redirect-gateway local"
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append  /var/log/openvpn.log
verb 3
</code>
J'ai mis des commentaires là où c'est important de comprendre. Les autres paramètres sont nécessaires, mais les garder intacts est une super bonne idée :)
Et après, il n'y a plus qu'à démarrer le VPN :
<code>
/etc/init.d/openvpn start
</code>
Normalement, cette commande est exécutée automatiquement lors du démarrage de la machine. Allez faire un tour dans <code>/etc/default/openvpn</code> pour faire du démarrage sélectif de VPN.
== Modification du pare-feu ==
== Modification du pare-feu ==
C'est la partie la plus délicate. C'est celle qui m'a motivé à faire ce tutoriel :) Pour comprendre la suite, il faut comprendre le trajet d'un paquet arrivant par le VPN sur la passerelle :
* ath0 : un paquet arrive encapsulé et chiffré par le port 1194 en UDP
* Le processus OpenVPN, qui écoute sur le port et l'adresse lié à l'interface, reçoit ce paquet, le déchiffre et le renvoi au bon endroit. Comme le client envoie tous les paquets via l'adresse de l'interface créée par OpenVPN soit 192.168.254.1
* tun0 : reçoit donc le paquet en clair, et doit le transmettre à la bonne interface de sortie (car à part le ping, il n'y a rien à destination de cette interface).
* eth_adsl, eth_lan : selon la destination du paquet.
=== Sécurisation de l'interface ath0 ===
Le but est déjà de verrouiller l'interface sans-fil pour ne laisser passer que deux flux :
* Le DHCP. Bah oui, on pourrait configurer les clients à la main, mais c'est quand même plus pratique d'avoir le DHCP qui s'occupe de ça. Et ce n'est pas bien dangereux d'avoir une IP si on ne peut rien faire avec. Pour les paranoïaques, j'imagine que cela pose un problème de sécurité, si jamais il y a des failles dans le serveur DHCP. Il faut savoir qu'en WPA, le chiffrement de la connexion se fait AVANT le DHCP, ce qui est mieux. C'est un inconvénient de cette solution. À vous de voir.
* Le tunnel OpenVPN. Normal.
Donc avec iptables, ça donne ça :
<code>
## ath0 : On accepte les paquets en UDP sur le port du VPN
iptables -t filter -A INPUT -i ath0 -p udp -m udp --dport 1194 -j ACCEPT
## ath0 : On accepte les paquets en UDP sur le port DHCP
iptables -t filter -A INPUT -i ath0 -p udp -m udp --dport 67 -j ACCEPT
## tun0 : Il faut bien que le VPN envoie et reçoive des paquets
iptables -t filter -A INPUT -i tun0 ACCEPT
## Ne tapez cette commande QUE si vous N'avez PAS d'autres règles déjà en place !
iptables -t filter -A INPUT -i "!ath0" ACCEPT
## Par défaut, on jette tous les paquets en entrée. La règle précédente vous permettra d'avoir encore accès à votre machine par le réseau câblé. Sinon, tout sera bloqué...
iptables -t filter -P INPUT DROP
## Les paquets ne doivent pas passer à travers une autre interface directement, mais doivent tous être délivré à OpenVPN. C'est très important !
iptables -t filter -A FORWARD -i ath0 DROP
## Maintenant, on fait la règle de NAT pour faire sortir les paquets déchiffré par OpenVPN sur Internet. Si on ne fait pas ça, seul les paquets à destination du réseau local arriveront à destination.
iptables -t nat -A POSTROUTING -s 192.168.254.1 -j MASQUERADE
</code>
Et comme moi, j'utilise [http://ferm.foo-projects.org/ ferm] pour me simplifier la vie, voici le résumé dans une syntaxe lisible par ce logiciel :
<code>
# Activation du NAT (juste pour le VPN dans ce cas)
table nat {
        chain POSTROUTING saddr 192.168.254.1 MASQUERADE;
}
table filter {
        #Tout le trafic en sortie est autorisé
        chain OUTPUT {
                policy ACCEPT;
        }
        # On filtre tout ce qui arrive
        chain INPUT {
                policy DROP;
                interface ath0 {
                        proto udp dport openvpn ACCEPT;
                        proto udp dport bootps ACCEPT;
                }
                interface tun0 ACCEPT;
                # D'autres règles sont nécessaire pour que Internet marche.
                interface eth_adsl {
                        # On accepte seulement les paquets qui reviennent
                        mod state state INVALID DROP;
                        mod state state (ESTABLISHED RELATED) ACCEPT;
                }
        }
        # Interdiction de forwarder des paquets !
        chain FORWARD interface ath0 {
                DROP;
        }
}
</code>
Bon à partir de là, vous pouvez respirer, il est normalement impossible de se connecter via l'interface ath0 sur votre réseau.


= Préparation du client =
= Préparation du client =

Version du 22 février 2009 à 16:02

Introduction

Ceci est la suite de Créer un point d'accès sécurisé avec hostAPd. Pourquoi me direz-vous ? Et bien, d'abord, pour la beauté de la chose. Ensuite, parce que certains clients font tout simplement planter mon point d'accès, qui tourne avec le module Madwifi. Donc j'ai voulu essayer autre chose.

Présentation

Le but recherché, et c'est très important de le souligner, est de créer un point d'accès sécurisé sans WEP ni WPA, ni WPA2. Le point d'accès apparaît comme non-sécurisé, mais si tout le monde peut s'y associer, ce n'est pas pour autant qu'il va être ouvert.

Je dispose toujours du même matériel :

  • Une freebox basique (sans fonctions routeur ni wifi).
  • Un PC (passerelle pour le reste du document) connecté directement à la freebox sous Debian/testing. Elle dispose de deux cartes réseau Ethernet RJ45 (filaire) qui sont identifiées par l'OS en tant que eth_adsl et eth_local. La freebox est reliée sur eth_adsl. Un firewall tourne entre eth_adsl et eth_local à l'aide d'iptables.
  • Un switch branché sur eth_local, et sur lequel sont reliés deux clients de manière on ne peut plus classique.
  • Une carte Wi-Fi D-Link DWL-G520 PCI avec chipset Atheros (le chipset importe beaucoup plus que la carte, croyez moi !!).
  • Un ordinateur portable qui a un chipset Wifi Atheros fonctionnant avec ath9k.

<cadre type='alert'>Ce tutoriel décrit les opérations dans le sens logique d'une installation. Cependant, si vous le suivez dans l'ordre, il se peut que votre réseau se retrouve sans défense, et complètement accessible pendant un certain temps. Si vous voulez prendre le moins de risques possible, il est préférable de commencer par les règles IPTables</cadre>

Pré-requis

Malheureusement, je ne peux pas considérer que vous partez avec zéro connaissance. Mais voici la liste de ce qui doit déjà marcher sur votre installation :

  • Le chipset Wifi doit être reconnu sur le serveur
  • Le réseau doit être fonctionnel sur le serveur
  • iptables doit être installé sur le serveur
  • Le client doit avoir une carte Wifi qui marche
  • Des notions de VPN sont conseillées.

Préparation du point d'accès

Toutes les commandes de cette partie sont à exécuter avec les droits du super utilisateur.

Création de l'interface réseau

Disposant d'une carte géré par le pilote madwifi, il me faut tout d'abord créer l'interface à l'aide de wlanconfig. Cela permet de créer plusieurs interfaces virtuelles qui fonctionnent toutes sur la même carte réseau physique, mais dans des modes différents. Allons-y : wlanconfig ath0 create wlandev wifi0 wlanmode ap Cela crée une interface virtuelle nommée ath0 à partir de la carte wifi0 en mode "ap", c'est-à-dire "Access Point" soit "Point d'accès".

Ensuite, il faut fixer le SSID, c'est à dire le nom du réseau Wifi qui sera identifié par le client : iwconfig ath0 essid "Mon OpenVPN"

Vous pouvez changer d'autres paramètres sur cette interface, comme le canal utilisé. Reportez-vous à la documentation de iwconfig pour en savoir plus.

Et enfin, il faut démarrer l'interface nouvellement créée. <cadre type='alert'>À partir de là, votre point d'accès peut-être rejoint par n'importe qui ! </cadre> ifconfig ath0 192.168.1.254 netmask 255.255.255.0

Pour rendre cette configuration persistante, il suffit de modifier le fichier /etc/network/interfaces sous Debian et d'y rajouter ces lignes :

  1. Interface pour le VPN

auto ath0 iface ath0 inet manual

       madwifi-base wifi0
       madwifi-mode ap
       wireless-channel 9
       address 192.168.1.254
       netmask 255.255.255.0
       broadcast 192.168.0.255

Installation de OpenVPN

Je suis sous Debian, donc si ça vous vexe pas, je vais décrire la procédure d'installation à la mode Debian :) Et c'est plutôt simple : apt-get install openvpn Pouf pouf, c'est fait. Pour les autres distributions, je doute que ce soit plus compliqué, OpenVPN étant un logiciel couramment utilisé.

Configuration de OpenVPN

Génération des certificats

Alors je ne vais pas réinventer la roue. Je vous renvoie au tutoriel d'Ubuntu pour la génération des fichiers du VPN

Création d'un VPN

J'ai donc un fichier monvpn.conf dans /etc/openvpn qui ressemble à ça :

    1. Pour ne répondre au VPN que sur l'interface ath0

local 192.168.1.254

port 1194

proto udp

    1. Utilisation du mode routé

dev tun

    1. Fichiers générés à la section précédente

ca ca.crt cert monvpn.crt key monvpn.key # This file should be kept secret

dh dh1024.pem

    1. Adresse de l'interface de sortie du VPN

server 192.168.254.0 255.255.255.0

ifconfig-pool-persist ipp.txt

    1. Permet de faire passer tout le trafic du client à travers le VPN

push "redirect-gateway local"

keepalive 10 120

comp-lzo

user nobody group nogroup

persist-key persist-tun

status openvpn-status.log

log-append /var/log/openvpn.log

verb 3

J'ai mis des commentaires là où c'est important de comprendre. Les autres paramètres sont nécessaires, mais les garder intacts est une super bonne idée :)

Et après, il n'y a plus qu'à démarrer le VPN : /etc/init.d/openvpn start

Normalement, cette commande est exécutée automatiquement lors du démarrage de la machine. Allez faire un tour dans /etc/default/openvpn pour faire du démarrage sélectif de VPN.

Modification du pare-feu

C'est la partie la plus délicate. C'est celle qui m'a motivé à faire ce tutoriel :) Pour comprendre la suite, il faut comprendre le trajet d'un paquet arrivant par le VPN sur la passerelle :

  • ath0 : un paquet arrive encapsulé et chiffré par le port 1194 en UDP
  • Le processus OpenVPN, qui écoute sur le port et l'adresse lié à l'interface, reçoit ce paquet, le déchiffre et le renvoi au bon endroit. Comme le client envoie tous les paquets via l'adresse de l'interface créée par OpenVPN soit 192.168.254.1
  • tun0 : reçoit donc le paquet en clair, et doit le transmettre à la bonne interface de sortie (car à part le ping, il n'y a rien à destination de cette interface).
  • eth_adsl, eth_lan : selon la destination du paquet.

Sécurisation de l'interface ath0

Le but est déjà de verrouiller l'interface sans-fil pour ne laisser passer que deux flux :

  • Le DHCP. Bah oui, on pourrait configurer les clients à la main, mais c'est quand même plus pratique d'avoir le DHCP qui s'occupe de ça. Et ce n'est pas bien dangereux d'avoir une IP si on ne peut rien faire avec. Pour les paranoïaques, j'imagine que cela pose un problème de sécurité, si jamais il y a des failles dans le serveur DHCP. Il faut savoir qu'en WPA, le chiffrement de la connexion se fait AVANT le DHCP, ce qui est mieux. C'est un inconvénient de cette solution. À vous de voir.
  • Le tunnel OpenVPN. Normal.

Donc avec iptables, ça donne ça :

    1. ath0 : On accepte les paquets en UDP sur le port du VPN

iptables -t filter -A INPUT -i ath0 -p udp -m udp --dport 1194 -j ACCEPT

    1. ath0 : On accepte les paquets en UDP sur le port DHCP

iptables -t filter -A INPUT -i ath0 -p udp -m udp --dport 67 -j ACCEPT

    1. tun0 : Il faut bien que le VPN envoie et reçoive des paquets

iptables -t filter -A INPUT -i tun0 ACCEPT

    1. Ne tapez cette commande QUE si vous N'avez PAS d'autres règles déjà en place !

iptables -t filter -A INPUT -i "!ath0" ACCEPT

    1. Par défaut, on jette tous les paquets en entrée. La règle précédente vous permettra d'avoir encore accès à votre machine par le réseau câblé. Sinon, tout sera bloqué...

iptables -t filter -P INPUT DROP

    1. Les paquets ne doivent pas passer à travers une autre interface directement, mais doivent tous être délivré à OpenVPN. C'est très important !

iptables -t filter -A FORWARD -i ath0 DROP

    1. Maintenant, on fait la règle de NAT pour faire sortir les paquets déchiffré par OpenVPN sur Internet. Si on ne fait pas ça, seul les paquets à destination du réseau local arriveront à destination.

iptables -t nat -A POSTROUTING -s 192.168.254.1 -j MASQUERADE

Et comme moi, j'utilise ferm pour me simplifier la vie, voici le résumé dans une syntaxe lisible par ce logiciel :

  1. Activation du NAT (juste pour le VPN dans ce cas)

table nat {

       chain POSTROUTING saddr 192.168.254.1 MASQUERADE;

} table filter {

       #Tout le trafic en sortie est autorisé
       chain OUTPUT {
               policy ACCEPT;
       }
       # On filtre tout ce qui arrive
       chain INPUT {
               policy DROP;
               interface ath0 {
                       proto udp dport openvpn ACCEPT;
                       proto udp dport bootps ACCEPT;
               }
               interface tun0 ACCEPT;
               # D'autres règles sont nécessaire pour que Internet marche.
               interface eth_adsl {
                       # On accepte seulement les paquets qui reviennent
                       mod state state INVALID DROP;
                       mod state state (ESTABLISHED RELATED) ACCEPT;
               }
       }
       # Interdiction de forwarder des paquets !
       chain FORWARD interface ath0 {
               DROP;
       }


}
Bon à partir de là, vous pouvez respirer, il est normalement impossible de se connecter via l'interface ath0 sur votre réseau.

Préparation du client

Ubuntu 8.10 avec NetworkManager

Conclusion

Copyright

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/