Pour sécuriser la configuration d’un serveur d’applications web (Apache,…), il est crucial de limiter les failles exploitables et de protéger les données, car Apache est souvent la porte d’entrée principale d’un système web. Voici les étapes essentielles (et pourquoi chacune importe) pour renforcer la sécurité de ton serveur Apache :
1. Garde ton serveur à jour
- Pourquoi ? Les mises à jour corrigent rapidement les vulnérabilités découvertes dans Apache ou dans ses dépendances. Un serveur obsolète est une cible facile pour les attaquants.
- Comment ? Utilise la commande adaptée à ton système, par exemple
sudo apt update && sudo apt upgrade apache2
2. Cache les informations sur le serveur
- Pourquoi ? Moins l’attaquant en sait, plus il aura de mal à cibler les failles spécifiques. Masquez la version et limite les informations divulguées dans les en-têtes HTTP et pages d’erreur.
- Comment ? Dans la configuration (
/etc/apache2/conf-enabled/security.conf
ouapache2.conf
), ajoute/modifie
ServerTokens Prod
ServerSignature Off
3. Désactive l’indexation des répertoires
- Pourquoi ? Empêche un pirate de lister les fichiers via le navigateur, ce qui pourrait l’aider à préparer une attaque.
- Comment ? Ajoute à la configuration Apache
<Directory /var/www> Options -Indexes </Directory>
4. Réduit et contrôle les modules activés
- Pourquoi ? Chaque module supplémentaire peut être une faille potentielle. Moins il y en a, mieux c’est.
- Comment ? Désactive les modules inutiles, par exemple:
sudo a2dismod status
5. Limiter les méthodes HTTP autorisées
- Pourquoi ? Un pirate ne doit pas pouvoir modifier ou lire les fichiers coté serveur.
- Comment ? Désactivez toutes les méthodes HTTP inutiles qui pourraient être exploitées (ex : PUT, DELETE).
<Directory /var/www/votre_site/html>
<LimitExcept GET POST HEAD>
Deny from all
</LimitExcept>
</Directory>
6. Renforce les permissions des fichiers
- Pourquoi ? Un pirate ne doit pas pouvoir modifier ou lire les fichiers critiques ou de configuration.
- Comment ? Vérifie que seuls les utilisateurs nécessaires ont accès.
sudo chown -R www-data:www-data /var/www
sudo chmod -R 750 /var/www
7. Active le chiffrement HTTPS
- Pourquoi ? Le chiffrement protège les communications contre l’écoute (sniffing) et l’usurpation (man-in-the-middle).
- Comment ? Installe un certificat SSL/TLS (Let’s Encrypt propose des certificats gratuits), puis configure les VirtualHosts pour forcer l’accès HTTPS.
A titre d’exemple, voici comment générer des certificat avec certbot avec apache.
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache
Pour un certificat sans configuration automatique (autonome ou autre serveur)
sudo certbot certonly --standalone -d votredomaine.com -d www.votredomaine.com
Note importante : le serveur doit avoir accès à internet et les routes doivent être ouverte vers le port 80 (vérification challenge) du serveur dans le mode standalone. Il est fortement déconseillé d’utiliser des wildcards dans les noms de domaine.
Renouvellement automatique
Let’s Encrypt délivre des certificats valides 90 jours. Pour automatiser le renouvellement :
sudo certbot renew
Ajoutez-le dans une tâche cron/planificateur pour qu’il s’exécute régulièrement.
Coté apache, il faut ajouter les certificats généré par certbot ou fournit par votre autorité de certification. Le virtual host devra comporter a minium les lignes suivantes :
<VirtualHost *:443>
ServerName votredomaine.com
ServerAlias www.votredomaine.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/votredomaine.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/votredomaine.com/privkey.pem
# Autres directives utiles
</VirtualHost>
8. Met en place un pare-feu applicatif (WAF)
- Pourquoi ? Un WAF, comme ModSecurity, bloque les attaques courantes (injections SQL, XSS…) avant qu’elles n’atteignent ton site.
- Comment ? Installe ModSecurity et active le jeu de règles OWASP CRS.
sudo apt install libapache2-mod-security2
sudo a2enmod security2
sudo systemctl restart apache2
Dans votre VirtualHost, incluez ensuite :
<IfModule mod_security2.c>
Include /etc/modsecurity/*.conf
Include /etc/modsecurity/rules/*.conf
</IfModule>
Règles OWASP (CRS) : activez les “Core Rule Set” fournis sur leur dépôt officiel par l’OWASP pour une protection à jour contre tous les types d’injection.
git clone https://github.com/coreruleset/coreruleset.git
Rendez-vous dans le dossier cloné et copiez les fichiers nécessaires dans le répertoire de configuration de ModSecurity, généralement /etc/modsecurity/ :
cd coreruleset/
sudo mv crs-setup.conf.example /etc/modsecurity/crs-setup.conf
sudo mv rules/ /etc/modsecurity/
sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
sudo nano /etc/modsecurity/modsecurity.conf
Trouvez la ligne :
SecRuleEngine DetectionOnly
et remplacez-la par :
SecRuleEngine On
9. Contrôle l’accès aux ressources sensibles
- Pourquoi ? Limite l’exposition des outils d’administration ou répertoires critiques.
- Comment ? Utilise l’authentification de base/digest et restreins par IP l’accès aux interfaces d’administration. Par exemple, le répertoire/API admin :
<Directory /admin> AuthType Basic Require ip 1.2.3.4 </Directory>
10. Configure les principaux headers de sécurité
- Pourquoi ? Ils protègent contre le clickjacking, le XSS, la fuite d’informations, etc.
- Comment ? Dans ta configuration ou avec mod_headers modifie
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set Content-Security-Policy "default-src 'self'"
Header always set Referrer-Policy "no-referrer"
Header unset X-Powered-By
11. Restreindre les accès et isoler chaque VirtualHost
- Pourquoi ? Restreindre la surface d’attaque et limiter les possibilité a strict minimum
- Comment ? Évitez l’exécution de fichiers PHP/CGI non nécessaires ; contrôlez précisément les autorisations sur les dossiers du VirtualHost.
1. Restreindre les répertoires d’exécution CGI/PHP
- Utilisez la directive
ScriptAlias
pour limiter les répertoires autorisés à exécuter du CGI.
ScriptAlias /cgi-bin/ /var/www/mon-site/cgi-bin/
<Directory "/var/www/mon-site/cgi-bin"> Options +ExecCGI AddHandler cgi-script .cgi .pl Require all granted # Restreindre le type de fichier (voir plus bas)
</Directory>
N’autorisez que les extensions strictement nécessaires. N’installez jamais de scripts CGI dans des répertoires accessibles librement sans contrôle
11. Surveille et analyse les logs
- Pourquoi ? Pour repérer rapidement les attaques ou comportements suspects.
- Comment ? Active et consulte régulièrement les logs d’accès et d’erreur.
LogFormat "%h %l %u %t \"%r\" %>s %b" custom_combined
CustomLog /var/log/apache2/site_access.log custom_combined
12. Valider et filtrer les entrées côté application
- Pourquoi ? Elles protègent les entrées contre les injections XSS, SQL. Elles permets de garantir un bon fonctionnement de l’application Web avec des comportement attendus.
- Comment ? Validez systématiquement toutes les entrées dans votre application (back-end). Utilisez des requêtes préparées (prepared statements) pour les accès SQL, et filtrez/encodez toutes les données affichées pour se prémunir du XSS. Des expressions régulières peuvent remplir cette tache mais elle ne peuvent pas couvrir tout les cas.
# Numéro de téléphone français (10 chiffres, avec ou sans espace) :
^0[1-9][0-9]{8}$
# Code postal français : Exactement 5 chiffres.
^\d{5}$
# Nom/prénom (uniquement lettres, espaces et traits d’union) :
^[A-Za-zÀ-ÖØ-öø-ÿ- ]+$
# Mot de passe (au moins 8 caractères, avec majuscules, minuscules, chiffre et caractère spécial) :
^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[\W_]).{8,}$
# Adresse e-mail : Permet de valider une adresse e-mail standard.
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$
# Numériques : Entier positif (sans signe)
^\d+$
# Entier négatif ou positif (optionnellement signé)
^-?\d+$
# Nombre décimal avec point ou virgule
^-?\d+[.,]?\d*$
# Montant monétaire en euros (ex. 1 234,56 € ou 1234.56)
^\d{1,3}(?:[ \.,]?\d{3})*(?:[.,]\d{2})?$
# 🔠 Lettres et caractères : Nom ou prénom simple (lettres, espace, tiret, accents)
^[A-Za-zÀ-ÖØ-öø-ÿ\- ]{2,50}$
# Champ alphanumérique (lettres + chiffres)
^[A-Za-z0-9]+$
# Champ alphanumérique avec espaces
^[A-Za-z0-9 ]+$
# Champ alphanumérique étendu avec ponctuation simple
^[A-Za-z0-9À-ÖØ-öø-ÿ .,'’"\-()?!]+$
# 📧 Internet / Web : Adresse e-mail (version stricte)
^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$
# URL de site Web
^(https?:\/\/)?(www\.)?[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(\/\S*)?$
# Adresse IPv4 (simple)
^(\d{1,3}\.){3}\d{1,3}$
# 📅 Dates et heures : Date au format français (jj/mm/aaaa)
^(0[1-9]|[0-9]|3)\/(0[1-9]|1[0-2])\/(19|20)\d{2}$
# Date au format ISO (aaaa-mm-jj)
^\d{4}-\d{2}-\d{2}$
# Heure au format HH:MM (24h)
^([0-9]|2[0-3]):[0-5][0-9]$
# 📞 Téléphone / Contact : Numéro de téléphone français (national)
^0[1-9]\d{8}$
# Numéro international (+33, espace ou tiret)
^\+33 ?[1-9]( ?\d{2}){4}$
#💬 Autres : Adresse postale libre (avec lettres, chiffres, ponctuation)
^[A-Za-z0-9À-ÖØ-öø-ÿ\s'’\-,./#]{5,100}$
# Nom d'utilisateur (lettres, chiffres, underscore, 3-20 caractères)
^[a-zA-Z0-9_]{3,20}$
# Mot de passe (8+ caractères, avec maj, min, chiffre, symbole)
^(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[\W_]).{8,}$
Principes de base des expressions régulières pour contrôle de saisie :
^ indique le début de la chaîne.
$ indique la fin de la chaîne.
[0-9] pour un chiffre, [A-Za-z] pour une lettre.
{n} pour exiger un nombre exact de caractères.
\d équivalent à [0-9].
+, *, {min,max} pour le nombre d’occurrences.
En HTML, utilisez l’attribut pattern sur vos champs de formulaire pour appliquer ces regex, exemple :
Adaptez chaque expression selon vos besoins de validation. Pour des exemples plus complexes (dates, montants, etc.), référez-vous aux documentations développées.
Attention : Ce contrôle doit idéalement être fait à la fois côté client (JavaScript/HTML5) et côté serveur (PHP/Python, etc.) pour garantir la sécurité et l’intégrité des données.

😁 N’oublier pas de redémarrer les services concerner
En résumé : La sécurité commence par des mises à jour régulières, la minimisation des informations exposées, la limitation des modules actifs, la restriction des accès, le chiffrement des échanges, l’utilisation d’un WAF, l’implémentation de headers de sécurité, et la surveillance constante des logs et des entrées. Le déploiement et la configuration soigneuse de ModSecurity avec les règles OWASP CRS protègent la grande majorité des attaques par injection côté Apache. Toutes ces mesures visent à réduire la surface d’attaque, à protéger les données et à détecter rapidement toute tentative d’intrusion.