Un Virtual Private Network avec OpenVPN

Virtual Private Network ? Mais qu’est-ce que c’est ?

Un Virtual Private Network est vu comme une extension du réseau local et préserve la sécurité logique que l’on peut avoir à l’intérieur de celui-ci. Il correspond en fait à une interconnexion de réseaux locaux via une technique de « tunnel ».

On peut utiliser Internet comme support de transmission en utilisant un protocole de tunneling (en encapsulant les données à transmettre de façon chiffrée). On parle alors de VPN pour désigner le réseau ainsi artificiellement créé. Ce réseau est dit virtuel car il relie deux réseaux « physiques » (réseaux locaux) par une liaison non fiable (Internet), et privé car seuls les ordinateurs des réseaux locaux de part et d’autre du VPN peuvent accéder aux données en clair.

Ce qu’il faut savoir avant de commencer

Ce tuto a été réalisé en travaillant avec une machine virtuelle sous Debian 7  (le serveur OpenVPN). La machine cliente tourne sous Windows 7.

Dans mon cas, le serveur VPN aura pour adresse IP 192.168.0.3 et le client 192.168.0.5.

Le serveur mail de A à Z

Ce serveur mail a été réalisé sur une Ubuntu 10.04.3 LTS mais le développement reste le même sur une Debian. Nous supposerons que le DNS est bien configuré (présence d’un enregistrement MX valable) et prêt à remplir correctement son rôle.

Pour ceux qui débuteraient dans le domaine, quelques explications s’imposent:

Un utilisateur est abonné chez domaine1.com et a comme adresse e-mail expediteur@domaine1.com. Un autre est abonné chez domaine2.org avec comme adresse e-mail destinataire@domaine2.orgexpediteur souhaite envoyer un e-mail à destinataire.

Voici ce qu’il va se passer :

    1. expediteur rédige le message avec son client de messagerie (appelé aussi Mail User Agent). Lorsque le message a été rédigé, expediteur l’envoie par le biais de son MUA;
    2. Le serveur smtp.domaine1.com (correspondant au MTA, Mail Transfert Agent) reçoit alors le message, il constate que le destinataire n’est pas dans son domaine. Il va donc chercher l’enregistrement MX dans le DNS de domain2.org.
      Il envoie le message à smtp.domaine2.org ;
    3. Le serveur smtp.domaine2.org reçoit à son tour le message et constate que le destinataire est bien dans son domaine. Il range le message dans la boîte aux lettres de destinataire par l’intermédiaire du MDA (Mail Delivery Agent).
    4. Lorsque destinataire décidera de regarder s’il a des nouveaux messages, il enverra une requête à son serveur imap.domain2.org au moyen de son client de messagerie;
    5. Le client de messagerie va chercher sur le serveur IMAP et consulte la boîte aux lettres de destinataire et constate qu’il y a un message dedans;
      Le message est visible dans le MUA.

Voici les différents outils qui seront utilisés:

  • Postfix (le serveur SMTP)
  • Courier-IMAP (le serveur IMAP)
  • Procmail (le MDA)
  • Amavis avec SpamAssassin et ClamAV (Antispam et Antivirus)

Postfix:

Installons tout d’abord le paquet nécessaire à l’utilisation de Postfix:

# apt-get install postfix

Normalement, quelques questions nous sont demandées:

General Type of configuration? --> Internet
Site Where should mail for root go--> On laisse blanc
Mail name? --> mail.server.be
Other destinations to accept mail for? (blank for none) --> mail.server.be, localhost
Force synchronous updates on mail queue ? --> No
Local networks ? --> 127.0.0.0/8
Use procmail for local delivery--> Yes
Mailbox size limit --> 0
Local address extension character? --> +
Internet protocols to use --> all

Il se peut parfois, lors de l’installation qu’aucune information ne soit demandée, il est possible de répondre à ces questions ultérieurement, en utilisant la commande suivante :

