HTTPSCet article décrit la mise en place d’un hébergement sécurisé sur un serveur Apache tournant sous CentOS 7. Le protocole HTTP (Hypertext Transfer Protocol) transmet les données entre le serveur et le navigateur « en clair ». Les données personnelles, mots de passe et autres numéros de Carte Bleue sont donc interceptables. Pour résoudre ce problème, on utilisera le protocole HTTPS, qui ajoute une couche de chiffrement SSL (Secure Sockets Layer) au protocole HTTP.

Le transfert chiffré des données ne constitue qu’un aspect dans l’établissement d’une connexion sécurisée. L’autre aspect tout aussi important, c’est que l’utilisateur doit être sûr de communiquer avec la bonne personne. Autrement dit, votre numéro de Carte Bleue a beau être transmis de façon sécurisée, encore faut-il que la plateforme de paiement ne soit pas située sur un serveur géré par la mafia albanaise.

Pour savoir si l’on a bien affaire au bon interlocuteur, on utilisera un certificat. Cette véritable carte d’identité électronique contient non seulement la clé publique du serveur pour chiffrer les transmissions, mais également des renseignements sur le site ainsi que la signature de l’autorité de certification.

La génération d’un certificat électronique est décrite en détail dans cet article. Pour nos essais, nous utiliserons un certificat SSL/TLS fourni par le client Certbot. Dans l’exemple ci-dessous, nous allons configurer un hébergement public https://www.slackbox.fr.

Prérequis

Le protocole HTTPS utilise le port 443. Il faut donc songer avant toute chose à ouvrir ce port dans le pare-feu.

$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dns http https ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Pour nos tests, nous allons partir d’une installation par défaut d’Apache avec un seul site statique rangé dans /var/www/html. Si l’on dispose déjà d’une installation d’Apache avec une série d’hôtes virtuels, voici ce qu’il faut faire pour remettre les compteurs à zéro.

$ sudo yum remove httpd
$ sudo rm -rf /var/www/*
$ sudo rm -rf /etc/httpd/
$ sudo yum install httpd
$ cd /etc/httpd/conf
$ sudo mv httpd.conf httpd.conf.orig
$ egrep -v '^#|^$|^    #|^      #' httpd.conf.orig | sudo tee httpd.conf.lite
$ sudo cp httpd.conf.lite httpd.conf
$ sudo cp -R /usr/share/httpd/noindex/* /var/www/html/

Renseigner quelques directives de base dans httpd.conf.

ServerAdmin info@microlinux.fr
...
  CustomLog "logs/access_log" common
...
AddDefaultCharset off

Installation

Le chiffrement SSL/TLS pour Apache est fourni par le paquet mod_ssl.

$ sudo yum install mod_ssl

On notera l’apparition d’un fichier de configuration ssl.conf dans /etc/httpd/conf.d.

Configurer Apache et SSL

Avant de continuer, effectuer une copie de sauvegarde du fichier de configuration par défaut.

$ cd /etc/httpd/conf.d
$ sudo cp ssl.conf ssl.conf.orig

Si l’on part d’un répertoire /var/www/html vide, on peut récupérer un peu de contenu statique pour avoir quelque chose à nous mettre sous la dent.

$ cd /var/www/html/
$ sudo cp -R /usr/share/httpd/noindex/* .

Régler les permissions de l’arborescence de fichiers téléchargés.

$ sudo chown -R microlinux:microlinux *

Éditer /var/www/html/index.html et remplacer le titre générique Testing 123... de la page par quelque chose de plus parlant, par exemple le domaine hébergé www.slackbox.fr.

Ensuite, éditer /etc/httpd/conf.d/ssl.conf en renseignant les directives DocumentRoot et ServerName ainsi que l’emplacement du certificat SSL et de la clé privée.

##
## SSL Virtual Host Context
##
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName www.slackbox.fr:443
...
SSLCertificateFile /etc/letsencrypt/live/slackbox.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/slackbox.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/slackbox.fr/fullchain.pem
...
</VirtualHost>

Redémarrer Apache.

$ sudo systemctl restart httpd

Ouvrir le site https://www.slackbox.fr avec Firefox. On notera la présence du petit cadenas vert en haut à gauche dans la barre d’adresses pour indiquer l’établissement d’une connexion sécurisée.

Apache SSL

Améliorer la sécurité de notre hébergement

Rendons-nous sur la page SSL Server Test du portail Qualys SSL Labs pour effectuer un audit de la sécurité de notre hébergement.

Apache SSL

Pour l’heure, le résultat n’est pas parfait et nous indique que nous pouvons faire mieux.

Dans un premier temps, je vais éditer /etc/httpd/conf.d/ssl.conf pour peaufiner les options globales.

# /etc/httpd/conf.d/ssl.conf
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
# Disable TLS 1.0 & TLS 1.1
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
# Cipher preferences 
SSLHonorCipherOrder on 
# HSTS 
Header always set Strict-Transport-Security \
  "max-age=63072000; includeSubDomains"
# Clickjacking
Header always set X-Frame-Options DENY
# MIME sniffing
Header always set X-Content-Type-Options nosniff

Ensuite, je vais créer un fichier 10-www.slackbox.fr-ssl.conf dans lequel je vais ranger la configuration de mon hôte virtuel. Notez la redirection du site non sécurisé vers le site sécurisé.

# /etc/httpd/conf.d/10-www.slackbox.fr-ssl.conf

# http://www.slackbox.fr -> https://www.slackbox.fr
<VirtualHost *:80>
  ServerName www.slackbox.fr
  ServerAlias slackbox.fr
  Redirect / https://www.slackbox.fr
</VirtualHost>

# https://www.slackbox.fr
<VirtualHost _default_:443>
  ServerAdmin info@microlinux.fr
  DocumentRoot "/var/www/html"
  ServerName www.slackbox.fr:443
  ServerAlias slackbox.fr
  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/slackbox.fr/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/slackbox.fr/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/slackbox.fr/fullchain.pem
  BrowserMatch "MSIE [2-5]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
  ErrorLog logs/www.slackbox.fr-error_log
  CustomLog logs/www.slackbox.fr-access_log common
</VirtualHost>

Je teste la configuration.

$ sudo apachectl configtest
Syntax OK

Une fois que tout est correct, je relance Apache.

$ sudo systemctl restart httpd

Je relance l’audit de sécurité sur le site de Qualys Labs en cliquant sur Clear Cache. Cette fois-ci, notre hébergement est proche de la perfection, et même un peu au-delà.

Apache SSL


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.