Aller au contenu

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.

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 Prod
ServerSignature Off
TraceEnable Off
Fenêtre de terminal
sudo apache2ctl configtest && sudo systemctl reload apache2
curl -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)
Fenêtre de terminal
sudo a2enmod headers
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=()"
Header always set Strict-Transport-Security "max-age=31536000"

À placer dans un fichier réutilisable pour tous les sites :

Fenêtre de terminal
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>
CONF
sudo 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…).

Fenêtre de terminal
sudo htpasswd -c /etc/apache2/.htpasswd alice # crée le fichier avec un premier utilisateur
sudo htpasswd /etc/apache2/.htpasswd bob # ajoute un utilisateur
sudo chown root:www-data /etc/apache2/.htpasswd
sudo 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.

<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>
# 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.

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

LimitRequestBody 10485760 # corps de requête : 10 Mo
LimitRequestFields 50 # nombre d'en-têtes
LimitRequestFieldSize 8190
Timeout 60 # délai global (secondes)
KeepAliveTimeout 5

Le 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 »).

Fenêtre de terminal
apache2ctl -M | sort # modules chargés
sudo a2dismod -f status autoindex negotiation cgi # exemples : ceux dont le site n'a pas besoin
sudo apache2ctl configtest && sudo systemctl restart apache2

Moins de modules, c’est moins de fonctions exposées. Vérifier qu’aucune application n’en dépend avant de désactiver.

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)
Fenêtre de terminal
sudo apt install fail2ban
sudo tee /etc/fail2ban/jail.d/apache.local <<'CONF'
[apache-auth]
enabled = true
[apache-badbots]
enabled = true
[apache-noscript]
enabled = true
[apache-overflows]
enabled = true
CONF
sudo systemctl restart fail2ban
sudo 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.

Fenêtre de terminal
sudo apache2ctl configtest && sudo systemctl reload apache2
curl -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 404
curl -u alice:mauvais https://exemple.com/prive/ # 401
curl -X TRACE https://exemple.com/ # 405
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 »