vendredi 26 juillet 2013

Sécuriser apache2 avec SSL

SSL est un protocole qui a été développé par la société Netscape.

Ce protocole permet à deux machines de communiquer de manière sécurisée. Les informations échangées entre les deux machines sont de ce fait inviolables.

Le protocole SSL se traduit par la combinaison de deux protocoles bien distincts (Handshake et Record) qui permettent la négociation entre les deux machines et le chiffrement des données échangées.

plus d'informations concernant le fonctionnement du Protocole SSL

Exercice 1 : Module SSL

1) Activez le module ssl d'apache2

Exercice 2 : Création d'un nom de domaine local

1) Créez le nom de domaine local http://www.sitessl.com qui redirigera vers votre serveur

2) Configurez un virtualhost pour que le nom de domaine précédemment créé pointe vers le dossier /www/htdocs/sitessl/html/

Exercice 3 : OpenSSL

1) Installez le paquet openssl

2) En utilisant OpenSSL, créez un certificat pour sitessl.com de type x509 dans /etc/apache2/server.crt ainsi que sa clé privée dans /etc/apache2/server.key, ce certificat doit être valable pendant 365 jours

3) Pour des raisons de sécurité, donnez les droits ... à la clé /etc/apache2/server.crt

Exercice 4 : Configuration du virtualhost

1) Vérifiez qu'Apache écoute bien le port 443

2) Activez le moteur SSL pour le domaine sitessl.com

3) Définissez le certificat créé dans l'exercice 3 comme certificat identifiant le serveur

4) Définissez la clé créée dans l'exercice 3 pour signer l'échange de clé entre le client et le serveur

5) Redirigez les connexions du port 80 vers le port 443


Correction de l'exercice 1

Dans apache2, pour activer le module SSL il suffit d'utiliser la commande suivante :

# a2enmod ssl

et on n'oublie pas de redemarrer apache2 pour prendre en compte les changements :

# /etc/init.d/apache2 restart

Correction de l'exercice 2

On va rediriger le nom de domaine sitessl.com vers notre serveur, bien entendu vous ne deviendrez propriétaire de ce nom de domaine, seul votre ordinateur redirigera vers l'IP de votre serveur.

Si votre navigateur web se trouve sous Windows, vous devez ouvrir le fichier hosts qui se trouve dans C:\Windows\System32\drivers\etc\host avec votre éditeur texte habituel.

Si votre navigateur web se trouve sous Mac ou Linux, vous devez ouvrir le fichier hosts qui se trouve dans /etc/hosts avec votre éditeur texte habituel.

On ajoute dans ce fichier les lignes suivantes :

192.168.1.17 sitessl.com
192.168.1.17 www.sitessl.com

En prenant soin de changer l'IP pour celle de votre serveur.

Maintenant nous devons signaler au serveur que les requêtes arrivant depuis le domaine sitessl.com devront être redirigées vers le dossier /www/htdocs/sitessl/html/.

On commence par créer les dossiers qui accueilleront les fichiers concernants notre virtualhost : Nous enregistrerons les logs dans le dossier /www/htdocs/logs/, si celui-ci n'est pas encore créé on le fait :
mkdir /www/htdocs/logs/
Puis le dossier /www/htdocs/sitessl/html/ qui contiendra nos fichiers liés au virtualhost sitessl.com :
# mkdir /www/htdocs/sitessl/
# mkdir /www/htdocs/sitessl/html/
On va créer une page html simplisme pour vérifier que tout fonctionne une fois tout installé :
# nano /www/htdocs/sitessl/html/index.htm

Et on y insère la phrase "It's works"

On enregistre et on quitte

Et enfin, on crée notre virtualhost :
# nano /etc/apache2/sites-available/sitessl.com 

Et on y ajoute la structure suivante :

<VirtualHost *:80>
 ServerAdmin postmaster@sitessl.com
 ServerName sitessl.com
 ServerAlias www.sitessl.com
 DocumentRoot /www/htdocs/sitessl/html/
 <Directory /www/htdocs/sitessl/html/>
  Options -Indexes FollowSymLinks MultiViews
  AllowOverride All
 </Directory>
 ErrorLog /www/htdocs/logs/sitessl_error.log
 LogLevel warn
 CustomLog /www/htdocs/logs/sitessl_access.log combined
 ServerSignature Off