# dpkg-reconfigure postfix

Ensuite, nous devons modifié l’un des 2 fichiers essentiels au bon fonctionnement de Postfix, à savoir main.cf (le 2ème fichier est master.cf, ce fichier contient des informations diverses sur le comportement de Postfix et sa façon de faire résider les différents daemons ):

# nano /etc/postfix/main.cf
myhostname = mail.server.be
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname

mydestination = mail.server.be, localhost.server.be ,localhost
relayhost =
mynetworks = 127.0.0.0/8, 172.23.0.0/16, 192.168.0.0/16
#mailbox_command = /usr/bin/procmail
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/ # Si pas précisé, les mails iront dans /var/mail

Ce fichier contient la configuration principale de Postfix.

Quelques explications sur les différentes lignes de ce fichier: 

myhostname = mail.server.be

Cette option doit contenir le nom de domaine (FQDN) du serveur.

alias_database = hash :/etc/aliases

Fichier de type hash contenant une table d’alias mail. Celle-ci est éditable dans /etc/aliases, puis régénérée en hash grâce à la commande newaliases qui produit le fichier /etc/aliases.db
Cette étape est indispensable pour prendre en compte les changements.

myorigin = /etc/mailname

Cette option va indiquer le fichier qui contient une seule ligne décrivant le nom de domaine utilisé.
Dans ce cas-ci, /etc/mailname contient mail.server.be.
Il est essentiel de vérifier l’exactitude du contenu de ce fichier. Il faut que le nom de domaine soit bon sinon on aura quelques soucis.

mydestination = mail.server.be, localhost.server.be, localhost

Liste des domaines pour lesquels le serveur doit accepter le courrier.

mynetworks = 127.0.0.0/8, 172.23.0.0/16, 192.168.0.0/16

Contient la liste des réseaux locaux autorisés.

mailbox_command = /usr/bin/procmail

Commande pour utiliser Procmail comme MDA. Pas utilisé pour l’instant, on le commente.

mailbox_size_limit = 0

Limite de taille en octets pour les boîtes aux lettres, un zéro signifie qu’il n’y a pas de réstriction.

recipient_delimiter = +

Séparateur entre le nom d’utilisateur et les extensions d’adresse (par défaut le signe +).

inet_interfaces = all

Interfaces réseaux sur lesquelles le serveur va écouter.
Ici, on écoute sur toutes les interfaces.

Nous allons maintenant créer une adresse e-mail. Rien de plus simple, il suffit de créer un nouvel utilisateur:

# adduser test

On répond aux différents champs et on fixe un mot de passe pour l’utilisateur.

Pour tester si tout fonctionne correctement avant de continuer, essayons d’envoyer un mail à test:

# echo "Ceci est le contenu de mon mail" | mailx -s "ceci est le sujet" test@mail.server.be

Le mail sera automatiquement déposé dans le répertoire Maildir situé dans le répertoire personnel de test. S’il n’existe pas, le dossier Maildir sera automatiquement créé.

On peut s’assurer que le mail est arrivé en se rendant dans le répertoire personnel ou en utilisant les logs :

# cat /var/log/mail.log

Pour augmenter la sécurité du serveur de manière significative, il faut à présent parler des notions de TLS et de SASL (SSL).

Cette partie est assez délicate à réaliser, une minuscule erreur et on peut passer toute sa journée à essayer de trouver où est le problème.

Installons les paquets nécessaires:

# apt-get install libsasl2 sasl2-bin libsasl2-modules

Générons ensuite les certificats SSL auto signés pour Postfix :

# mkdir /etc/postfix/ssl
# cd /etc/postfix/ssl/
# openssl genrsa –des3 –rand /etc/hosts –out smtpd.key 1024

Nous devons choisir un passphrase (permet de sécuriser la clé privée).

Ensuite, il faut changer les permissions d’accès à l’aide d’un chmod :

# chmod 600 smtpd.key
# openssl req -new -key smtpd.key -out smtpd.csr

