Sécurisez vos VirtualHosts à l'aide de htaccess et SSL sous Apache 2

J'espère que les fêtes ne vous fatiguent pas trop ;-) N'abusez pas du bon chocolat !

Aujourd'hui, je vous propose un petit billet concernant la configuration et la mise en place d'élément de sécurité sur votre site préféré. Souvent on est amené à installer phpMyAdmin, Cacti ou d'autres outils de gestion pour notre serveur. Mais vous ne voulez pas que les méchants "pirates" fassent du brute force ou écoute votre réseau à la recherche d'informations croustillantes.

Vue d'ensemble du billet

Ce billet va donc traiter de la sécurité de vos outils de gestion. Dans un premier temps au niveau "accès" et dans un second temps au niveau "transmission" ou "média" ;-)

La méthode "htaccess" est une authentification par mot de passe lorsque l'on accède à une ressource. Elle permet ainsi d'éviter la récupération de la version de l'outil de gestion protégé et d'éviter au curieux de voir ce qu'il se cache derrière :D

La méthode "SSL", est tout simplement le cryptage des données point à point. Imaginez, vous accédez à une base de données via phpMyAdmin, mais, par le plus grand des hasards, un méchant loup écoute votre réseau. Quand vous effectuerez une requête du type "SELECT * FROM USERS" il récuperera tout simplement, tout ce que vous avez d'affiché sur votre écran. Embêtant non ?

Tout au long de ce billet, je vais vous expliquer comment créer votre fichier htaccess ainsi que la création d'un certificat SSL.

Petit Tip : Si comme moi, vous ne savez pas quel mot de passe prendre, il y a un site que j'utilise tout le temps (il y en a d'autres mais bon) c'est Password Generator. Il va vous permettre de générer un mot de passe avec plus ou moins de caractères incluant oui ou non les caractères spéciaux.

Sécurisation de notre VirtualHost via un .htaccess