</VirtualHost>

On enregistre et on quitte

On rend le domaine créé disponible :

# ln -s /etc/apache2/sites-available/sitessl.com /etc/apache2/sites-enabled/sitessl.com

On relance apache pour prendre en compte les modifications :

# /etc/init.d/apache2 restart

On vérifie que tout s'est déroulé normalement en appelant http://sitessl.com via notre navigateur :


Correction de l'exercice 3

Comme d'habitude, on utilise apt-get pour installer ce paquet :

# apt-get install openssl

Pour générer un nouveau certificat, on utilise openssl via la commande suivante :

# openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/server.crt -keyout /etc/apache2/server.key

Plus d'infos concernant cette commande :

-x509 -nodes donne le type de certificat voulu
-days 365 indique la durée de validité (en jours) de votre certificat
-newkey rsa:1024 demande une clé RSA de 1024 bits - d'après la doc apache, il est déconseillé de créer une clé plus grosse pour des histoires de compatibilité
-out /etc/apache2/server.crt est le chemin de votre certificat à générer
-keyout /etc/apache2/server.key est le chemin de la clé privée à générer

OpenSSL va alors nous poser les questions suivantes :

Country Name (2 letter code) [AU]

Entrez FR si vous êtes situé en France et validez par la touche "Entrée"

State or Province Name (full name) [Some-State]

Entrez FRANCE et validez par la touche "Entrée"

Locality Name (eg, city) []

Indiquez ici le nom de votre ville. (exemple : ROUEN) et validez par la touche "Entrée"

Organization Name (eg, company) [Internet Widgits Pty Ltd]

Indiquez le nom de votre organisation, de votre société. (exemple : france-ssl) et validez par la touche "Entrée". Si vous n'avez pas de société, vous pouvez mettre un nom fictif, le nom de notre site Web par exemple.

Organizational Unit Name (eg, section) []

Indiquez ici le nom de la section de votre organisation, de votre société. Si vous n'en avez pas, mettez la même chose que pour la question précédente.

Common Name (eg, YOUR name) []

Ici, il convient de faire particulièrement attention à ce que vous allez entrer. Vous devez indiquer le nom de domaine que vous désirez sécuriser. En ce qui nous concerne, il s'agit du domaine : sitessl.com. Nous indiquons donc sitessl.com et nous validons par la touche "Entrée".

Email Address []

Ici, il s'agit d'indiquer l'adresse E-mail de l'administrateur. En ce qui nous concerne, il s'agit de : contact@sitessl.com. Nous terminons bien entendu en validant par la touche "Entrée".

Et enfin, on empêche les curieux de lire notre clé privée :

# chmod o-rw /etc/apache2/server.key

Correction de l'exercice 4

Par défaut, Apache2 est configuré pour écouter sur le port 80. Il s'agit là de la configuration usuelle d'un Serveur Web. Cependant, le protocole SSL a besoin d'un port spécifique pour pouvoir fonctionner. Il s'agit du port 443.

Nous allons commencer par vérifier que le fichier de configuration /etc/apache2/ports.conf est actuellement correctement configuré afin qu'Apache2 écoute le port 443.

# nano /etc/apache2/ports.conf

Et on vérifie la présence des lignes

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to 
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>

Si ce n'est pas le cas, ajoutez simplement la ligne Listen 443 juste après Listen 80

Retournons dans notre virtualhost sitessl.com

# nano /etc/apache2/ports.conf

Retournons dans le virtualhost de sitessl.com pour modifier quelques directives :

# nano /etc/apache2/sites-available/sitessl.com

