HTTPS, la chose à ne pas négliger
Chez les bidouilleurs de l'auto-hébergement, il y a des choses qu'on apprend à faire sur le tas : monter un serveur Apache, une base de données, des VirtualHosts et lier des applications à tout ceci, et des choses qu'on apprend sur le tard.
Sur mon installation actuelle, dont je suis assez fier puisque montée en presque autodidacte, je ne me suis pas tout de suite penché sur la sécurité des données qui transitées sur le réseau depuis mon serveur principal.
C'est maintenant chose faite : une partie de mon installation est désormais chiffrée part OpenSSL.
Mon instance ownCloud et la partie administration de ce blog propulsé sous Dotclear sont maintenant systématiquement redirigés vers leurs version HTTPS et non plus HTTP. En fait, à chaque fois qu'un mot de passe est demandé, je veux que ce soit fait de façon sure, en sécurisant le transite des données entre le navigateur et le serveur.
Je vous propose donc de partager ici les manipulations à faire pour un serveur sous Debian (encore Squeeze) et Apache2.
Remarque : La configuration que je vous propose se base sur des certificats auto-signés. Le principe des certificats repose sur une notion de confiance : le certificat est délivré par une entité jugée sure et reconnue qui prouve/atteste que vous arrivez dans une zone faisant transiter des données critiques de façon protégée. Avoir un certificat "officiel" coûtant environ un bras et deux jambes, ce que je vais expliquer ci-dessous s'appuie sur un certificat généré par vos soins, non officiel donc. Cela ne change rien quant au gain de sécurité. Le navigateur soupirera parce le certificat qu'il accepte n'émane pas d'une entité officielle, mais c'est tout.
Installer et activer OpenSSL
Pour installer, c'est simple :
aptitude install openssl
Pour activer OpenSSL dans apache :
a2enmod ssl
S'occuper des certifications
On commence part créer le répertoire qui contiendra les fichiers de certification :
mkdir -p /etc/ssl/localcerts
On génère ensuite les certifications :
openssl req -new -x509 -days 365 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key
Et on termine par la mise en place des bons droits :
chmod 600 /etc/ssl/localcerts/apache*
On se retrouve maintenant avec la gestion de la certification qui va bien et avec Apache prêt à s'en servir.
Configuration d'Apache
Dans un souci de simplicité, je vais vous montrer comment reprendre le fichier d'exemple de configuration présent dans /etc/apache2/sites-available/ : default-ssl.
Vous n'aurez pas grand chose à modifier.
Déclarer le nom et le port du VirtualHost
Ajoutez NameVirtualHost *:443 et modifiez la balise ouvrante de déclaration du VirtualHost <VirtualHost *:443>.
Vous devriez donc passer d'un fichier de base :
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
[...]
</VirtualHost>
</IfModule>
À quelque chose comme ça :
<IfModule mod_ssl.c>
NameVirtualHost *:443
<VirtualHost *:443>
[...]
</VirtualHost>
</IfModule>
Activez SSLEngine
La ligne suivante est parfois commentée. Faîtes sauter le # qui traîne devant.
SSLEngine On
Renseignez correctement les chemins vers le certificat et la clé
Ces deux lignes suivantes sont déjà présentes mais ne pointent pas vers ce que nous avons généré un peu plus haut dans le répertoire /etc/ssl/localcerts/, modifiez-les comme ceci :
SSLCertificateFile /etc/ssl/localcerts/apache.pem SSLCertificateKeyFile /etc/ssl/localcerts/apache.key
Le fichier default-ssl est maintenant configuré. Passons aux dernières petites choses à faire.
Activer le VHost
Votre VHost est configuré par le fichier default-ssl. Activez-le donc :
a2ensite default-ssl
Vérifiez qu'Apache écoute bien le port 443
... dans son fichier de configuration /etc/apache2/ports.conf. A priori, il l'écoute de base.
Vous pouvez maintenant redémarrer le serveur Apache et profiter d'un accès en HTTPS !
/etc/init.d/apache2 restart
Utilisez la connexion en HTTPS automatiquement
C'est bien malin d'avoir mis en place le HTTPS mais il est encore plus malin de forcer son utilisation, histoire de ne pas s'être plongé dans des fichiers de configuration pour rien.
Pour obligatoirement utiliser une connexion sécurisée lorsque vous vous connectez à une partie de votre site, utilisez la redirection permanente vers l'accès en HTTPS.
On va prendre pour exemple l'accès à son instance ownCloud qui se ferait via : http://www.dadall.info/owncloud
Dans /etc/apache2/sites-available/default, on va ajouter une ligne pour s'occuper de sa redirection :
Redirect permanent /owncloud https://www.dadall.info/owncloud
Maintenant, quand vous vous connecterez sur www.dadall.info/owncloud, vous serez automatiquement redirigé vers du HTTPS.
Vous pouvez ajouter autant de redirections que vous voulez, faites-vous plaisir.
Comme je le dis toujours : chez moi ça marche. Mais bon, si ça ne marche pas chez vous, utilisez les commentaires et je ferais ce que je peux.