Apache : sécurité
Des réglages simples réduisent fortement la surface d’attaque d’un serveur Apache. Les exemples utilisent des noms génériques.
Masquer la version
Section intitulée « Masquer la version »Ubuntu active ServerTokens OS et ServerSignature On, qui exposent la version d’Apache et du système. Dans /etc/apache2/conf-available/security.conf (activé par défaut) :
ServerTokens ProdServerSignature OffTraceEnable Offsudo apache2ctl configtest && sudo systemctl reload apache2curl -sI http://localhost | grep -i server # Server: Apache| Directive | Effet |
|---|---|
ServerTokens Prod |
L’en-tête Server n’indique plus que Apache |
ServerSignature Off |
Pas de signature (version) en bas des pages d’erreur |
TraceEnable Off |
Désactive la méthode HTTP TRACE (déjà défini par Ubuntu) |
En-têtes de sécurité
Section intitulée « En-têtes de sécurité »sudo a2enmod headersHeader always set X-Content-Type-Options "nosniff"Header always set X-Frame-Options "SAMEORIGIN"Header always set Referrer-Policy "strict-origin-when-cross-origin"Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"Header always set Strict-Transport-Security "max-age=31536000"À placer dans un fichier réutilisable pour tous les sites :
sudo tee /etc/apache2/conf-available/securite-entetes.conf <<'CONF'<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set X-Frame-Options "SAMEORIGIN" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"</IfModule>CONFsudo a2enconf securite-entetes| En-tête | Rôle |
|---|---|
X-Content-Type-Options: nosniff |
Empêche le navigateur de deviner le type des fichiers |
X-Frame-Options: SAMEORIGIN |
Interdit l’affichage du site dans une iframe d’un autre site |
Referrer-Policy |
Limite les informations transmises dans l’en-tête Referer |
Permissions-Policy |
Désactive des fonctions du navigateur inutiles |
Strict-Transport-Security |
Impose HTTPS (voir HTTPS et certificats) |
Content-Security-Policy |
Liste les origines autorisées pour scripts, styles, images (à tester soigneusement) |
always fait accompagner l’en-tête aussi les réponses d’erreur (404, 500…).
Authentification basique
Section intitulée « Authentification basique »sudo htpasswd -c /etc/apache2/.htpasswd alice # crée le fichier avec un premier utilisateursudo htpasswd /etc/apache2/.htpasswd bob # ajoute un utilisateursudo chown root:www-data /etc/apache2/.htpasswdsudo chmod 640 /etc/apache2/.htpasswd<Directory /var/www/exemple.com/prive> AuthType Basic AuthName "Zone privée" AuthUserFile /etc/apache2/.htpasswd Require valid-user</Directory>Pour protéger une URL plutôt qu’un dossier : <Location /admin> avec les mêmes directives.
Restreindre par adresse IP
Section intitulée « Restreindre par adresse IP »<Location /admin> Require ip 192.168.1.0/24 203.0.113.10</Location>Combiner adresse et mot de passe :
<Location /admin> <RequireAll> Require ip 192.168.1.0/24 Require valid-user </RequireAll> AuthType Basic AuthName "Administration" AuthUserFile /etc/apache2/.htpasswd</Location>Bloquer les fichiers cachés et sensibles
Section intitulée « Bloquer les fichiers cachés et sensibles »# Fichiers cachés (.git, .env…) sauf .well-known (certificats)<DirectoryMatch "/\.(?!well-known)"> Require all denied</DirectoryMatch><FilesMatch "^\.(?!well-known)"> Require all denied</FilesMatch>
# Sauvegardes et fichiers de configuration<FilesMatch "\.(bak|sql|log|conf|ini|swp)$"> Require all denied</FilesMatch>Ne jamais déployer .git ni .env dans le dossier servi, même avec ces règles.
Désactiver le listing et .htaccess
Section intitulée « Désactiver le listing et .htaccess »<Directory /var/www/exemple.com> Options -Indexes -Includes -ExecCGI AllowOverride None Require all granted</Directory>Voir Structure de la configuration pour les risques de AllowOverride All.
Limiter les tailles et les délais
Section intitulée « Limiter les tailles et les délais »LimitRequestBody 10485760 # corps de requête : 10 MoLimitRequestFields 50 # nombre d'en-têtesLimitRequestFieldSize 8190Timeout 60 # délai global (secondes)KeepAliveTimeout 5Le module reqtimeout, actif par défaut sur Ubuntu, limite le temps de réception des en-têtes et du corps (protection contre les connexions lentes de type « Slowloris »).
Désactiver les modules inutiles
Section intitulée « Désactiver les modules inutiles »apache2ctl -M | sort # modules chargéssudo a2dismod -f status autoindex negotiation cgi # exemples : ceux dont le site n'a pas besoinsudo apache2ctl configtest && sudo systemctl restart apache2Moins de modules, c’est moins de fonctions exposées. Vérifier qu’aucune application n’en dépend avant de désactiver.
Limiter le débit et les attaques par force brute
Section intitulée « Limiter le débit et les attaques par force brute »Apache n’a pas de limitation de requêtes par adresse intégrée. Options :
| Outil | Rôle |
|---|---|
| Fail2ban | Bloque les adresses qui échouent ou abusent, d’après les journaux |
libapache2-mod-evasive |
Limite les requêtes répétées par adresse |
libapache2-mod-security2 |
Pare-feu applicatif (WAF) avec règles OWASP |
mod_ratelimit |
Limite la bande passante d’une réponse (pas le nombre de requêtes) |
Fail2ban
Section intitulée « Fail2ban »sudo apt install fail2bansudo tee /etc/fail2ban/jail.d/apache.local <<'CONF'[apache-auth]enabled = true
[apache-badbots]enabled = true
[apache-noscript]enabled = true
[apache-overflows]enabled = trueCONFsudo systemctl restart fail2bansudo fail2ban-client status apache-auth| Jail | Détecte |
|---|---|
apache-auth |
Échecs d’authentification basique |
apache-badbots |
Robots malveillants connus |
apache-noscript |
Recherche de scripts inexistants |
apache-overflows |
Tentatives de débordement de requête |
Limiter les protocoles à TLSv1.2 et TLSv1.3 (valeur par défaut d’Ubuntu 26.04) : voir HTTPS et certificats.
Privilèges et système
Section intitulée « Privilèges et système »- Apache tourne sous
www-data: ne pas donner à cet utilisateur de droit d’écriture sur le code du site. - Pare-feu UFW actif (voir Ubuntu Server : actions après l’installation).
- Mises à jour automatiques de sécurité (
unattended-upgrades). - Surveiller
error.logetaccess.log(voir Performances et journaux).
Vérifier
Section intitulée « Vérifier »sudo apache2ctl configtest && sudo systemctl reload apache2curl -sI https://exemple.com | grep -iE "server|strict|x-content|x-frame|referrer"curl -I https://exemple.com/.git/config # doit répondre 403 ou 404curl -u alice:mauvais https://exemple.com/prive/ # 401curl -X TRACE https://exemple.com/ # 405Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
Invalid command 'Header' |
sudo a2enmod headers |
401 en boucle |
Mot de passe incorrect, ou .htpasswd illisible pour www-data |
AH01618: user alice not found |
Utilisateur absent du fichier .htpasswd |
403 malgré un bon mot de passe |
Le fichier .htpasswd n’est pas lisible par www-data (chown root:www-data, chmod 640), ou une autre directive Require refuse l’accès |
Le fichier .well-known est bloqué (certificats) |
Garder l’exception (?!well-known) dans les règles de fichiers cachés |
Invalid command 'AuthType' |
Modules auth_basic et authn_file : sudo a2enmod auth_basic authn_file (actifs par défaut sur Ubuntu) |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Pour aller plus loin
Section intitulée « Pour aller plus loin »- Documentation : Security Tips
- Suite : Performances et journaux