Quelques questions nous sont posées et comme d’habitude, on fait bien attention au Common Name. Il doit impérativement correspondre à mail.server.be.

Utilisons, à présent, les commandes suivantes (un passphrase est à nouveau demandé):

# openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out
smtpd.crt
# openssl rsa -in smtpd.key -out smtpd.key.unencrypted
# mv -f smtpd.key.unencrypted smtpd.key
# openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650

Maintenant que les certificats ont été générés, modifions la configuration de Postfix en ajoutant quelques lignes dans le fichier main.cf pour activer le TLS (ou s’assurer que les lignes suivantes y sont déjà):

smtpd_use_tls= yes
smtpd_tls_auth_only = no
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_CAfile = /etc/postfix/cacert.pem
smtpd_tls_loglevel = 3
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Ajoutons quelques lignes (toujours dans main.cf) concernant la partie SASL (permettant une authentification):

smtpd_sasl_local_domain = $myhostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous 
broken_sasl_auth_clients = yes

Le daemon d’authentification utilisé sera saslauthd:

# mkdir -p /var/spool/postfix/var/run/saslauthd
# rm –rf /var/run/saslauthd

Cette commande est très importante pour éviter d’avoir des erreurs lors du test avec testsaslauthd.

# ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
# chgrp sasl /var/spool/postfix/var/run/saslauthd
# adduser postfix sasl
# nano /etc/default/saslauthd

Dans ce fichier précédemment créé, on ajoute/vérifie les lignes suivantes :

START=yes
MECHANISMS="pam"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"

Ensuite, allons dans le fichier smtpd.conf:

# nano /etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: login plain

Dans ce fichier, j’ai dû préciser quelle méthode et quel format allaient être utilisés.
Concernant le deuxième fichier de Postfix, le master.cf, il suffit juste de décommenter les lignes suivantes (et de commenter celle concernant le port 25 afin d’autoriser uniquement l’envoi d’emails de manière sécurisée):

smtps inet n - - - - smtpd
 -o smtpd_tls_wrappermode=yes
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_client_restrictions=permit_sasl_authenticated,
reject

Il ne reste plus qu’à démarrer salsauthd et redémarrer Postfix pour prendre en compte la nouvelle configuration :

# /etc/init.d/saslauthd start
# /etc/init.d/postfix restart

On peut ensuite tester le bon fonctionnement grâce à la commande :

# testsaslauthd -u test -p Password

Courier-IMAP:

On procède à l’installation des paquets nécessaires:

# apt-get install courier-imap courier-authdaemon

Nous devons modifier une ligne dans le fichier de configuration de Courier-IMAP. Ce fichier se situe dans /etc/courier et se nomme imapd.
Il s’agit de celle concernant le MAILDIRPATH, c’est-à-dire le chemin pour accéder aux boîtes aux lettres.

On retourne alors dans le dossier de notre utilisateur et on fait :

# maildirmake Maildir

Cette commande va créer une boîte aux lettres complète chez un utilisateur. On aura un utilisateur par boîte mail.
A partir d’ici, tout est normalement fonctionnel et on peut tester avec notre logiciel de messagerie (comme Thunderbird par exemple).

Pour ce qui est de la sécurité, installons les paquets suivants :

# apt-get install courier-imap-ssl

Il faut alors modifier le fichier imapd-ssl par défaut qui se trouve dans /etc/courier/ :

TLS_CERTFILE=/etc/postfix/ssl/mail.combined.npw.pem
IMAP_TLS_REQUIRED=1
MAILDIRPATH=Maildir

Utilisons la commande suivante pour supprimer le passphrase sur le certificat cakey.pem (si ce n’est pas fait, une erreur sera visible dans les logs):

# openssl rsa –in cakey.pem -out cakey.nopw.pem

Ici, il y a une subtilité à prendre en compte. Contrairement à Postfix, le daemon IMAP exige que le certificat et la clé privée soient combinés en un même fichier.