Pour sécuriser cet Hôte Virtuel, nous allons donc devoir modifier ce fichier en y ajoutant un hôte virtuel accessible sur le port 443, ce dernier contenant des directives particulières qui sont les suivantes :

  1. Directive SSLEngine :
    Cette directive permet d'activer le moteur SSL au sein d'un hôte virtuel, Elle peut prendre deux arguments –> on/off
  2. Directive SSLCertificateFile :
    Cette directive définit le certificat authentifiant le Serveur auprès des clients. L'argument est le chemin d'accès au certificat. En ce qui nous concerne, le certificat se trouve dans /etc/apache2/server.crt (voir exercice 3)
  3. Directive SSLCertificateKeyFile :
    Cette directive définit la clé privée du Serveur utilisée pour signer l'échange de clé entre le client et le serveur. Elle prend en argument le chemin d'accès à la clé (fichier). Dans notre cas, la clé se trouve dans /etc/apache2/server.key (voir exercice 3).

Par ailleurs, comme nous l'avons déjà fait pour notre hôte virtuel accessible sur le port 80, nous allons devoir rajouter une directive NameVirtualHost qui permettra que l'adresse nommée par le nom de notre hôte virtuel accessible sur le port 443 soit résolue correctement. Nous rajouterons donc cette directive (NameVirtualHost *:443) au début de notre fichier de configuration.

Enfin, afin que les clients puissent continuer d'accéder au site Web en tapant une url de type http et non https, nous allons modifier l'hôte virtuel accessible sur le port 80 en remplaçant la directive DocumentRoot par une directive de redirection.

Voici donc le contenu de notre fichier une fois modifié :

NameVirtualHost  *:443

<VirtualHost *:80>
    ServerName sitessl.com
    ServerAlias www.sitessl.com
    Redirect / https://sitessl.com
</VirtualHost>

<VirtualHost *:443>
 ServerAdmin postmaster@sitessl.com
 ServerName sitessl.com
 ServerAlias www.sitessl.com
 DocumentRoot /www/htdocs/sitessl/html/

 SSLEngine on
 SSLCertificateFile /etc/apache2/server.crt
 SSLCertificateKeyFile /etc/apache2/server.key

 <Directory /www/htdocs/sitessl/html/>
  Options -Indexes FollowSymLinks MultiViews
  AllowOverride All
 </Directory>
 ErrorLog /www/htdocs/logs/sitessl_error.log
 LogLevel warn
 CustomLog /www/htdocs/logs/sitessl_access.log combined
 ServerSignature Off
</VirtualHost>

et on n'oublie pas de redemarrer apache2 pour prendre en compte les changements :

# /etc/init.d/apache2 restart

Si vous affichez votre site sitessl.com via votre navigateur favoris, il se peut que vous ayez le message suivant (ou équivalent) :

Pourquoi ?

Les certificats SSL fonctionnent sur le principe d'une chaîne de confiance : quelqu'un en qui j'ai confiance me dit de faire confiance à quelqu'un d'autre, alors je fais confiance à ce quelqu'un d'autre. Evidemment, selon ce principe, il faut connaître des personnes de confiance. Dans le monde du SSL, c'est ce qu'on appelle les autorités de certification (CA selon l'acronyme anglais). Tous les navigateurs du monde entier connaissent un certain nombre de CA. Il faut aller fouiller dans les options du navigateur pour trouver ces certificats. Et lorsque quelqu'un se présente, on sait qu'on peut lui faire confiance parce que son certificat a été émis par une autorité de certification, donc une autorité à qui on fait confiance.

Dans notre cas, nous avons généré un certificat auto-signé : aucune CA reconnue n'a émis ce certificat. Et donc, lorsqu'un navigateur arrive sur notre site, il ne peut pas approuver le certificat que le serveur lui présente : fais-moi confiance parce que je me connais ! C'est un peu léger pour de la sécurité alors notre navigateur se plaint.

Donc 3 solutions possibles :

  1. On ne fait rien vu que c'est juste un test et qu'on est sur un serveur de développement.
  2. On achète un certificat auprès d'une autorité de certification reconnue. Pour info, certaines sont open source, donc procurent des certificats gratuits, mais tous les navigateurs ne les reconnaissent pas forcement.
  3. On installe notre propre certificat auto-signé dans notre navigateur comme si c'était un certificat de CA. On aura alors plus de message d'avertissement mais cela ne fonctionnera que pour notre navigateur.

A titre d'exemple, Facebook a obtenu son certificat auprès de VeriSign Trust Network

Aucun commentaire:

Enregistrer un commentaire