User Tools

Site Tools


iut:projtut:vpn:server

Introduction

The VPN will be run on a server debian. The authentication will be done by LDAP. We are using Openvpn with openSSL, openLDAP and pam_ldap.

La double authentification utilisant PAM permet d'ajouter un niveau de sécurité à l'authentification par certificat. L'authentification par PAM peut permettre de gérer les utilisateurs dans une base LDAP.

Installation

Requirements

- A PC with 2 network cards Here, eth0 will be 'the internet', eth1 will be the LAN on which openvpn is active

- VirtualBox if you don't plan on using a real machine

- Debian 6.0

- A WiFi access-point

How-to

Installing Debian

Machine name : ProjetChilli

Domain : (none)

Root password : projet

New user : projet

User ID : projet

User password : ” ” (space)

Use one disk containing all partitions

Don't check any other CDs

Use ftp.fr.debian.org as network mirror

Don't use popularity contest

Select : Graphic environment (optional), Web DNS SSH servers (the SQL server proposed is PostgreSQL; we are going to use MySQL so don't select the option in this case)

Unselect : Standard system utilities

Configuration OpenVPN

Dans un premier temps, la création du certificat de l'authorité de certification ainsi que l'ensemble des certificats et clés nécessaires peut être facilement réalisée en utilisant easy-rsa (fourni avec OpenVPN).

Création certificat avec openSSL

Sur une machine Debian; easy-rsa se trouve dans le répertoire /usr/share/doc/openvpn/examples/easy-rsa/2.0/. Sur une machine gentoo, easy-rsa est disponible dans le répertoire /usr/share/openvpn/easy-rsa/2.0/.

# . ./vars
# ./clean-all

Pour créer le certificat de l'autorité de certification, il suffit de lancer :

# ./build-ca et de remplir correctement tous les champs, SURTOUT le common Name qui doit etre rempli a la main et unique pour chaque client.

Country Name (2 letter code) [FR]:

State or Province Name (full name) [France]:

Locality Name (eg, city) [Dijon]:

Organization Name (eg, company) [MonEntreprise]:

Organizational Unit Name (eg, section) []:

Common Name (eg, your name or your server's hostname) []:MonServeur

Email Address [[contact@monentreprise.fr->mailto:contact@monentreprise.fr]]:

Pour créer les clés et le certificat du serveur, il suffit de lancer :

# ./build-key-server server

Le certificat sera automatiquement signé par l'autorité de certification.

Enfin, pour chaque client, on peut lancer la commande :

./build-key client1 

./build-key client2 
...

pour créer autant de clés signées que vous souhaitez avoir de clients diffèrents.

Pour finir, il faut créer le secret partagé servant pour Diffie-Helman: ./build-dh

Le résultat de toutes ces actions se trouve dans le répertoire ./keys.

Configuration server

Tout d'abord, il faut installer les paquets nécessaires :

''# apt-get install openvpn libpam0g-dev''

Puis, il suffit de créer un fichier server.conf et un répertoire server dans /etc/openvpn/. Le répertoire /etc/openvpn/server/ permet de stocker les clés et certificats, il faut recopier les fichiers ca.crt, dh1024.pem, server.crt et server.key dans ce répertoire. Il faut ensuite s'assurer que tous ces fichiers sont accessibles uniquement en lecture par root.

Voici un exmple de fichier server.conf

;Port en écoute utilisé pour la connexion VPN
port 1194

;Protocole utilisé (Le protocole udp transmet les données plus rapidement)
proto udp

;Type d'interface réseau virtuelle créée
dev tun

;Nom des fichiers servant à l'authentification des clients via OpenSSL
ca ca.crt
cert server.crt
key server.key  
dh dh1024.pem

;Adresse du réseau virtuel (Le serveur aura l'adresse 10.8.0.1)
server 10.8.0.0 255.255.255.0

;Cette ligne ajoute sur le client la route du réseau du serveur
push "route 10.8.0.0 255.255.255.0"

;Ces lignes indiquent aux clients l'adresse des serveur DNS et WINS
push "dhcp-option DNS IP_DNS"

# Cette ligne permet aux clients de voire les autres clients
;client-to-client

keepalive 10 120

;Cette ligne active la compression
comp-lzo

;Ces lignes indiquent un user et un group particulier pour le processus
user openvpn
group openvpn

;Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun

;status openvpn-status.log

;Cette ligne permet d'indiquer le niveau de log souhaité (de 1 à 9)(on le mettra a 3 ou 4 c'est suffisent)
verb 3

# Ici la partie afin d'avoir l'authentification LDAP 
username-as-common-name
plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn 

Il faut ensuite installer openvpn et créer un fichier clientX.conf pour chaque client. (si ubuntu : idem que pour le serveur).

client
	dev tun
	proto tcp
	remote ip XXXX  # adresse ip ou nom de la machine distante
        port 1194
        resolv-retry infinite
        nobind
        ns-cert-type server
	persist-key
	persist-tun

	ca      ca.crt
	key     client1.key
	cert    client1.crt
        dh      dh1024.pem

	comp-lzo
	# OpenVPN doit utiliser une authentification PAM
	auth-user-pass 
       verb 3

Pour lancer le serveur : Soit :

/etc/init.d/openvpn

soit on se place dans le serveur courant et on tape

openvpn server.conf

Configuration LDAP

On installe openLDAP

apt-get install slapd ldap-utils libldap-2.4-2 libdb4.6

Modifier ces lignes dans /etc/hosts :

127.0.0.1	monarch.projetVPN.com krb.projetVPN.com ldap.projetVPN.com monarch krb ldap

On répond aux questions de configurations:

Omit OpenLDAP server configuration? No
DNS domain name: projetVPN.com
Organization name? projetVPN.com
Administrator password: projet
Confirm password: projet
Database backend to use: BDB
Do you want the database to be removed when slapd is purged? No
Allow LDAPv2 protocol? No

Dé-commenter ces lignes dans /etc/ldap/ldap.conf :

BASE  dc=projetVPN, dc=com
URI ldap://127.0.0.1/ 

Ensuite on configure /etc/ldap/slapd.conf. soyez sure que tous les schéma sont dé commentés :

include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/nis.schema
include         /etc/ldap/schema/inetorgperson.schema

Puis changer le niveau des log :

loglevel 256

Ajouter les index de recherche

index           objectClass eq
index           uid         eq

Pour rendre ces options actives

sudo invoke-rc.d slapd stop
sudo slapindex // lancer cette commande avec l'utilisateur openldap!
sudo chown openldap:openldap /var/lib/ldap/*
sudo invoke-rc.d slapd start

Test

On lance un ldapsearch -x, on doit obtenir quelque chose comme ca :

ldapsearch -x

# extended LDIF
#
# LDAPv3
# base <dc=projetVPN, dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# spinlock.hr
dn: dc=projetVPN,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: projetVPN.com
dc: projetVPN

# admin, projetVPN.com
dn: cn=admin,dc=sprojetVPN,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

Création de la structure de base de "l'arbre" LDAP

La base de données LDAP est structuré comme un arbre. L'élément de haut niveau dans l'arborescence de votre organisation est souvent son nom de domaine. Dans le cas d'un projetVPN.com de domaine, le sommet de l'arbre serait dc=projetVPN, dc=com. Pour cela il faut créer le fichier /var/tmp/ou.ldif (ou ~/ou.ldif) :

dn: ou=People,dc=projetVPN,dc=com
ou: People
objectClass: organizationalUnit

dn: ou=Group,dc=projetVPN,dc=com
ou: Group
objectClass: organizationalUnit

Pour recharger le fichier ou.ldif :

sudo invoke-rc.d slapd stop
sudo slapadd -c -v -l /var/tmp/ou.ldif
sudo invoke-rc.d slapd start

On relance un ldapsearch -x, avec comme résultat :

ldapsearch -x ou=people

# extended LDIF
#
# LDAPv3
# base <dc=projetVPN, dc=com> (default) with scope subt
# filter: ou=people
# requesting: ALL
#

# People, projetVPN.com
dn: ou=People,dc=projetVPN,dc=com
ou: People
objectClass: organizationalUnit

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

Création compte d'utilisateur

On crée le fichier /var/tmp/user1.ldif, on ajoute ces lignes :

dn: cn=user1,ou=group,dc=projetVPN,dc=com
cn: user1
gidNumber: 20000
objectClass: top
objectClass: posixGroup

dn: uid=user1,ou=people,dc=projetVPN,dc=com
uid: user1
uidNumber: 20000
gidNumber: 20000
cn: user1
sn: user1
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
loginShell: /bin/bash
homeDirectory: /home/user1

Pour charger le fichier LDIF dans le serveur, nous allons voir un exemple en utilisant l'outil en ligne, ldapadd :

ldapadd -c -x -D cn=admin,dc=projetVPN,dc=com -W -f /var/tmp/user1.ldif

Enter LDAP Password: PASSWORD
adding new entry "cn=user1,ou=group,dc=projetVPN,dc=com"

adding new entry "uid=user1,ou=people,dc=projetVPN,dc=com"

On défini un mot de passe :

ldappasswd -x -D cn=admin,dc=projetVPN,dc=com -W -S uid=user1,ou=people,dc=projetVPN,dc=com

New password: new user password
Re-enter new password: new user password
Enter LDAP Password:  admin password
Result: Success (0)

On vérifie que notre utilisateur est bien rentré dans notre base : <base>ldapsearch -x uid=user1

# extended LDIF # # LDAPv3 # base <dc=projetVPN, dc=com> (default) with scope subtree # filter: uid=user1 # requesting: ALL #

# user1, people, projetVPN.com dn: uid=user1,ou=people,dc=projetVPN,dc=com uid: user1 uidNumber: 20000 gidNumber: 20000 cn: user1 sn: user1 objectClass: top objectClass: person objectClass: posixAccount loginShell: /bin/bash homeDirectory: /home/user1

# search result search: 2 result: 0 Success

# numResponses: 2 # numEntries: 1 </base> Configuration LDAP OK!

Configuration nss_ldap

Maintenant que nous avons créé un nouvel utilisateur dans LDAP, il faut permettre au système de le voir. Par exemple, nous allons tester l'existence d'utilisateurs root et user1.

id root
uid=0(root) gid=0(root) groups=0(root)

id mirko
id: mirko: No such user

Installation de nss_ldap

apt-get install libnss-ldap nscd

Configuration de libnss-ldap

LDAP server Uniform Resource Identifier: ldap://127.0.0.1/ (Note the "ldap://", NOT "ldapi://"!)
Distinguished name of the search base: dc=projetVPN,dc=com
LDAP version to use: 3
Does the LDAP database require login? No
Special LDAP privileges for root? No
Make the configuration file readable/writeable by its owner only? No
Make local root Database admin. No
Does the LDAP database require login? No
Local crypt to use when changing passwords. crypt

Pour configurer le module nss, ouvrez /etc/libnss-ldap.conf et vérifier que la configuration est bonne :

base dc=projetVPN,dc=com
uri ldap://127.0.0.1/</ldap>

Pour finir éditez /etc/nsswitch.conf et remplacer ces deux lignes :
<code>passwd:         files ldap
group:          files ldap

On stop le démon nscd…

invoke-rc.d nscd stop

…et on vérifie que l'utilisateur est bien visible

id user1
uid=20000(user1) gid=20000(user1) groups=20000(user1)

Configuration pam_ldap

Le module pam_ldap nous servira pour l'authentification de nos utilisateurs.

apt-get install libpam-ldap

Pour configurer le module pam, il faut modifier le fichier /etc/pam_ldap.conf :

 base dc=projetVPN,dc=com
uri ldap://127.0.0.1/

Maintenant, nous allons configurer PAM lui-même. La configuration PAM est assez fragile, donc utilisez les exemples fournis qui ont été vérifiés. Pour toute modification, regardez bien la syntaxe de configuration PAM du fichier et une attention particulière aux variations insignifiantes en apparence - avec PAM, ils font souvent tout un monde de différence!!!(utiliser les tab et non l'espace!)

On commence par modifier le fichier /etc/pam.d/common-account…

account sufficient      pam_unix.so user_first_pass
account sufficient        pam_ldap.so

…ensuite /etc/pam.d/common-auth…

auth sufficient pam_ldap.so 
auth sufficient pam_unix.so nullok_secure use_first_pass
auth required pam_deny.so

…et finalement /etc/pam.d/common-session

session required        pam_unix.so
session required        pam_mkhomedir.so skel=/etc/skel/ umask=0022

Configuration pam_ldap pour openvpn

On crée le fichier /etc/pam.d/openvpn en y ajoutant les lignes suivantes :

account required pam_ldap.so config=/etc/openvpn/pam_ldap.conf
auth  required pam_ldap.so config=/etc/openvpn/pam_ldap.conf
password required pam_ldap.so config=/etc/openvpn/pam_ldap.conf
session required pam_ldap.so config=/etc/openvpn/pam_ldap.conf

Et enfin on crée le fichier L’autre fichier est /etc/openvpn/pam_ldap.conf :

    # change to your search base
    base dc=projetVPN,dc=com

    # change according to your settings
    uri ldap://127.0.0.1/
    ldap_version 3
    rootbinddn cn=admin,dc=projetVPN,dc=com
    pam_login_attribute uid
    pam_password ccrypt

And now…Enjoyed!

iut/projtut/vpn/server.txt · Last modified: 2013/12/25 16:47 (external edit)