On concatène:

# cat cacert.pem cakey.nopw.pem >> mail.combined.npw.pem
# openssl dhparam 1024 >> mail.combined.npw.pem

Il faut ensuite exécuter 2 commandes afin d’éviter une erreur « error:0906D06C:PEM routines:PEM_read_bio:no start line » dans les logs :

# chmod 400 mail.combined.npw.pem (ou 777 si cela est vraiment nécessaire)
# chattr +i mail.combined.npw.pem

Un petit redémarrage s’impose :

# /etc/init.d/courier-authdaemon restart
# /etc/init.d/courier-imap restart
# /etc/init.d/courier-imap-ssl restart

Procmail, Amavis et SpamAssassin :

Nous installons, comme toujours, les paquets nécessaires:

# apt-get install procmail amavisd-new clamav clamav-daemon spamassassin
spamc

Pour pouvoir utiliser Procmail, il faut créer un fichier dans le dossier de notre utilisateur test :

# touch .procmailrc

C’est donc dans ce fichier que seront placées les règles de filtrages. Il faut être très vigilent pour le faire fonctionner et faire très attention au droit mis sur ce fichier.
Il faut s’assurer que l’utilisateur en question soit propriétaire de ce fichier, si ce n’est pas le cas :

# chown test:test .procmailrc

Pour ce qui est des droits d’accès sur le fichier :

# chmod 600 .procmailrc

Ce qui va fixer les permissions à rw——-.
C’est-à-dire que le propriétaire aura accès en lecture et écriture (rw-) et les membres du groupe et les autres n’auront pas d’autorisation ().

En ce qui concerne ClamAV et Amavis , après l’installation chacun crée de son côté un utilisateur et un groupe. Afin que ClamAV puisse accéder aux pièces jointes décompressées par Amavis, il faut le rajouter au groupe amavis :

# addgroup clamav amavis

Pour autoriser le filtrage de ClamAV et SpamAssassin, éditons le fichier 15-content_filter_mode qui se trouve dans /etc/amavis/conf.d/:

