Dans le cadre de la pandémie grippale de 2009, les établissements de l'enseignement supérieur ont imposé des plans de continuité d'activité.
Pour proposer aux personnels administratifs un accès aux ressources de l'établissement leur permettant d'effectuer les missions décidées comme stratégiques, il a été proposé de généraliser l'usage de VPN. Cependant, si les établissements disposent de VPN de type concentrateur VPN IPsec, ces derniers sont rarement dimensionnés pour absorber plusieurs dizaines voire centaines d'utilisateurs.
Il apparaît indispensable de pouvoir proposer une alternative à ces plate-formes souvent onéreuses pour faire face rapidement à la pandémie. La solution décrite ci-après utilise une solution complètement libre et ouverte, basée sur OpenVPN.
Comme tout projet qui se respecte, et pour définir sa portée plus que le simple tryptique “où on en est ? Où on va ? Comment on y va ?”, il est préférable de se rapprocher de l'allographe http://fr.wikipedia.org/wiki/CQQCOQP.
La solution de VPN OpenVPN se distingue des autres solutions par la nécessité d'installer un composant logiciel complémentaire.
Si cette caractéristique peut apparaître à certains comme un inconvénient, OpenVPN a cependant bien des avantages :
Les spécifications fonctionnelles suivantes doivent être respectées :
Les spécifications logicielles et matérielles suivantes seront utilisées :
chmod 644 /etc/ssl/certs/GlobalSign_Educational_CA.crt
apt-get install openvpn
La configuration de OpenVPN se compose des fichiers de configuration suivants :
openssl dhparam -out dh1024.pem 1024
openvpn --genkey --secret 2009.key
# OpenVPN pour l'acces a l'entite # Adresse IP locale local <Mon>.<IP>.<Quatre>.<Octets> # port d'attaque de la passerelle, fourni par la RFC port 1194 # utilisation du VPN de type IP (pas le tap de type Ethernet) dev tun0 # indication de l'utilisation en serveur tls-server mode server # configuration de la liaison tunnel PPP entre le serveur et le client ifconfig 10.140.77.3 10.140.77.4 # domaine de distributions des adresses IP ifconfig-pool 10.140.77.5 10.140.77.254 script-security 2 # definition de l'authentification PAM plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn # utilisation de l'identifiant comme login username-as-common-name client-cert-not-required # certificat propre au serveur Diffie Hellman # generation par : openssl dhparam -out dh1024.pem 1024 dh /etc/openvpn/dh1024.pem # pour l'instant, on utilise une cle symetrique # generation par : openvpn --genkey --secret cle_serveur.key tls-auth /etc/openvpn/cle_serveur.key 0 # definition de l'autorite de certification ca /etc/ssl/certs/GlobalSign_Educational_CA.crt # definition du certificat signe cert /etc/openvpn/openvpn.chez-moi.fr.pem # definition de la cle du serveur key /etc/openvpn/openvpn.chez-moi.fr.key duplicate-cn # definition du nombre maximum de clients max-clients 100 # pour l'activation du Masquerading # activation d'un script externe up "/etc/scripts/openvpn-start.sh" down "/etc/scripts/openvpn-stop.sh" # pour l'ajout de la route en local sur la passerelle route-up "/sbin/route add -net 10.140.77.0/24 tun0" # pour l'ajout de la route sur le client push "route 10.140.77.0 255.255.255.0" # redirection totale push "redirect-gateway" # fourniture du DNS local push "dhcp-option DNS <Mon>.<IP>.<DNS>.<Interne>" persist-tun persist-key # autorisation de test pour estimer le MTU optimal mtu-test mssfix 1450 # compression de la liaison comp-lzo status-version 2 # definition des fichiers de logs status /var/log/openvpn/openvpn-status.log log-append /var/log/openvpn/openvpn.log verb 4
mkdir /var/log/openvpn
auth required pam_env.so # [1] auth required pam_env.so envfile=/etc/default/locale auth sufficient pam_ldap.so account required pam_nologin.so account sufficient pam_ldap.so session sufficient pam_ldap.so session optional pam_motd.so # [1] session optional pam_mail.so standard noenv # [1] session required pam_limits.so
apt-get install libpam-ldap
# # LDAP Defaults # BASE ldap://ldap.chez-moi.fr:389 ldaps://ldap.chez-moi.fr:636 TLS_CACERT /etc/ssl/certs/GlogalSign_Educational_CA.crt SIZELIMIT 10000 TIMELIMIT 15 DEREF never
base ou=people,dc=chez-moi,dc=fr uri ldaps://ldap.chez-moi.fr/ ldap_version 3 scope sub pam_password crypt ssl on tls_checkpeer yes tls_cacertdir /etc/ssl/certs
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet static address <Mon>.<IP>.<Publique>.<Locale> gateway <Ma>.<Passerelle>.<IP>.<Locale> netmask 255.255.255.0 # The OpenVPN network interface auto eth1 iface eth1 inet static address 10.140.77.1 netmask 255.255.255.0
mkdir /etc/scripts
#!/bin/sh DNS=140.77.167.2 /sbin/iptables -t nat -A PREROUTING -s 10.140.77.0/24 -p tcp --dport 53 -j DNAT --to $DNS:53 /sbin/iptables -t nat -A PREROUTING -s 10.140.77.0/24 -p udp --dport 53 -j DNAT --to $DNS:53 /sbin/iptables -t nat -A POSTROUTING -s 10.140.77.0/24 -o eth0 -j MASQUERADE
#!/bin/sh /sbin/iptables -t nat -F
chmod 755 /etc/scripts/openvpn-st*
net.ipv4.conf.default.proxy_arp = 1 net.ipv4.conf.all.proxy_arp = 1
/etc/init.d/procps restart
net.ipv4.ip_forward=1
/etc/init.d/procps restart
apt-get install ulog-acctd
#!/bin/sh /sbin/iptables -A INPUT -i ! lo -j ULOG /sbin/iptables -A OUTPUT -o ! lo -j ULOG /sbin/iptables -A FORWARD -i ! lo -o ! lo -j ULOG
chmod 755 /etc/scripts/ulog.sh
post-up /etc/scripts/ulog.sh
sudo apt-get install ntp
Afin de ne pas ouvrir à tout l'annuaire Ldap l'accès à ce service, il peut être utilisé un filtrage sur un champ Ldap.
L'examen des attributs d'un Ldap standard présente 2 possibilités :
dialupAccess
semble le plus approprié. Il est placé à TRUE
pour un utilisateur disposant d'un accès ou FALSE
dans le cas contraire.radiusFramedProtocol
peut aussi être utilisé. Il est placé à PPP
pour un ayant droit, et n'existe pas dans le cas contraire, pour ceux disposant d'un annuaire Radius configuré pour un accès PPP.
Dans /etc/pam_ldap.conf
, il est seulement nécessaire de rajouter la ligne
pam_filter radiusFramedProtocol=PPP
ou
pam_filter dialupAccess=TRUE
pour activer le filtrage.
Après quelques mois d'exploitation, il apparaît que l'utilisation de l'UDP standard pour OpenVPN pose des difficultés dans la pratique : des sites s'obstinent à empêcher l'utilisation de connexions sortantes en UDP.
Pour contrer cette difficulté, il est possible d'associer un second serveur OpenVPN au premier, en TCP celui là. Le client n'aura qu'à remplacer UDP par TCP dans sa configuration pour disposer du même service.
# OpenVPN pour l'acces a l'entite # Adresse IP locale local <Mon>.<IP>.<Quatre>.<Octets> # port d'attaque de la passerelle, fourni par la RFC port 1194 # utilisation du VPN de type IP (pas le tap de type Ethernet) # une nouvelle interface tun1 est utilisee dev tun1 # utilisation en TCP proto tcp-server # indication de l'utilisation en serveur tls-server mode server # configuration de la liaison tunnel PPP entre le serveur et le client # une nouvelle classe est utilisee pour ce nouveau tunnel ifconfig 10.140.78.3 10.140.78.4 # domaine de distributions des adresses IP # pendant de la nouvelle classe utilisee ifconfig-pool 10.140.78.5 10.140.78.254 script-security 2 # definition de l'authentification PAM plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn # utilisation de l'identifiant comme login username-as-common-name client-cert-not-required # certificat propre au serveur Diffie Hellman # generation par : openssl dhparam -out dh1024.pem 1024 dh /etc/openvpn/dh1024.pem # pour l'instant, on utilise une cle symetrique # generation par : openvpn --genkey --secret cle_serveur.key tls-auth /etc/openvpn/cle_serveur.key 0 # definition de l'autorite de certification ca /etc/ssl/certs/GlobalSign_Educational_CA.crt # definition du certificat signe cert /etc/openvpn/openvpn.chez-moi.fr.pem # definition de la cle du serveur key /etc/openvpn/openvpn.chez-moi.fr.key duplicate-cn # definition du nombre maximum de clients max-clients 100 # pour l'activation du Masquerading # activation d'un script externe up "/etc/scripts/openvpn-start.sh" down "/etc/scripts/openvpn-stop.sh" # pour l'ajout de la route en local sur la passerelle route-up "/sbin/route add -net 10.140.78.0/24 tun1" # pour l'ajout de la route sur le client push "route 10.140.78.0 255.255.255.0" # redirection totale push "redirect-gateway" # fourniture du DNS local push "dhcp-option DNS <Mon>.<IP>.<DNS>.<Interne>" persist-tun persist-key # autorisation de test pour estimer le MTU optimal mtu-test mssfix 1450 # compression de la liaison comp-lzo status-version 2 # definition des fichiers de logs status /var/log/openvpn/openvpn-TCP-status.log log-append /var/log/openvpn/openvpn-TCP.log verb 4
Même chose pour la configuration des scripts de démarrage et d'arrêt pour la mise en place du masquage d'adresses :
#!/bin/sh DNS=140.77.167.2 /sbin/iptables -t nat -A PREROUTING -s 10.140.78.0/24 -p tcp --dport 53 -j DNAT --to $DNS:53 /sbin/iptables -t nat -A PREROUTING -s 10.140.78.0/24 -p udp --dport 53 -j DNAT --to $DNS:53 /sbin/iptables -t nat -A POSTROUTING -s 10.140.78.0/24 -o eth0 -j MASQUERADE
#!/bin/sh /sbin/iptables -t nat -F
Les clients nécessitent deux ou trois fichiers de configurations :
sudo apt-get install openvpn
sudo apt-get install ca-certificates
sudo chmod 600 /etc/openvpn/pwd.txt
/etc/init.d/openvpn restart
La configuration se réalise via l'interface gnome-network-manager. TBD
mkdir Library/openvpn
cd ~/Library/openvpn tar xvzf ~/Downloads/OpenVPN-MacOSX.tgz
Cette documentation est distribuée sous FDL.
L'auteur remercie les auteurs de OpenVPN et tous ceux qui, par la lecture de ces lignes, déploieront de manière opérationnelle cet outil.