Actualité

Pourquoi et comment mettre en place des headers de sécurité sur son serveur Apache ?

Juin 17, 2025 | Astuces WordPress

Serveur Apache sécurisé

La sécurité d’un site web est aujourd’hui une priorité absolue, que l’on soit blogueur, entrepreneur ou développeur. Les attaques informatiques sont de plus en plus fréquentes et sophistiquées, et il est essentiel de protéger ses utilisateurs et ses données. Parmi les mesures incontournables, la configuration des headers de sécurité sur votre serveur Apache fait partie des meilleures pratiques à adopter. Dans cet article, je vous explique pourquoi ces headers sont indispensables, comment les mettre en place, et comment vérifier leur efficacité.

Qu’est-ce qu’un header de sécurité HTTP ?

Un header HTTP (ou en-tête HTTP) est une information envoyée par le serveur au navigateur lors de chaque requête. Les headers de sécurité sont des directives qui indiquent au navigateur comment se comporter face à certaines situations potentiellement dangereuses : chargement de scripts, affichage en iframe, gestion du contenu mixte, etc. Bien configurés, ces headers protègent votre site contre de nombreuses failles courantes, comme le cross-site scripting (XSS), le clickjacking ou encore l’injection de contenu malveillant.

Les principaux headers de sécurité à connaître

Voici les headers de sécurité les plus importants à mettre en place sur un serveur Apache, avec leur explication et un exemple de configuration.

1. Strict-Transport-Security (HSTS)

Rôle : Oblige le navigateur à accéder à votre site uniquement via HTTPS, empêchant les attaques de type “man-in-the-middle”.

Exemple :

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

2. Content-Security-Policy (CSP)

Rôle : Contrôle les sources autorisées pour le chargement des scripts, images, styles, etc. Cela limite fortement les risques de XSS.

Exemple :

Header always set Content-Security-Policy "upgrade-insecure-requests"

Ici, la directive "upgrade-insecure-requests" force le chargement de toutes les ressources en HTTPS.

3. X-Frame-Options

Rôle : Empêche le chargement de votre site dans une iframe externe, protégeant ainsi contre le clickjacking.

Exemple :

Header always set X-Frame-Options "SAMEORIGIN"

4. X-Content-Type-Options

Rôle : Empêche le navigateur de deviner le type de contenu (MIME sniffing), ce qui réduit certains exploits.

Exemple :

Header always set X-Content-Type-Options "nosniff"

5. Referrer-Policy

Rôle : Contrôle quelles informations de provenance sont envoyées lors de la navigation, pour protéger la vie privée des utilisateurs.

Exemple :

Header always set Referrer-Policy "strict-origin-when-cross-origin"

6. Permissions-Policy

Rôle : Limite l’accès à certaines fonctionnalités du navigateur (caméra, micro, géolocalisation, etc.), réduisant la surface d’attaque.

Exemple :

Header always set Permissions-Policy "geolocation=(), midi=(), notifications=(), push=(), sync-xhr=(), accelerometer=(), gyroscope=(), magnetometer=(), payment=(), camera=(), microphone=(), usb=(), xr=(), speaker=(self), vibrate=(), fullscreen=(self)"

7. X-XSS-Protection

Rôle : Active le filtre anti-XSS du navigateur (utile sur les anciens navigateurs).

Exemple :

Header always set X-XSS-Protection "1; mode=block"

8. Suppression de l’ETag

Rôle : Supprime l’ETag pour éviter certains problèmes de cache et de fingerprinting.

Exemple :

Header unset ETag

Autres protections à mettre en place dans votre configuration Apache

En plus des headers de sécurité, il est recommandé de protéger certains fichiers sensibles et de limiter l’exécution de scripts dans les dossiers à risque.

  • Protection des fichiers sensibles :
<FilesMatch "^(wp-config\.php|xmlrpc\.php|\.htaccess|\.user\.ini|php\.ini|\.env|composer\.json|composer\.lock|readme\.html|license\.txt)$">
    Require all denied
</FilesMatch>
  • Protection des fichiers cachés (ex : .env, .git, etc.) :
<FilesMatch "^\.">
    Require all denied
</FilesMatch>
  • Désactivation de l’indexation des répertoires :
Options -Indexes +SymLinksIfOwnerMatch
ServerSignature Off
  • Blocage de l’énumération des utilisateurs WordPress :
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} author=\d
    RewriteRule ^ - [F,L]
</IfModule>
  • Interdiction d’exécution de PHP dans le dossier uploads :
<Directory "/wp-content/uploads/">
    <FilesMatch "\.php$">
        Require all denied
    </FilesMatch>
</Directory>

Où et comment ajouter ces headers de sécurité dans Apache ?

Pour que ces headers et règles de sécurité soient actifs sur votre site, il faut les ajouter dans la configuration de votre serveur Apache. Voici les deux méthodes les plus courantes :

1. Ajouter les headers dans le fichier .htaccess

Cette méthode est idéale si vous utilisez un hébergement mutualisé ou si vous ne voulez pas modifier la configuration globale d’Apache.

  • Ouvrez (ou créez) le fichier .htaccess à la racine de votre site (là où se trouve wp-config.php pour WordPress).
  • Ajoutez les lignes suivantes :