Pour sécuriser notre VirtualHost, il nous faut le couple ".htaccess" et ".htpasswd"

  • htaccess a pour but de définir les règles d'accès sur le répertoire ou il est présent.
  • htpasswd (ou tout autre nom d'ailleurs) rassemble tous les identifiants et mots de passe.

Contexte d'application pour la sécurisation du VirtualHost

Imaginons, nous avons un super site à protéger par htaccess dans /var/www/masuperappli/ et nous voulons autoriser "bob" à se connecter avec son mot de passe "bob" (Super sécure hein ? vous ferez mieux je l'espère :D)

C'est parti pour la sécurisation !

.htaccess

Dans un premier temps, on va créer un fichier .htaccess à la racine de /var/www/masuperappli/

AuthType Basic
AuthName "Restricted Area"
AuthUserFile /un/endroit/sur/htpasswd
require valid-user

Explications des attributs de ce fichier

  • AuthType spécifie le type d'authentification
  • AuthName va afficher un message du "pourquoi du comment" que l'accès est restreint.
  • AuthUserFile correpond à l'emplacement de tous les identifiants et mot de passe (Nommé htpasswd mais peut s'appeler toto si vous le voulez)
  • require valid-user Pour accéder à la ressource, il faut obligatoirement être un utilisateur authentifié.
.htpasswd

Maintenant qu'on a le .htaccess est pleinement configuré, on va ajouter des utilisateurs dans notre .htpasswd

Pour se faire, rien de plus simple, il nous suffit d'utiliser la commande htpasswd.

htpasswd -c /un/endroit/sur/htpasswd bob

Cette commande va créer le fichier htpasswd (grâce à l'argument -c) et vous demander le mot de passe pour l'utilisateur bob (dans notre cas bob)

Si vous voulez rajouter un nouvel utilisateur n'incluez pas -c sinon, vous écraserez le fichier.

htpasswd /un/endroit/sur/htpasswd eponge

Via un cat sur le fichier, on peut remarquer que les mots de passe sont cryptés.

bob:9DUgoyTVyagEI
eponge:OHrK/md37DsVk
Configuration Apache 2

Tout va dépendre de votre environnement (VirtualHost ou pas), mais voici une configuration qui fonctionne.

# VirtualHost PHPMyAdmin
<VirtualHost *:80>
    ServerName mysql.monsuperdomaine.com
    DocumentRoot /usr/share/phpmyadmin/
    <Directory /usr/share/phpmyadmin/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Il se peut que vous ayez des problèmes concernant l'authentification, vous indiquant que tous les utilisateurs doivent avoir un group (je n'ai plus le message d'erreur dans la tête). Dans ce cas, il faut désactiver le module authz_groupfile en supprimant le lien symbolique dans /etc/apache2/mods-enabled/authz_groupfile.load

sudo rm /etc/apache2/mods-enabled/authz_groupfile.load

Sécurisons nos échanges grâce à SSL

SSL ou communément appelé Secure Socket Layer, permets l'échange de données sécurisé entre le client (navigateur web) et le site visé (serveur).

Pour tout ce qui est de l'historique, de l'explication "théorique" telle que les niveaux de cryptage, etc.. je vous invite à lire Wikipedia SSL à ce sujet.

Pour sécuriser notre site, 2 cas de figure s'offrent à nous.

  • Le certificat SSL approuvé par une haute autorité (payant). On peut le faire directement chez notre registrar Gandi ou OVH
  • Le certificat SSL crée par nous même, mais au contrario, il ne sera pas "certifié" par une haute autorité, et par conséquent, quand vous cliquerez sur une adresse de ce type, votre navigateur vous avertira par le biais d'une boite de dialogue "Êtes-vous sûr de vouloir visiter ce site même le certificat SSL n'est pas valide ?" Cependant, c'est la seule restriction, et il conviendra très bien aux petits portefeuilles ayant besoin d'un certificat SSL "juste" pour phpMyAdmin & cie.

On distingue 2 types de certificat SSL.

  • Certificat SSL certifiant une seule adresse. (Certificat SSL mysql.monsuperdomaine.com ne sera pas applicable sur toto.monsuperdomaine.com)
  • Certificat SSL certifiant tout un domaine. (Certificat SSL de type *.monsuperdomaine.com ou Wildcard) applicable sur tous les sous domaines de monsuperdomaine.com)

Chaque certificat SSL possède un niveau plus ou moins important de cryptage (1024 ou 2048 bits).

Le cas numéro 1 (Certificat SSL approuvé par une haute autorité) ne sera pas décrit ici, pour la simple et bonne raison que chaque registrar à ses propres offre. Si vous êtes dans ce cas, je vous invite à passer la partie "Génération d'un certificat SSL sous Debian 5" et de vous diriger directement sur la partie du billet traitant de la "Mise en place d'un certificat SSL sur un VirtualHost Apache 2"

Génération d'un certificat SSL sous Debian 5

Nous y voilà ! C'est l'heure de générer un certificat SSL pour notre sous-domaine mysql.monsuperdomaine.com

Pour se faire, on va installer openssl

sudo apt-get install openssl

Avec ce nouveau paquet, on va créer notre certificat SSL

sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out /etc/apache2/mysql.monsuperdomaine.com.crt -keyout /etc/apache2/mysql.monsuperdomaine.com.key

Explication des arguments

  • -days 365 : Validité du certificat pendant 365 jours
  • -newkey rsa:1024 : Création d'un certificat SSL avec un chiffrement de 1024 bits
  • -out /chemin/ : Spécifie le chemin du certificat SSL
  • -keyout /chemin/ : Spécifie le chemin de la clé privé

Après l'exécution de cette commande, plusieurs questions vont vous êtes posés.

Country Name (2 letter code) [GB]: FR
State or Province Name (full name) [Some-State]: FRANCE
Locality Name (eg, city) []: Nantes
Organization Name (eg, company; recommended) []: MaCompagnie
Organizational Unit Name (eg, section) []: I.T.
Common Name (eg, YOUR name) []: mysql.monsuperdomaine.com
Email Address []: admin@monsuperdomaine.com

La partie la plus importante concerne l'attribut "Common Name" qui doit être exactement le nom de domaine visé à sécurisé.

TIPS : Dans le cas d'un certificat de type "wildcard" il faudra y mettre *.monsuperdomaine.com

Mise en place d'un certificat SSL sur un VirtualHost Apache 2

Vous avez donc récupéré tous les fichiers nécessaires à savoir :

  • Votre certificat SSL en extension .crt
  • Votre Clef en extension .key

Vous pouvez dès à présent mettre en place votre VirtualHost sécurisé.

Pour se faire, on va d'abord activer l'SSL sur Apache 2

sudo a2enmod ssl

Maintenant, on va dire à Apache qu'il faut qu'il écoute également sur le port 443 (SSL) On édite le fichier /etc/apache2/ports.conf

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    # SSL name based virtual hosts are not yet supported, therefore no
    # NameVirtualHost statement here
    Listen 443
</IfModule>

La condition "IfModule" est active si le module SSL a été chargé.

Dirigeons-nous vers la configuration du VirtualHost. La petite spécificité est l'écoute du VirtualHost sur le port 443.

# VirtualHost PHPMyAdmin
<VirtualHost *:443>
    ServerName mysql.monsuperdomaine.com
    DocumentRoot /usr/share/phpmyadmin/

    SSLEngine On
    SSLCertificateFile /etc/apache2/ssl/ssl_pro/cert-kosmopolead.com.crt
    SSLCertificateKeyFile /etc/apache2/ssl/ssl_pro/wildcard_kosmopolead.key

    <Directory /usr/share/phpmyadmin/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Vous n'avez plus qu'a reload le processus Apache et vous voilà en présence d'un beau VirtualHost sécurisé !

sudo /etc/init.d/apache2 reload

Je vous invite à consulter mon billet (Rewrite URL et Rewrite Cond sur Apache 2 et NGINX) pour rediriger les actions de http://mysql.monsuperdomaine.com vers https://mysql.monsuperdomaine.com ;-)

Passez de bonnes fêtes !

Mickaël ALLAIN.

Vus : 1225
Publié par Mickaël : 9