HTTPSCet article décrit la mise en place d’un hébergement sécurisé sur un serveur Apache tournant sous Rocky Linux 8. 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, je vais configurer un hébergement public https://sd-155842.dedibox.fr.

Prérequis

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

# firewall-cmd --permanent --add-service=https
success
# firewall-cmd --reload
success
# firewall-cmd --list-services
dns http https ssh

Pour mes tests, je vais partir d’une installation par défaut d’Apache avec un seul site statique rangé dans /var/www/html. Étant donné que je dispose déjà d’une installation d’Apache avec une série d’hôtes virtuels, voici ce que je fais pour remettre les compteurs à zéro :

# dnf remove -y httpd php-*
# rm -rf /var/www/*
# rm -rf /etc/httpd/
# dnf install -y httpd
# cd /etc/httpd/conf
# mv -v httpd.conf httpd.conf.orig
renamed 'httpd.conf' -> 'httpd.conf.orig'
# grep -Ev '^#|^$|^[ ]{4}#|^[ ]{6}#' httpd.conf.orig > httpd.conf
# cd /var/www/
# cp -v /usr/share/testpage/index.html html/
'/usr/share/testpage/index.html' -> 'html/index.html'
# chown -R microlinux:microlinux html/

Je renseigne 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.

# dnf install -y mod_ssl

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

Configurer Apache et SSL

Le fichier ssl.conf est amplement documenté. Dans un premier temps, je vais effectuer une copie de sauvegarde de ce fichier et confectionner une version simplifiée sans les commentaires :

# cd /etc/httpd/conf.d/
# mv -v ssl.conf ssl.conf.orig
renamed 'ssl.conf' -> 'ssl.conf.orig'
# grep -Ev '^#|^$' ssl.conf.orig > ssl.conf

J’édite /var/www/html/index.html et je remplace le titre générique Test Page (aux alentours de la ligne 226) par quelque chose de plus parlant comme le nom de la machine :

  </style>
  </head>
  <body>
    <h1>HTTP Server <strong>sd-155842.dedibox.fr</strong></h1>

    <div class='row'>
    ...

Ensuite, j’édite /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 :

# /etc/httpd/conf.d/ssl.conf
...
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName sd-155842.dedibox.fr:443
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
...
SSLCertificateFile /etc/letsencrypt/live/sd-155842.dedibox.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/sd-155842.dedibox.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/sd-155842.dedibox.fr/fullchain.pem
...
</VirtualHost>

Je redémarre Apache :

# systemctl restart httpd

J’ouvre la page https://sd-155842.dedibox.fr avec Firefox. Je note la présence d’un petit cadenas en haut à gauche de la barre d’adresses pour indiquer l’établissement d’une connexion sécurisée :

Apache HTTPS

Un premier audit de mon hébergement

Je me rends sur la page SSL Server Test du portail Qualys SSL Labs pour effectuer un premier audit de la sécurité de mon hébergement :

Qualys Labs SSL Test

C’est déjà pas mal, et on peut même faire mieux. Mais avant d’aller plus loin, je vais organiser ma configuration un peu différemment.

Les hôtes virtuels revisités

Pour l’instant, toute la configuration de mon hébergement sécurisé réside dans le fichier /etc/httpd/conf.d/ssl.conf. À terme, cette machine est censée héberger une série de sites sécurisés. Pour ce faire, je vais utiliser les hôtes virtuels d’Apache. Et pour commencer, je vais éditer /etc/httpd/conf/httpd.conf en supprimant toutes les références à l’ancien site par défaut :

DocumentRoot "/var/www/html"
...
<Directory "/var/www/html">
  Options Indexes FollowSymLinks
  AllowOverride None
  Require all granted
</Directory>

Ensuite je crée un fichier /etc/httpd/conf.d/00-sd-155842.dedibox.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/00-sd-155842.dedibox.fr-ssl.conf
#
# http://sd-155842.dedibox.fr -> https://sd-155842.dedibox.fr
<VirtualHost *:80>
  ServerName sd-155842.dedibox.fr
  Redirect / https://sd-155842.dedibox.fr
</VirtualHost>

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

Enfin, j’édite /etc/httpd/conf.d/ssl.conf pour ne garder que les options globales de mon hébergement sécurisé :

# /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
SSLCryptoDevice builtin
SSLHonorCipherOrder on
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM

Améliorer la sécurité de l’hébergement

À l’occasion de notre premier audit, je disais que l’on pouvait faire mieux. Le moment est donc venu d’ajouter quelques directives bien senties aux options globales de l’hébergement. Voici une configuration que j’utilise couramment :

# /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
SSLCryptoDevice builtin
# Cipher preferences
SSLHonorCipherOrder on
SSLCipherSuite PROFILE=SYSTEM
SSLProxyCipherSuite PROFILE=SYSTEM
# 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

Je teste ma configuration :

# apachectl configtest
Syntax OK

Je relance Apache :

# systemctl restart httpd

Je relance l’audit de sécurité sur le site de Qualys Labs en cliquant sur Clear Cache. Cette fois-ci, on s’approche un peu plus de la perfection :

Qualys Labs SSL Test


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.

 


0 commentaire

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *