Installer et configurer le serveur web Apache2 sur Debian 13, comprendre sa structure, ses commandes essentielles et les bonnes pratiques de sécurisation.
Un serveur Debian 13 avec accès root ou sudo. Connexion réseau fonctionnelle. Connaître les commandes de base Linux (nano, systemctl, apt).
sudo apt update && sudo apt install apache2 -y sudo systemctl enable --now apache2 sudo systemctl status apache2
# Tester localement depuis le serveur curl -I http://localhost # Vérifier le port d'écoute ss -tlnp | grep apache2
Toute la configuration d'Apache2 se trouve dans /etc/apache2. Voici l'organisation des dossiers :
| Chemin | Contenu | Rôle |
|---|---|---|
| /etc/apache2/apache2.conf | Fichier de configuration principal | Paramètres globaux du serveur |
| /etc/apache2/ports.conf | Ports d'écoute | Définit sur quels ports Apache écoute (80, 443) |
| /etc/apache2/sites-available/ | Fichiers de VirtualHost disponibles | Un fichier .conf par site |
| /etc/apache2/sites-enabled/ | Liens symboliques vers les sites actifs | Ce qui est réellement chargé par Apache |
| /etc/apache2/mods-available/ | Modules disponibles | Modules installés mais pas forcément actifs |
| /etc/apache2/mods-enabled/ | Liens symboliques vers les modules actifs | Modules chargés au démarrage |
| /etc/apache2/conf-available/ | Configurations supplémentaires disponibles | Ex: charset, security, localized-error-pages |
| /etc/apache2/conf-enabled/ | Configurations supplémentaires actives | Liens symboliques actifs |
| /var/www/html/ | Répertoire web par défaut | Racine du site web par défaut |
| /var/log/apache2/ | Journaux Apache | access.log et error.log |
| Commande | Rôle | Exemple |
|---|---|---|
| a2ensite | Active un VirtualHost (crée un lien symbolique) | sudo a2ensite monsite.conf |
| a2dissite | Désactive un VirtualHost | sudo a2dissite monsite.conf |
| a2enmod | Active un module Apache | sudo a2enmod rewrite |
| a2dismod | Désactive un module Apache | sudo a2dismod status |
| a2enconf | Active un fichier de configuration supplémentaire | sudo a2enconf security |
| a2disconf | Désactive un fichier de configuration supplémentaire | sudo a2disconf serve-cgi-bin |
| apachectl configtest | Vérifie la syntaxe de la configuration | sudo apachectl configtest |
| apachectl -t | Alias de configtest | sudo apachectl -t |
# Après tout changement de configuration, tester puis recharger sudo apachectl configtest # doit afficher "Syntax OK" sudo systemctl reload apache2 # Redémarrer complètement (si un module a été ajouté) sudo systemctl restart apache2
| Module | Commande d'activation | Utilité |
|---|---|---|
| rewrite | sudo a2enmod rewrite | Réécriture d'URL (nécessaire pour WordPress, Laravel, etc.) |
| ssl | sudo a2enmod ssl | Support HTTPS/TLS |
| headers | sudo a2enmod headers | Manipulation des en-têtes HTTP (sécurité) |
| deflate | sudo a2enmod deflate | Compression gzip des réponses (performances) |
| proxy | sudo a2enmod proxy | Reverse proxy (rediriger vers un autre serveur) |
| proxy_http | sudo a2enmod proxy_http | Proxy HTTP (souvent utilisé avec proxy) |
| status | sudo a2enmod status | Page de statut Apache (à désactiver en production) |
# Suivre les accès en temps réel sudo tail -f /var/log/apache2/access.log # Suivre les erreurs en temps réel sudo tail -f /var/log/apache2/error.log # Filtrer les erreurs 404 sudo grep "404" /var/log/apache2/access.log # Filtrer les erreurs 500 sudo grep " 500 " /var/log/apache2/access.log
Par défaut, Apache affiche sa version et l'OS dans les en-têtes HTTP et les pages d'erreur. Il faut masquer ces informations.
sudo nano /etc/apache2/conf-available/security.conf
Vérifier ou modifier ces directives :
ServerTokens Prod # N'affiche que "Apache" sans version ni OS ServerSignature Off # Supprime la signature des pages d'erreur TraceEnable Off # Désactive la méthode HTTP TRACE (faille XST)
sudo a2enconf security
sudo systemctl reload apache2
# Vérifier que la version est masquée
curl -I http://localhost | grep Server
Par défaut, si un répertoire ne contient pas de fichier index.html, Apache liste son contenu. C'est une faille de sécurité à désactiver.
# Dans le VirtualHost ou apache2.conf
<Directory /var/www/html>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
sudo a2enmod headers sudo systemctl reload apache2
# À ajouter dans le VirtualHost ou dans security.conf
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-XSS-Protection "1; mode=block"
Header always set Referrer-Policy "no-referrer-when-downgrade"
# Créer le fichier de mots de passe sudo apt install apache2-utils -y sudo htpasswd -c /etc/apache2/.htpasswd admin # (entrer le mot de passe pour l'utilisateur admin) # Ajouter un autre utilisateur sudo htpasswd /etc/apache2/.htpasswd alice
# Dans le VirtualHost, pour protéger un répertoire
<Directory /var/www/html/admin>
AuthType Basic
AuthName "Zone restreinte"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
✅ Réponse : a2ensite
✅ Réponse : /etc/apache2/sites-available/
✅ Réponse : apachectl configtest
✅ Réponse : ServerTokens Prod
✅ Réponse : Options -Indexes
✅ Réponse : a2enmod headers