Configuration d'Apache 2

Informations
- Auteur : Louis MEDO
- Date de création : 25/03/2026
Contexte
Déploiement et sécurisation d'un serveur web Apache2 sur Debian 12 pour héberger les portfolios étudiants. La configuration applique le principe du moindre privilège, isole chaque projet via des VirtualHosts dédiés, et renforce la surface d'attaque avec des en-têtes HTTP stricts, la dissimulation des signatures serveur et un chiffrement TLS automatisé.
Note : La procédure de deploiement d'un portfolio est consultable en annexe.
Sommaire
- Installation du serveur Web et des modules
- Configuration du moteur PHP-FPM
- Sécurité applicative et masquage de l'empreinte
- Chiffrement TLS (Let's Encrypt et API DNS)
- Configuration du routage par défaut (Catch-all)
- Personnalisation des pages d'erreur
1. Installation du serveur Web et des modules
-
Installation d'Apache2. Mise à jour des paquets et installation du service web principal.
apt update: Met à jour la liste des paquets disponibles.apt install: Installe le paquet spécifié.-y: Valide automatiquement les demandes de confirmation. -
Désactivation des sites par défaut. Suppression des pages d'accueil d'installation pour éviter d'exposer des informations sur le serveur.
a2dissite: Désactive un site en supprimant son lien symbolique de configuration.000-default.conf: Fichier de configuration du site HTTP par défaut.default-ssl.conf: Fichier de configuration du site sécurisé (HTTPS) par défaut. -
Activation des modules requis. Activation des fonctionnalités nécessaires au chiffrement, à la performance et à la réécriture d'URL.
a2enmod: Active un module Apache spécifique.ssl: Gère le protocole de chiffrement HTTPS.http2: Active le protocole HTTP/2 pour optimiser les performances de requêtage.headers: Permet la manipulation des en-têtes HTTP (nécessaire pour la sécurité).rewrite: Autorise la réécriture des URLs à la volée.
2. Configuration du moteur PHP-FPM
L'utilisation de PHP-FPM (FastCGI Process Manager) permet un traitement plus performant et isolé des scripts PHP par rapport au module Apache classique.
-
Installation et interconnexion avec Apache.
php8.4-fpm: Installe le service PHP 8.4 fonctionnant de manière autonome.proxy_fcgietsetenvif: Modules permettant de déléguer l'exécution du code PHP au service FPM.a2enconf: Active le fichier de configuration global liant Apache à PHP 8.4. -
Application des paramètres.
systemctl reload: Recharge la configuration d'Apache à chaud sans interrompre le service.
3. Sécurité applicative et masquage de l'empreinte
-
Masquage de la version d'Apache. Modification des directives par défaut pour ne plus afficher la version du serveur web ni le système d'exploitation dans les requêtes et les pages d'erreur générées.
sudo sed -i 's/^ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf sudo sed -i 's/^ServerSignature On/ServerSignature Off/' /etc/apache2/conf-available/security.confsed -i: Édite le fichier directement en ligne de commande de manière silencieuse.ServerTokens Prod: Restreint l'en-tête HTTPServerà la seule mention "Apache", sans numéro de version.ServerSignature Off: Supprime la ligne de signature du serveur en bas des documents d'erreur générés par Apache. -
Configuration des en-têtes de sécurité. Édition du fichier de configuration global.
Ajouter à la fin du fichier :
# Force le navigateur à utiliser HTTPS Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains" # Empêche le navigateur de deviner le type MIME (protection contre le sniffing) Header always set X-Content-Type-Options "nosniff" # Restreint les sources autorisées à charger des ressources Header always set Content-Security-Policy "default-src 'self';"Header always set: Ajoute l'en-tête de sécurité spécifié à chaque réponse HTTP. -
Vérification de la syntaxe et redémarrage. S'assurer de la validité du code avant sa mise en production.
apachectl configtest: Analyse la syntaxe des fichiers Apache (doit impérativement répondreSyntax OK).systemctl restart: Redémarre complètement le service pour appliquer la configuration de sécurité globale.
4. Chiffrement TLS (Let's Encrypt et API DNS)
L'infrastructure requiert des certificats Wildcard (*.bts-sio.eu). La validation s'effectue par un challenge DNS automatisé via l'API de l'hébergeur (Infomaniak).
-
Installation du client ACME et de l'API.
sudo apt install -y certbot python3-pip sudo pip3 install certbot-dns-infomaniak --break-system-packagescertbot: Client officiel pour l'obtention automatisée de certificats.pip3 install: Télécharge le module d'intégration DNS spécifique à Infomaniak.--break-system-packages: Force l'installation globale du paquet Python sur l'environnement système. -
Sécurisation des identifiants API.
sudo mkdir -p /etc/letsencrypt echo "dns_infomaniak_token = TOKEN_API" | sudo tee /etc/letsencrypt/infomaniak.ini sudo chmod 600 /etc/letsencrypt/infomaniak.initee: Écrit le jeton d'authentification dans le fichier cible avec les privilèges élevés.chmod 600: Restreint les droits de lecture et d'écriture au seul utilisateur administrateur (root). -
Provisionnement automatisé du certificat.
sudo certbot certonly --authenticator dns-infomaniak --dns-infomaniak-credentials /etc/letsencrypt/infomaniak.ini -d "*.bts-sio.eu" -d "bts-sio.eu" --non-interactive --agree-tos -m contact@bts-sio.eucertonly: Génère le certificat sans altérer la configuration d'Apache.--authenticator dns-infomaniak: Délègue la preuve de possession du domaine à l'API Infomaniak.--non-interactive: Exécute la commande de façon silencieuse sans invite utilisateur.--agree-tos -m: Valide les conditions d'utilisation et spécifie l'email de contact. -
Restriction d'accès aux clés cryptographiques.
sudo chmod 600 /etc/letsencrypt/live/bts-sio.eu/privkey.pem sudo chmod 644 /etc/letsencrypt/live/bts-sio.eu/fullchain.pemprivkey.pem: Clé privée du certificat (droits600requis pour éviter toute compromission).fullchain.pem: Certificat public (droits644permettant la lecture par le service web). -
Automatisation du renouvellement.
Ajouter la directive suivante :
crontab -e: Édite la table de planification des tâches.certbot renew: Interroge l'autorité pour renouveler les certificats approchant de leur date d'expiration.--quiet: Masque les sorties standards dans les journaux.--post-hook: Action conditionnelle rechargeant Apache uniquement en cas de renouvellement effectif.
5. Configuration du routage par défaut (Catch-all)
Pour éviter qu'une requête pointant vers un sous-domaine inexistant n'affiche le contenu d'un autre étudiant, nous configurons un VirtualHost prioritaire servant une page d'information statique.
-
Création du répertoire et de la page par défaut.
sudo mkdir -p /var/www/default # Coller le contenue de la page d'informations sudoedit /var/www/default/index.html👉 Code source de la page d'informations
mkdir -p: Crée le répertoire parent manquant si nécessaire. -
Création du VirtualHost de secours. Ce fichier doit être chargé en premier par Apache, d'où le préfixe
000.Insérer la configuration suivante :
<VirtualHost *:80> ServerName default DocumentRoot /var/www/default Redirect permanent / https://default/ </VirtualHost> <VirtualHost *:443> ServerName default DocumentRoot /var/www/default SSLEngine on SSLCertificateFile /etc/letsencrypt/live/bts-sio.eu/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/bts-sio.eu/privkey.pem </VirtualHost>VirtualHost *:80et*:443: Écoute les requêtes HTTP et HTTPS entrantes.ServerName default: Nom d'hôte générique permettant de capturer les requêtes non assignées.DocumentRoot: Définit le chemin du dossier racine contenant la page statique.SSLEngine on: Active la gestion du chiffrement pour ce bloc. -
Activation du site.
a2ensite: Active le VirtualHost en créant un lien symbolique verssites-enabled.
6. Personnalisation des pages d'erreur
Afin de maintenir une présentation professionnelle et de ne pas exposer l'architecture interne lors d'un comportement inattendu, les pages d'erreur natives d'Apache sont substituées par des documents HTML personnalisés.
-
Création de l'arborescence des erreurs. Mise en place d'un dossier centralisé contenant les pages d'erreur courantes.
-
Définition des alias et des documents d'erreur. Configuration d'un bloc global pour que l'ensemble des VirtualHosts utilise ces nouvelles pages.
Insérer la configuration suivante :
Alias /erreurs /var/www/errors <Directory /var/www/errors> Require all granted </Directory> ErrorDocument 403 /erreurs/403.html ErrorDocument 404 /erreurs/404.html ErrorDocument 500 "Une erreur interne s'est produite."Alias: Mappe l'URL/erreursvers le répertoire physique système/var/www/errors.Require all granted: Autorise Apache à lire les fichiers contenus dans ce répertoire.ErrorDocument: Indique à Apache quel fichier ou message statique renvoyer lorsqu'un code HTTP spécifique est déclenché. -
Activation de la configuration globale.
a2enconf: Active la configuration partagée pour qu'elle s'applique à l'ensemble du serveur.