Cet 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 :
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 :
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 :
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