WikiMiNET

La documentation technique et administrative

Outils pour utilisateurs

Outils du site


wiki:services:openvpn:vpnprod

VPN

VPN1 est le nouveau VPN (à l'heure où j'écris ces lignes) de 2017. (Il remplace le précédent VPN1) Il y a un serveur OpenVPN et un serveur SSH qui tournent dessus. Il y a des aussi des règles pour Fail2ban dans IPTables (voir wikipédia.) De même, “unattended-upgrades” est installé pour installer automatiquement les updates de sécurité de debian.

Comment les accès sont gérés ?

Comment je crée mes clés?

Pour avoir ses accès sur le VPN il faut tout d'abord créer ses clés OpenVPN. Premièrement demandez à un membre de MiNET qui a déjà accès au VPN le fichier ca.crt.

La première étape sera de télécharger un outil appelé “easy-rsa” (logique vu que ça sera des clés RSA qui seront créées…). Pour télécharger easy-rsa on peut faire par exemple

git clone https://github.com/OpenVPN/easy-rsa.git

Déplacez vous dans le dossier créé. Pour avoir la version 2.x:

git checkout release/2.x

Allez ensuite dans easy-rsa/2.0/. Vous allez ensuite devoir renommer (ou faire un lien symbolique) un des openssl-x.y.z.cnf en openssl.cnf pour que ça match avec votre version d'openssl (normalement c'est la dernière). Pour faire un lien symbolique:

ln -s openssl-1.0.0.cnf openssl.cnf

Puis éditez le fichier

vars

Par exemple en modifiant ces variables :

export KEY_COUNTRY="FR"
export KEY_PROVINCE="Ile-de-France"
export KEY_CITY="Evry"
export KEY_ORG="MiNET"
export KEY_EMAIL="(user)@minet.net"
export KEY_OU="Equipe"

Puis chargez les variables

source ./vars

Mettez le ca.crt que on vous a filé dans le dossier keys/ (qu'il faut créer) Ensuite vous allez créer votre clé ainsi qu'une demande de signature pour votre clé (CSR: certificate signing request).

./build-req ton_pseudo_ldap_en_minuscules

On vous demandera de renseigner des informations. Le “Common Name” doit être votre pseudo en minuscules. (Laissez challenge password vide, il est mis en clair dans le fichier)

Un fichier ton_pseudo.key et ton_pseudo.crt seront créé dans le dossier keys/ que vous devez créer auparavant Le fichier en .key est la clé privée. Il faut la garder bien précieusement et ne jamais l'envoyer à qui que ce soit.

Il faut envoyer le .csr au président ou à un membre qui détient le CA (autorité de certification). Celui-ci vous renverra votre certificat signé (le fichier .crt qui sera envoyé au VPN pour certifier que vous avez bien le droit d'y accéder).

Une fois qu'on vous a renvoyé un fichier par mail, vous aurez trois fichiers importants: deux .crt ( ca.crt et pseudo.crt) et un .key (vous pouvez supprimer le .csr, il ne vous sert plus à rien à ce moment là)

Vous pourrez mettre ces trois fichiers dans le dossier de votre choix et vous débarrasser de easy-rsa.

Une fois que vous avez fait ça, il faut prendre le fichier de configuration (pour que le client VPN sache comment communiquer avec notre serveur VPN), que vous pouvez trouver plus bas dans la page (n'oubliez pas d'éditer les chemins de fichiers vers le ca.crt, votre .crt et votre .key dans la configuration).

Vous pouvez normalement vous connecter aux réseaux privés de MiNET (et tout casser :D)

sudo openvpn /chemin/vers/votre/fichier/de/config.conf

On vous demandera des identifiants, c'est ceux de MiNET.

==== Pour les clés ==== Le président détient les clés du CA, permettant de créer des nouvelles clés aux utilisateurs, qui sont ensuite envoyé sur le vpn, dans le home de l'utilisateur concerné. ===== IPTables ===== Le pare-feu a été configuré pour NAT les clients d'openVPN. ==== Authentification openvpn ==== L'authentification openvpn utilise user-password, permettant de vérifier l'identité de l'utilisateur qui se connecte (on ne veut pas que les clés suffisent à accéder à nos réseaux privés). On utilise PAM couplé au module pam-ldap. === vsftpd === Le home des utilisateurs est accessible en ftp utilisant TLS, grâce à vsftpd, il est configuré pour utiliser PAM pour l'authentification : on vérifie avec le LDAP. Les utilisateurs sont chroot dans leur home et ont uniquement le droit de lecture, ce qui leur permet de récupérer leur clé sans leur donner accès à la machine se qui rendrait inutile la segmentation des accès : les utilisateurs auraient accès à tous les sous réseaux auquel le vpn est connecté. (ssh c'est pour le management pas pour vpn) En fait les utilisateurs se connectent sur le port 2121, ensuite les utilisateurs utilisent un mode passif qui écoute sur les ports 64000-64321 (donc il faut rajouter une ligne iptables).

Pour les sous réseaux

Eh bien quand vous vous connectez avec OpenVPN sur le serveur, celui-ci vous attribue une IP. Dans notre cas, ça sera quelque chose du genre 10.0.X.Y.

Ensuite, quand vous allez vouloir accéder à un service par exemple dans 192.168.102.0/24, vous allez être NATé par le serveur derrière son IP. Chaque groupe d'utilisateurs du VPN ont une plage d'IP

Groupe IP/masque Accès
Nouveaux utilisateurs 10.0.0.0/24 Rien
Production 10.0.1.0/24 10,14,16,103,104,147,999
Developpement 10.0.64.0/24 192.168.103.0/24

Pour restreindre les accès, nous utilisons IPTables. Il suffit de restreindre le forward des packets selon l'adresse IP source. Par exemple, nous n'autorisons les IP en 10.0.2.0/24 qu'au VLAN de dev.

Comment ajouter les accès à quelqu'un ?

Vous devez avoir la clé privée du CA.

  1. Donner le ca.crt à la personne, lui dire d'aller regarder sur le wiki pour savoir comment créer ses clés
  2. Une fois que la personne vous a filé le .csr, signez le (./sign-req ) après avoir bien vérifié que le csr appartient bien à la personne. Renvoyez à cette personne le .crt ainsi créé.
  3. Ajouter les droits dans le LDAP pour que cette personne puisse utiliser le VPN
  4. À ce moment là, la personne devrait pouvoir se connecter au VPN avec openVPN. Elle n'aura juste aucune route d'accessible… Vous devez donc définir à quoi elle aura accès.
  5. Utilisez /etc/openvpn/manage_users.py (python3) pour générer les fichiers de conf pour chaque utilisateur après avoir édité /etc/openvpn/vpn.conf. Dans ce fichier vous pourrez assigner à un pseudo (le même que celui que vous avez utilisé pour la clé) un groupe. Le script python se chargera de faire tous les fichiers de conf.

(En réalité il va dans /etc/openvpn/ccd/ et crée un fichier avec le pseudo de l'utilisateur. Dedans om définit l'IP que le VPN lui attribuera ainsi que spécifie les routes qui lui seront automatiquement pushées.)

À lire si vous éditez directement les fichiers dans /etc/openvpn/ccd/*

Les routes dans les fichiers de ccd/* ne permettent pas de contrôler l'accès des gens à la prod. C'est l'adresse IP définie qui permet de faire cela.

Si par exemple vous ne pushez pas la route 192.168.102.0/24 à un membre, il pourra très bien la rajouter à la main sur son client genre “ip route add 192.168.102.0/24 via 10.0.1.2” et ainsi quand même accéder au VLAN 102.

Les règles d'accès pour chaque plage d'IP sont définies dans iptables!

Comment rajouter un groupe ?

  1. Commencez par le référencer dans le tableau ci-dessus.
  2. Ajoutez “route 10.0.X.0 255.255.255.0” dans /etc/openvpn/openvpn.conf
  3. Ajoutez des règles IPTables autorisant le trafic de tun0 avec comme IP source votre plage, vers l'interface destination et plage d'IP destination.
  4. Ajoutez une entrée dans /etc/openvpn/vpn.conf avec la plage d'IP correspondante et les routes

Comment rajouter une interface au vpn ?

  1. Ajoutez l'interface sur proxmox
  2. Renommez l'interface proprement (genre “eth” + vlan) avec udev
  3. Configurer une IP pour cette interface
  4. Ajoutez une règle au pare-feu pour que le VPN NAT sur cette interface (masquerade)
  5. Ajouter une règle au pare-feu pour que certains groupes puissent l'utiliser (forward)
  6. Rajouter votre interface aux groupes en n'oubliant pas de l'ajouter au tableau ci-dessus

Un joli de fichier de conf commenté pour Linux

##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server.     #
#                                            #
# This configuration can be used by multiple #
# clients, however each client should have   #
# its own cert and key files.                #
#                                            #
# On Windows, you might want to rename this  #
# file so it has a .ovpn extension           #
##############################################

# Specify that we are a client and that we
# will be pulling certain config file directives
# from the server.
client

# Use the same setting as you are using on
# the server.
# On most systems, the VPN will not function
# unless you partially or fully disable
# the firewall for the TUN/TAP interface.
;dev tap
dev tun

# Windows needs the TAP-Win32 adapter name
# from the Network Connections panel
# if you have more than one.  On XP SP2,
# you may need to disable the firewall
# for the TAP adapter.
;dev-node MyTap

# Are we connecting to a TCP or
# UDP server?  Use the same setting as
# on the server.
proto tcp

# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 157.159.40.19 443
remote 157.159.40.20 443

# Choose a random host from the remote
# list for load-balancing.  Otherwise
# try hosts in the order specified.
remote-random

# Keep trying indefinitely to resolve the
# host name of the OpenVPN server.  Very useful
# on machines which are not permanently connected
# to the internet such as laptops.
resolv-retry infinite

# Most clients don't need to bind to
# a specific local port number.
nobind

# Downgrade privileges after initialization (non-Windows only)
;user nobody
;group nogroup

# Try to preserve some state across restarts.
persist-key
persist-tun

# If you are connecting through an
# HTTP proxy to reach the actual OpenVPN
# server, put the proxy server/IP and
# port number here.  See the man page
# if your proxy server requires
# authentication.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

# Wireless networks often produce a lot
# of duplicate packets.  Set this flag
# to silence duplicate packet warnings.
;mute-replay-warnings

# SSL/TLS parms.
# See the server config file for more
# description.  It's best to use
# a separate .crt/.key file pair
# for each client.  A single ca
# file can be used for all clients.
ca /absolute/path/ca.crt
cert /absolute/path/insolentbacon.crt
key /absolute/path/insolentbacon.key

# Verify server certificate by checking
# that the certicate has the nsCertType
# field set to "server".  This is an
# important precaution to protect against
# a potential attack discussed here:
#  http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the nsCertType
# field set to "server".  The build-key-server
# script in the easy-rsa folder will do this.
remote-cert-tls server

# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1

# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
cipher AES-256-CBC

# Enable compression on the VPN link.
# Don't enable this unless it is also
# enabled in the server config file.
comp-lzo

# Set log file verbosity.
verb 3

# Silence repeating messages
;mute 20

auth-user-pass

#  Authenticate data channel packets with SHA515 algorithm
auth SHA512

# Don't cache username/password
auth-nocache

Comment avoir les DNS derrière les VPNs

; Pour avoir les bons DNS (voir plus loin pour avoir le script) up /etc/openvpn/update-resolv-conf.sh down /etc/openvpn/update-resolv-conf.sh

</code> Une fois ce fichier créé, copiez-le et modifiez la copie de façon à pouvoir également accéder au vpn2.

Pour avoir les bons DNS lorsque vous activez openvpn :

Ce fichier c'est de la merde, ça marche pas sous arch. https://github.com/masterkorp/openvpn-update-resolv-conf

Ce fichier c'est de la merde, beaucoup de distro packagent (donc incluent et maintiennent) déjà leurs scripts pour la gestion des DNS (c'est au moins le cas pour Gentoo et Arch) ; renseignez vous sur les usages pour votre distro ;)

update-resolv-conf.sh
#!/bin/bash
 
## You might need to set the path manually here, i.e.
RESOLVCONF=/usr/bin/resolvconf
 
case $script_type in
 
up)
  for optionname in ${!foreign_option_*} ; do
    option="${!optionname}"
    echo $option
    part1=$(echo "$option" | cut -d " " -f 1)
    if [ "$part1" == "dhcp-option" ] ; then
      part2=$(echo "$option" | cut -d " " -f 2)
      part3=$(echo "$option" | cut -d " " -f 3)
      if [ "$part2" == "DNS" ] ; then
        IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"
      fi
      if [[ "$part2" == "DOMAIN" || "$part2" == "DOMAIN-SEARCH" ]] ; then
        IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"
      fi
    fi
  done
  R=""
  if [ "$IF_DNS_SEARCH" ]; then
    R="search "
    for DS in $IF_DNS_SEARCH ; do
      R="${R} $DS"
    done
  R="${R}
"
  fi
 
  for NS in $IF_DNS_NAMESERVERS ; do
    R="${R}nameserver $NS
"
  done
  #echo -n "$R" | $RESOLVCONF -p -a "${dev}"
  echo -n "$R" | $RESOLVCONF -a "${dev}.inet"
  ;;
down)
  $RESOLVCONF -d "${dev}.inet"
  ;;
esac

Enfin, lancez le tunnel avec sudo openvpn /path/to/conf/file. Pour accéder à internet en passant par le vpn, lancez : sudo openvpn –config /path/to/conf/file –redirect-gateway

Il existe plusieurs VPNs à minet, voici leurs adresses pour rappel :

  vpn1 : 157.159.40.19
  vpn2 : 157.159.40.20

Pour info, sur vpn1 et vpn2 les comptes sont issus des comptes Gosa (donc du LDAP).

Remarques

  • Automatiquement vous utiliserez le dns du serveur vpn, vous pouvez donc vous logger sur les serveurs à partir de leur DNS
  • Pour avoir le vpn sur network-manager (Gnome3) :
sudo apt-get install network-manager-openvpn network-manager-openvpn-gnome
network-manager-pptp network-manager-strongswan
network-manager-vpnc network-manager-vpnc-gnome
 

Gateway : vpn1(2).minet.net Type : mot de passe + certificat TLS

Le reste est plutôt facile à remplir ;)

IMPORTANT : ne pas oublier de cocher la case tout en bas pour les options ipv6

Comment regénérer la CRL

La CRL ou certificate revocation list, permet de révoquer des certificats. Elle est signée par le CA et doit être renouvelée régulièrement.

Pour la réactualiser il faut faire:

source vars
export KEY_CN=“”
export KEY_OU=“”
export KEY_NAME=“”
openssl ca -gencrl -out “$CRL” -config “$KEY_CONFIG”

Comment accéder au VPN depuis Windows ?

Installer OpenVPN sur votre machine en vous rendant à l'adresse suivante : http://openvpn.net/index.php/open-source/downloads.html

Une fois installé, rendez vous dans le dossier C:\Program Files\OpenVPN\config\ et créez un nouveaux fichier MiNET.txt . Ouvrez le et tapez : <code> client dev tun ;proto udp remote vpn1.minet.net ;remote 157.159.40.20 ; eduroam ;proto tcp ;remote 157.159.40.133 443 cipher AES-256-CBC resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert.crt key.key ns-cert-type server comp-lzo verb 3 route-method exe route-delay 2 auth-user-pass script-security 2 ;up /usr/share/openvpn/update-resolv-conf ;down /usr/share/openvpn/update-resolv-conf </code> et remplacer par votre pseudo.

Ensuite renommez le en MiNET.ovpn.

Lancez ensuite openvpn et dans la barre d’icône en bas à droite cliquez avec le bouton droit de la souris sur l’icône openvpn et sélectionnez MiNET puis connecter. Rentrez votre login et mot de passe et c'est bon :) .

wiki/services/openvpn/vpnprod.txt · Dernière modification: 2018/10/15 20:21 par shatoon