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.