# --------- HEADERS DE SÉCURITÉ ---------
<IfModule mod_headers.c>
    Header unset ETag
    Header always set Content-Security-Policy "upgrade-insecure-requests"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "geolocation=(), midi=(), notifications=(), push=(), sync-xhr=(), accelerometer=(), gyroscope=(), magnetometer=(), payment=(), camera=(), microphone=(), usb=(), xr=(), speaker=(self), vibrate=(), fullscreen=(self)"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Cross-Origin-Embedder-Policy "unsafe-none"
    Header always set Cross-Origin-Resource-Policy "same-origin"
    Header always set Cross-Origin-Opener-Policy "same-origin"
</IfModule>

# --------- PROTECTION DE FICHIERS SENSIBLES ---------
<FilesMatch "^(wp-config\.php|xmlrpc\.php|\.htaccess|\.user\.ini|php\.ini|\.env|composer\.json|composer\.lock|readme\.html|license\.txt)$">
    Require all denied
</FilesMatch>

# --------- PROTECTION DES FICHIERS CACHÉS (ex : .env, .git, etc.) ---------
<FilesMatch "^\.">
    Require all denied
</FilesMatch>

# --------- CONFIGURATION DU SERVEUR ---------
Options -Indexes +SymLinksIfOwnerMatch
ServerSignature Off

# --------- BLOQUER L’ÉNUMÉRATION DES UTILISATEURS WORDPRESS ---------
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} author=\d
    RewriteRule ^ - [F,L]
</IfModule>

# --------- EMPÊCHER L’EXÉCUTION DE PHP DANS UPLOADS ---------
<Directory "/wp-content/uploads/">
    <FilesMatch "\.php$">
        Require all denied
    </FilesMatch>
</Directory>

Astuce : Toute modification du .htaccess prend effet immédiatement, sans redémarrage du serveur. Faites une sauvegarde de votre fichier .htaccess avant toute modification.

2. Ajouter les headers dans la configuration du VirtualHost Apache

Si vous avez accès à la configuration du serveur (VPS, dédié…), vous pouvez ajouter ces lignes dans le fichier de configuration du VirtualHost de votre site, généralement situé dans : /etc/apache2/sites-available/votre-site.conf ou /etc/httpd/conf.d/

  • Ouvrez le fichier de configuration de votre site.
  • Ajoutez les directives dans la section <VirtualHost *:80> ou <VirtualHost *:443>, par exemple :
<VirtualHost *:443>
    ServerName www.monsite.fr
    # ... autres directives ...

# --------- HEADERS DE SÉCURITÉ ---------
<IfModule mod_headers.c>
    Header unset ETag
    Header always set Content-Security-Policy "upgrade-insecure-requests"
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Referrer-Policy "strict-origin-when-cross-origin"
    Header always set Permissions-Policy "geolocation=(), midi=(), notifications=(), push=(), sync-xhr=(), accelerometer=(), gyroscope=(), magnetometer=(), payment=(), camera=(), microphone=(), usb=(), xr=(), speaker=(self), vibrate=(), fullscreen=(self)"
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Cross-Origin-Embedder-Policy "require-corp"
    Header always set Cross-Origin-Resource-Policy "same-origin"
    Header always set Cross-Origin-Opener-Policy "same-origin"
</IfModule>

# --------- PROTECTION DE FICHIERS SENSIBLES ---------
<FilesMatch "^(wp-config\.php|xmlrpc\.php|\.htaccess|\.user\.ini|php\.ini|\.env|composer\.json|composer\.lock|readme\.html|license\.txt)$">
    Require all denied
</FilesMatch>

# --------- PROTECTION DES FICHIERS CACHÉS (ex : .env, .git, etc.) ---------
<FilesMatch "^\.">
    Require all denied
</FilesMatch>

# --------- CONFIGURATION DU SERVEUR ---------
Options -Indexes +SymLinksIfOwnerMatch
ServerSignature Off

# --------- BLOQUER L’ÉNUMÉRATION DES UTILISATEURS WORDPRESS ---------
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} author=\d
    RewriteRule ^ - [F,L]
</IfModule>

# --------- EMPÊCHER L’EXÉCUTION DE PHP DANS UPLOADS ---------
<Directory "/wp-content/uploads/">
    <FilesMatch "\.php$">
        Require all denied
    </FilesMatch>
</Directory>

</VirtualHost>

Enregistrez le fichier, puis recharge la configuration Apache avec :

sudo systemctl reload apache2

À retenir:

  • .htaccess : idéal pour une gestion rapide et locale, sans accès root.
  • VirtualHost : préférable pour une gestion centralisée et performante sur un VPS ou serveur dédié.
  • Pensez à sauvegarder vos fichiers avant toute modification et à tester votre site après chaque changement !

Comment vérifier la présence et la bonne configuration de vos headers ?

  • Vérifiez que votre site fonctionne normalement (paiement, formulaires, contenus externes…).
  • Utilisez les outils de scan de headers pour vous assurer que tout est bien en place, comme Security Headers (Scott Helme) ou HeaderScan. Il suffit de saisir l’URL de votre site pour obtenir un rapport détaillé, des conseils d’amélioration et un score de sécurité.

Conclusion

Mettre en place des headers de sécurité sur votre VPS Apache est une démarche simple, rapide et extrêmement efficace pour protéger votre site web et vos visiteurs. C’est aussi un signal fort envoyé à vos utilisateurs et à Google, prouvant que vous prenez la sécurité au sérieux.

N’attendez plus pour renforcer la sécurité de votre site : appliquez ces headers, testez votre configuration avec les outils proposés, et gardez toujours un œil sur les nouvelles recommandations en matière de cybersécurité !

Xavier Mercier, web designer et graphiste

Contactez-moi maintenant

Augmentons ensemble votre visibilité sur le web.

Share This