@bypass_virus_checks_maps = ( \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = ( \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

Pour que des e-mails lui soient confiés, ajoutons ceci dans le fichier main.cf :

content_filter = scan:127.0.0.1:10024

On se rend alors dans l’autre fichier master.cf pour rajouter :

smtp-amavis unix - - y - 2 smtp
 -o smtp_data_done_timeout=1200
 -o disable_dns_lookups=yes

scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes

127.0.0.1:10025 inet n - y - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes

A présent, il faut s’assurer que SpamAssassin se lance au démarrage du système, ouvrons le fichier /etc/default/spamassassin et modifions la valeur de ENABLED :

ENABLED=1

Ensuite, on modifie la ligne concernant le nombre maximum de processus à exécuter :

OPTIONS= “--max-children 5 –helper-home-dir”

–max-children correspond au nombre d’enfants à lancer par spamd (le daemon de SpamAssassin). Aucun autre enfant ne sera lancé tant qu’un des 5 actuels ne sera pas mort. Cette option sert à éviter que trop de processus soient lancés en même temps afin de préserver la mémoire.

La configuration de SpamAssasin se fait dans le fichier local.cf présent dans /etc/spamassassin.
Dans ce fichier, il est possible de déterminer le message devant apparaitre en avant de l’en-tête :

rewrite_header Subject *****SPAM*****

Ainsi que le score au-delà duquel le message sera considéré comme spam :

required_score 10.0

Redémarrage pour prendre en compte la configuration:

# /etc/init.d/amavis restart
# /etc/init.d/clamav-daemon restart
# /etc/init.d/spamassassin restart
# /etc/init.d/postfix restart

Maintenant que les étapes nécessaires au bon fonctionnement de ces outils sont accomplies, passons au comportement souhaité de ceux-ci.

C’est dans le fichier de Procmail que tout va se passer.
Pour les spams, le comportement sera différent suivant le score, si c’est un virus, on aura aussi un comportement différent.

Il est nécessaire de créer le fichier .procmailrc dans le Home Directory de chaque utilisateur.

Au début du fichier, il faut impérativement ceci :

SHELL=/bin/sh
#PATH=${HOME}/bin:/usr/bin:/bin
DEFAULT=$HOME/Maildir/
MAILDIR=$HOME/Maildir
#LOGFILE=$HOME/.procmail.log
VERBOSE=yes
DROPPRIVS=yes
#LOGABSTRACT=all
#LOCKFILE=${HOME}/.procmail/lock

A la suite de ceci, on peut commencer à écrire nos règles :

# Permet de suivre l’email au travers du daemon spamc
# (l’interface de SpamAssassin)
:0fw
| /usr/bin/spamc
# Si l’email obtient un score de 20  supprimé
:0
* ^X-Spam-Level: *\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
/dev/null
# Si l’email obtient un score de 10
#  placé dans spam
:0
* ^X-Spam-Level: *\*\*\*\*\*\*\*\*\*
$MAILDIR/.spam/
# Si l’email est détecté comme virus
#  placé dans virus
:0:
* ^X-Amavis-Alert: INFECTED
$MAILDIR/.virus/
# Si l’email est à la fois un virus et un spam
:0:
* ^X-Amavis-Alert: INFECTED
* ^X-Spam-Status: Yes
/dev/null
# on le supprime

Du VoIP avec Asterisk

 

VoIP?  Asterisk ? Qu’est ce que c’est ?

Le VoIP  pour Voice over IP, est une technique qui permet de communiquer par la voix sur des réseaux compatibles IP, qu’il s’agisse de réseaux privés ou d’Internet, filaire (cable/ADSL/optique) ou non (satellite, wifi, GSM) . Cette technologie est notamment utilisée pour prendre en charge le service de téléphonie sur IP (« ToIP » pour Telephony over Internet Protocol).

Asterisk permet, entre autres, la messagerie vocale, les files d’attente, les musiques, …
Il est possible également d’ajouter l’utilisation des conférences par le biais de l’installation de modules supplémentaires .

Passons maintenant dans le vif du sujet:

  • Installation
Après avoir installé notre distribution Linux (ici Debian 6.0.3) dans les règles de l’art, nous allons maintenant nous attaqué à la première partie de tutoriel.
  • Asterisk

Avant toute chose, il faut installer Asterisk sur notre Debian :

# apt-get install asterisk

Si l’on souhaite avoir en plus d’asterisk, l’installation de la langue française:

# apt-get install asterisk-prompt-fr-proformatique

Nous devons maintenant autoriser le démarrage du service et ainsi terminer l’installation.
Modifions ce dernier à l’aide d’un éditeur de texte :

# nano /etc/default/asterisk

Modifions le champ : RUNASTERISK=yes

Occupons-nous à présent de la configuration des différents fichiers qui se trouvent dans /etc/asterisk (configuration de base, nous pouvons faire beaucoup plus). Il va falloir modifier 3 fichiers : sip.conf, extension.conf et voicemail.conf.

    • sip.conf

sip.conf va servir pour configurer les logins et mots de passe de tous les périphériques.
Ce fichier est organisé en différentes zones appelées « context ».
On supprime l’entièreté du fichier et on ajoute:

bindport=5060 correspond au port UDP du protocole SIP

bindaddr correspond à l’adresse IP de l’interface sur lequel le serveur va écouter le trafic (0.0.0.0 pour toutes les interfaces)

language=fr pour avoir les messages vocaux en français

Imaginons maintenant que nous ayons un utilisateur John, à la suite du fichier, nous allonsq ajouter:

[John]
secret=motdepasse ; le mot de passe est obligatoire
context=local ; obligatoire, l'extension local gère les appels de l'utilisateur
mailbox=20@default ; numéro de la messagerie
type= friend ; obligatoire, autorise les appels entrants et sortants
host=dynamic ; obligatoire 
disallow=all ; Il s'agit des codecs, toujours mettre le disallow avant
allow=gsm
allow=ulaw
allow=alaw

On peut alors faire de la même manière pour un utilisateur qu’on appellera par exemple Laurent.

    • extension.conf

Ce fichier est utilisé pour router les appels vers un utilisateur ou vers sa messagerie.

Dans la partie [local], on va rajouter:

 exten => 200, 1, Dial(SIP/John, 10)

 Les appels arrivants sur le serveur à destination du numéro 200 sont envoyés vers le téléphone de John pendant 10 secondes (même raisonnement pour Laurent).

exten => 200, 2, VoiceMail(200@default)

Puis sont envoyés sur la messagerie de John, le @default n’est pas obligatoire ici.

exten => 200,3,PlayBack(Vm-Goodbye)    ;goodbye
exten => 200,4,Wait(2)
exten => 200,5,HangUp()
exten => 500, 1, VoiceMailMain

Le numéro 500 permet de vérifier sa messagerie vocale.

On procède de la même manière pour Laurent.

Dans la partie [default]:

200 => password, John
201 => tototata, Laurent
    • voicemail.conf

Le fichier voicemail.conf permet de configurer la messagerie vocale d’Asterisk.

Il ne faut pas oublier de redémarrer le service afin de prendre en compte les changements:

# /etc/init.d/asterisk restart

Pour vérifier la configuration et l’état des téléphones, nous utiliserons la commande suivante :

# asterisk –r (ou alors, rasterisk)
*CLI> sip show peers
  • Le Trunk

Un trunk SIP est une connexion SIP faite entre 2 serveurs SIP pour faire passer des appels entre les téléphones liés à ces serveurs.

Sur le premier serveur, nous allons rajouter un utilisateur dans le fichier sip.conf comme nous l’avons fait pour John et Laurent :

[trunk_1_vers_2]
type=friend
secret=test
context=local
host=dynamic
disallow=all
allow=ulaw
insecure=port,invite

On redémarre:

# /etc/init.d/asterisk restart

Pour vérifier que la configuration est bonne, nous allons afficher les différents utilisateurs enregistrés à l’aide de cette commande :

# rasterisk
*CLI> sip show peers

On doit normalement voir cette ligne:

Name/username      Host          Dyn   Nat   ACL   Port   Status
trunk_1_vers_2     IpDuServeur1   D                 5060  Unmonitored

Sur le 2ème serveur, nous allons faire en sorte que ce serveur s’enregistre. On ajoute la ligne suivante dans le fichier sip.conf du 2ème serveur (dans local) :

register => trunk_1_vers_2:test@IpDuServeur2

Avec cette ligne, le serveur 2 va s’enregistrer sur le serveur 1 avec le login trunk_1_vers_2  et le mot de passe test.

On va également rajouter une ligne dans le fichier extensions.conf du serveur 1:

exten => _2XXX,1,Dial(SIP/trunk_1_vers_2/${EXTEN})

Ainsi grâce à cette ligne supplémentaire, les utilisateurs enregistrés sur le premier serveur pourront passer des appels à destinations des utilisateurs du 2ème serveur (mais pas l’inverse, pour que ça soit possible, il va falloir faire pareil sur le 2ème serveur).

On redémarre:

# /etc/init.d/asterisk restart

Nous testons également que la configuration est correcte en affichant l’état de la ligne :

# rasterisk
*CLI> sip show peers
  • Le client (X-Lite)

X-Lite est un softphone comme il en existe beaucoup. Il est gratuit et gère les appels vidéo.
Téléchargeable ici : http://www.counterpath.com/x-lite.html

On crée d’abord un compte avec comme IP dans Domain celle du notre serveur.

L’user ID ainsi que le Password correspondent à ceux choisis dans la configuration du fichier sip.conf.