Installer Apache2 sur Debian

De Analyse Développement Hacking
Sauter à la navigation Sauter à la recherche
Consulter le wiki : Accueil du wiki - Objectifs - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack
Consulter le site : Accueil du site - Annuaire - Blog - Forum - Outils - Utilisateur     Consulter le Redmine : Accueil du Redmine

Sommaire

Installer Apache2 sur Debian

Installer Apache2

sudo apt install apache2
Le fichier index.html de Apache2 est généralement situé dans le dossier /var/www/ ou /var/www/html/.
Le fichier index.html est affiché dans le navigateur suite à l'appel de l'adresse 127.0.0.1 ou localhost.

Rediriger Apache2 vers un répertoire spécifique

# Rediriger le répertoire de Apache2 vers le répertoire de travail dans lequel les projets en développement sont stockés.
sudo mv /var/www/html /var/www/html-BAK
sudo ln -s ~/ALIEN/GIT/ZerooCool /var/www/html
# Vérifier les liens symboliques présents dans un dossier :
find ./ -type l
# Supprimer un lien symbolique :
sudo rm lien
# Redémarrer Apache2 :
sudo service apache2 restart

Connaître la version du serveur Apache2

sudo apache2 -v
Server version: Apache/2.4.35 (Debian)
Server built:   2018-10-07T10:54:58

Réinitialiser Apache2

Revenir à une configuration initiale de Apache2 depuis GNU/Linux Debian Jessie :
sudo dpkg --force-confmiss -i /var/cache/apt/archives/apache2_*.deb

Désinstaller Apache2

sudo apt autoremove apache2

Démarrer Apache2

Simuler le démarrage de Apache2

# Simuler le démarrage de Apache2 avec l'option -k permet d'afficher les erreurs éventuellement rencontrées sans lancer Apache2.
sudo apache2 -k start
Préférer la commande suivante pour tester la configuration de Apache2 :
sudo apachectl -t
Ou encore
sudo apache2ctl -t

Exemple d'erreurs de variables d'environnement

AH00111: Config variable ${APACHE_RUN_DIR} is not defined
apache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot
Il semble être préférable de lancer Apache2 avec la commande sudo /etc/init.d/apache2 start ou apache2ctl start !
En général, Apache2 ne devrait pas être appelé directement, mais, plutôt via /etc/init.d/apache2 ou apache2ctl.
La configuration Debian par défaut nécessite des variables d'environnement définies dans /etc/apache2/envvars et ne sont pas disponibles si Apache2 est démarré directement.
Cependant, apache2ctl peut être utilisé pour passer des arguments arbitraires à Apache2.
Le message d'erreur précédent n'est alors plus affiché avec la commande suivante :
sudo apache2ctl -k start
# On pourrait modifier le fichier de configuration de Apache2, mais, cela semble inutile en réalité.
sudo nano /etc/apache2/apache2.conf
# Commenter la ligne 80.
# DefaultRuntimeDir ${APACHE_RUN_DIR}
# Ajouter une ligne 81 avec le chemin vers le dossier : "/etc/apache2/"
DefaultRuntimeDir "/etc/apache2/"
# Redémarrer le test de démarrage de Apache2 avec la commande suivante : sudo apache2 -k start afficherait de nouvelles variables non définies.
[Wed Oct 10 03:18:33.292977 2018] [core:warn] [pid 22105] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Wed Oct 10 03:18:33.293130 2018] [core:warn] [pid 22105] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[Wed Oct 10 03:18:33.293198 2018] [core:warn] [pid 22105] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[Wed Oct 10 03:18:33.293268 2018] [core:warn] [pid 22105] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
AH00543: apache2: bad user name ${APACHE_RUN_USER}
Une solution serrait de faire un export des variables :
export APACHE_PID_FILE=/var/run/apache2.pid
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
...
Remplacer apache2 par apache2ctl permet au test de démarrage de fonctionner sans faire d'alertes sur les variables d'environnement.
Utiliser cette commande pour tester le démarrage en prenant en compte les variables d'environnement du système Apache2 sur Debian : sudo apache2ctl -k start

Variables d'environnement

Tester la configuration d'un serveur Apache2 :
sudo apache2 -t
La commande à lancer pour tester la configuration d'Apache2 en prenant en compte les variables d'environnement :
sudo apache2ctl -t
Le fichier contenant les variables d'environnement : /etc/apache2/envvars
Vérifier si le fichier envvars contient des erreurs de syntaxe.
sh -n /etc/apache2/envvars && echo Syntax OK || echo FAIL
La commande pour obtenir la liste de toutes les variables d'environnement nécessaires au démarrage de Apache2 :
sudo apache2ctl -S

Démarrer Apache2

Cette première commande de démarrage ne serrait pas à privilégier, comme lu précédemment, elle ne prendrait pas en compte les variables d'environnement correctement.
sudo service apache2 start
Préférer les deux commandes suivantes pour démarrer Apache2.
# Ancienne commande :
/etc/init.d/apache2 start
# Nouvelle commande :
sudo apache2ctl start
Saisir localhost dans la barre d'adresses du navigateur pour voir s'afficher les informations suivantes :
Apache2-debian-default-page.png

Debian-apache2-configuration-overview.png

Redémarrer Apache2

# Anciennes commandes :
sudo service apache2 restart
sudo /etc/init.d/apache2 restart
# Nouvelles commandes :
sudo systemctl restart apache2

Recharger la configuration de Apache2

Relancer un serveur apache engendre une interruption de service.
Pour un serveur en production, dans la mesure du possible, il est préférable de faire un rechargement avec reload.
# Anciennes commandes :
sudo service apache2 reload
sudo /etc/init.d/apache2 reload
# Nouvelles commandes :
sudo systemctl reload apache2

Arrêter Apache2

sudo /etc/init.d/apache2 stop

Vérifier si Apache2 écoute le réseau

La configuration par défaut de Apache2 le fait écouter sur le port 80.
Vérifier que Apache2 écoute bien le port 80.

Droits sur les dossiers et les fichiers du site

Propriétaire / Groupe et CHMOD

# Apache, et donc PHP, tournent avec les droits de l'utilisateur "www-data".
# Le fichier /etc/apache2/envvars renseigne que le client aura au niveau du système linux les droits de propriétaire www-data et de groupe www-data.
# Les droits de propriété appliqués sur le répertoire et les fichiers de "/var/www/" sont "root:root" suite à la première installation mais il est souvent conseillé de les remplacer par "www-data:www-data".
# Les droits de propriété associés à un répertoire ou à un fichier peuvent être modifiés grâce aux commandes "chown" ou "chgrp".
# Les droits d'accès CHMOD peuvent être modifiés grâce à la commande "chmod".

Droits CHMOD

Utiliser un chmod 440 sur ces fichiers sensibles .htaccess .htpasswd et .htgroup si utilisés.
Un utilisateur n'est pas sensé pouvoir accéder aux fichiers .htaccess, .htpasswd et .htgroup si utilisés.

Propriétaire / Groupe en développement

# Autoriser www-data à tout modifier est plus simple à gérer, mais est moins sécurisé.
# Changer le propriétaire et le groupe pour www-data:www-data ce qui permet à Apache2 d'écrire ou de modifier les répertoires et les fichiers :
sudo chown www-data:www-data -R /var/www/
# Détailler la commande suivante :
sudo find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw
sudo find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx

Propriétaire / Groupe en production

# L'objectif est de séparer les privilèges.
# L'utilisateur propriétaire ne devrait pas être www-data pour empêcher la modification des droits CHMOD par un client.
# On attribue les dossiers et les fichiers de /var/www/ uniquement au groupe www-data et non pas à l'utilisateur www-data.
# Les dossiers et les fichiers présents dans /var/www appartiennent en général à l'utilisateur root.
# Appliquer le propriétaire root et le groupe www-data aux dossiers et aux fichiers :
sudo chown -R root:www-data /var/www/
# Pour changer uniquement le groupe pour www-data en laissant le propriétaire actuellement utilisé, certainement root par défaut sur debian :
sudo chgrp www-data -R /var/www/
# Le propriétaire root peut modifier ou écrire dans /var/www/ et le groupe www-data peut lire.
# Les utilisateurs qui n'appartiennent pas au groupe www-data ne peuvent pas accéder aux fichiers.
# Les autres utilisateurs du système ne sont pas sensés avoir de droits sur les répertoires ou les fichiers.
# Il y a souvent des mots de passe dans des fichiers de configuration et on ne veut pas permettre la lecture de ses informations à des utilisateurs non autorisés.
# Le groupe www-data doit avoir les droits en lecture sur les fichiers pouvant être consultés depuis le web sans quoi les visiteurs verront s'afficher une page d'erreur 403 (permission denied).


# Chercher tous les dossiers (-type d) dans /var/www/ et ses sous-répertoires.
# Les passer en argument (xarg) pour la commande chmod.
# Effacer les droits existants avec "-t,a-rwxs".
# Autoriser le propriétaire root à lire et écrire avec "u+rw".
# Autoriser le groupe www-data à lire uniquement "g+r".
# Comme il s'agit de dossiers on rajoute l'autorisation exécuter (x) aussi bien au propriétaire qu'au groupe.
# Les arguments -print0 / -0 de find et xargs sont là pour s'assurer que les noms de fichiers contenant des espaces ou autres caractères seront bien traités.
sudo find /var/www/ -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx

# Chercher tous les fichiers (-type f) dans /var/www/ et ses sous-répertoires.
# Même chose que précédemment sauf qu'on cherche des fichiers (-type d) au lieu de dossiers.
sudo find /var/www/ -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r


# Une application web peut avoir besoin d'écrire dans un répertoire ou un fichier comme pour les dossiers temporaires, de cache, ou les fichiers de configuration...
# Donner les droits d'écriture au groupe www-data pour ce répertoire ou ce fichier :
sudo chmod -R g+w /var/www/site/path/dossier
sudo chmod g+w /var/www/site/path/fichier

Droits ACL

Si plusieurs personnes développent le site, il peut être intéressant d'utiliser des droits ACL via les commandes getfacl et setfacl.
Les droits ACL sont symbolisés par un "+" à droite des droits habituels.
Pour plus d'informations consulter le manuel : man setfacl

Droits SELinux

On peut renforcer ou diminuer la politique d'accès aux fichiers partagés par Apache grâce aux commandes chcon et restorecon fournies par SELinux.
SELinux permet par exemple de n'autoriser l'accès à ce fichier que pendant l'exécution de Apache2.

Gestion des erreurs : status, configtest, logs, journalisation

Consulter les statuts du service Apache2

# Démarrer Apache2 :
sudo service apache2 start
# Consulter les statuts du service :
La commande sudo systemctl status apache2.service détail l'état de Apache2.
Dans cet exemple, on constate que le module Passenger est présent.
Il ne s'agit donc pas d'une configuration de Apache2 par défaut, un module a déjà été installé.
systemctl status apache2.service
● apache2.service - LSB: Apache2 web server
  Loaded: loaded (/etc/init.d/apache2)
  Active: active (running) since dim. 2016-07-17 01:02:34 CEST; 12h ago
 Process: 11953 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
 Process: 12930 ExecReload=/etc/init.d/apache2 reload (code=exited, status=0/SUCCESS)
 Process: 12127 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
  CGroup: /system.slice/apache2.service
          ├─12162 /usr/sbin/apache2 -k start
          ├─12948 PassengerWatchdog
          ├─12955 PassengerHelperAgent
          ├─12970 PassengerLoggingAgent
          ├─12987 /usr/sbin/apache2 -k start
          └─12988 /usr/sbin/apache2 -k start
Pour utiliser Apache2 en local avec une installation standard, désinstaller le mod Passenger.
Apache refusera de démarrer si la configuration du mod Passenger n'est pas purgée.
En utilisant la commande sudo apache2 -k start on observe que la configuration de mod_passenger est toujours active même si le module a été désinstallé.
apache2: Syntax error on line 140 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/passenger.load: Cannot load /usr/lib/apache2/modules/mod_passenger.so into server: /usr/lib/apache2/modules/mod_passenger.so: cannot open shared object file: No such file or directory
Si on tente tout de même de démarrer Apache2, un message d'erreur sera affiché sur le terminal :
job for apache2.service failed. see 'systemctl status apache2.service'
La désinstallation de mod_passenger avec --purge permet de démarrer Apache2.
Les lignes de Passenger ne seront plus affichées dans les statuts.
apt-get autoremove --purge mod_passenger
systemctl status apache2.service
● apache2.service - LSB: Apache2 web server
  Loaded: loaded (/etc/init.d/apache2)
  Active: active (running) since dim. 2016-07-17 14:03:23 CEST; 5min ago
 Process: 14150 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
 Process: 14176 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
  CGroup: /system.slice/apache2.service
          ├─14192 /usr/sbin/apache2 -k start
          ├─14195 /usr/sbin/apache2 -k start
          └─14196 /usr/sbin/apache2 -k start
Plusieurs lignes semblent indiquer que Apache est lancé plusieurs fois.
On les tues rapidement avec sudo killall apache2
systemctl status apache2.service
● apache2.service - LSB: Apache2 web server
  Loaded: loaded (/etc/init.d/apache2)
  Active: inactive (dead) since dim. 2016-07-17 15:38:57 CEST; 56min ago
 Process: 14696 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
 Process: 14585 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)
sudo systemctl -l status apache2
● apache2.service - The Apache HTTP Server
  Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Active: inactive (dead) since Fri 2018-08-17 03:30:54 CEST; 13min ago
 Process: 5421 ExecStop=/usr/sbin/apachectl stop (code=exited, status=0/SUCCESS)
 Process: 969 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
 Process: 5373 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 5378 (code=exited, status=0/SUCCESS)
Les statuts de Apache2 semblent maintenant correct et Apache2 peut être lancé normalement :
sudo service apache2 start.

Utiliser configtest pour identifier une erreur de démarrage

Identifier une erreur qui empêche Apache2 de démarrer avec la commande suivante :
sudo apache2ctl configtest
apache2: Syntax error on line 140 of /etc/apache2/apache2.conf: Syntax error on line 1 of /etc/apache2/mods-enabled/passenger.load: Cannot load /usr/lib/apache2/modules/mod_passenger.so 
into server: /usr/lib/apache2/modules/mod_passenger.so: cannot open shared object file: No such file or directory
Action 'configtest' failed.
The Apache error log may have more information.
Erreur de mod manquant pour libapache2-mod-passenger.
La configuration du mod passenger n'a pas été supprimée.
Cette erreur est résolue.
Je relance la commande sudo apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK
Cette erreur est un simple avertissement qui n'empêche pas le fonctionnement du serveur Apache.
Définir la directive 'ServerName' globalement pour supprimer ce message.
Cette erreur est résolue.

Localiser et lire les logs de Apache2

Les informations suivantes sont propres à Apache2.
Une gestion avancée des logs de Apache2 et du système peut être menée à l'aide d'outils complémentaires :
Gestion des logs.

Localiser les logs de Apache2

Chercher le mot clé "ErrorLog" dans le fichier de configuration de Apache2 /etc/apache2/apache2.conf :
ErrorLog ${APACHE_LOG_DIR}/error.log
...
LogLevel warn
Chercher le mot clé "APACHE_LOG_DIR" dans le fichier /etc/apache2/envvars pour avoir des informations sur les variables utilisées dans Apache2 :
# Only /var/log/apache2 is handled by /etc/logrotate.d/apache2.
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX

Lire les logs de Apache2

Un serveur apache bien géré est un serveur dont on peut consulter les logs.
Le fichier error.log de Apache2 est localisé dans /var/log/apache2/error.log
Ce fichier journal contient les détails de ce qui s’est mal passé sur le serveur Apache, ainsi que les information de diagnostic pour y remédier.
Il permet de constater les erreurs lors de la navigation sur le site, fichiers manquants, adresses URL inaccessibles.
Le fichier access.log de Apache2 est localisé dans /var/log/apache2/access.log
Le serveur Apache enregistre toutes les requêtes entrantes dans ce fichier journal.
Il permet de savoir quelles sont les pages qui sont visitées et par qui.
La localisation et le contenu sont définis par la directive CustomLog.
Le fichier other_vhosts_access.log de Apache2.
Les requêtes entrantes en destinations des différents hôtes virtuels y sont enregistrées dans ce fichier.

SEO et journalisation du passage des robots

En SEO l'analyse des logs est un point important pour optimiser le référencement de votre site.
Cette configuration orientée SEO permet de stocker dans un fichier le passage des robots des moteurs de recherche sur votre site.
Utile pour vérifier les cas d'erreurs d'adresses URL ou pour analyser les différents robots d'indexation qui parcourent votre site.
Ajouter ces lignes dans la configuration VirtualHost de votre site.
Le format de données proposé ici convient pour être analysé avec screaming frog log analysis.
# On se base sur le contenu du mot ".*bot*" dans les user-agent naviguant sur votre site.
# On isole les logs dans un fichier séparé pour faciliter l'analyse.
SetEnvIf User-Agent ".*bot*" seobot
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" variables
CustomLog "|/usr/sbin/rotatelogs /var/log/prod/apache2/seo/seo.log.%Y-%m-%d-%H_%M_%S 604800" variables env=seobot
Reload la configuration du serveur Apache2.
Le fichier log va se remplir.
Todo.png

Utiliser les différents niveaux de journalisation

La directive LogLevel permet d'ajuster la verbosité des messages enregistrés dans les journaux d'erreur.
Préciser pour chaque VirtualHost le niveau d’alerte a récupérer.
Par défaut, Apache2 récupère toutes les alertes de type WARN.
Exemple d'usage pour les niveaux de journalisation :
Souhaitez-vous en cas d'alerte que le message demande à un administrateur système de se lever au milieu de la nuit ?
Oui -> Avertir par mail, ou, par SMS.
Non -> Laisser dormir l'administrateur.
Tableau récapitulatif des niveaux de journalisation classés par ordre de gravité décroissant :
Niveau Description Exemple
emerg Défaillance globale de l'application ou du système qui doit faire l'objet d'une enquête immédiate.

Empêcher la perte de données ou de données supplémentaires. Réveiller l'Administrateur système.

"Child cannot open lock file. Exiting"
alert Des mesures doivent être prises immédiatement.

Réveiller l'Administrateur système.

"getpwuid: couldn't determine user name from uid"
crit Conditions critiques.

Ne pas réveiller l'Administrateur système mais le prévenir.

"socket: Failed to get a socket, exiting child"
error Toute erreur fatale à l'opération, mais pas au service ou à l'application.

Impossible d'ouvrir un fichier requis, données manquantes. Ne pas réveiller l'Administrateur système mais le prévenir.

"Premature end of script headers"
warn Avertissements.

Tout ce qui peut potentiellement causer des problèmes d’application. Ne pas réveiller l'Administrateur système mais le prévenir.

"child process 1234 did not exit, sending another SIGHUP"
notice Événement important mais normal. "httpd:caught SIGBUS, attempting to dump core in ..."
info Informations généralement utiles à consigner.

Démarrage / Arrêt des services. Hypothèses de configuration. Réussite de transaction.

"Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..."
debug Informations utiles aux administrateurs sur le plan du diagnostic.

Cela rend les fichiers journaux presque inutiles car il est trop difficile de filtrer le signal du bruit.

"Opening config file ..."
trace (1-8) Tracer le code et essayer de trouver une partie d'une fonction en particulier.

Il est souvent utile de consigner les entrées de l'utilisateur, le changement d'affichage ou d'onglets.

trace1 Messages de traces. "proxy: FTP: control connection complete"
trace2 Messages de traces "proxy: CONNECT: sending the CONNECT request to the remote proxy"
trace3 Messages de traces "openssl: Handshake: start"
trace4 Messages de traces "read from buffered SSL brigade, mode 0, 17 bytes"
trace5 Messages de traces "map lookup FAILED: map=rewritemap key=keyname"
trace6 Messages de traces "cache lookup FAILED, forcing new map lookup"
trace7 Messages de traces, enregistrement d'une grande quantité de données 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"
trace8 Messages de traces, enregistrement d'une grande quantité de données 0000: 02 23 44 30 13 40 ac 34 df 3d bf 9a 19 49 39 15 |"
Si la journalisation s'effectue directement dans un fichier, les messages de niveau notice ne peuvent pas être supprimés et sont donc toujours journalisés.
(Ceci ne s'applique pas lorsque la journalisation s'effectue vers syslog.)
Lorsqu'un niveau particulier est spécifié, les messages de tous les autres niveaux de criticité supérieure seront aussi enregistrés.
Par exemple, si LogLevel info est spécifié, les messages de niveaux notice et warn seront aussi émis.
Il est recommandé d'utiliser un niveau crit ou inférieur.

Niveau de journalisation pour tout le trafic

# Récupérer tous les trafics en HTTPS (level Warning), ainsi que les trafics autre que ceux utilisant le protocol TLS/SSL (level Info).
LogLevel info ssl:warn
Spécifier un niveau avec nom de module va attribuer ce niveau à ce module seulement.
Il est possible de spécifier un module par le nom de son fichier source ou par son identificateur, avec ou sans le suffixe _module.
Les trois spécifications suivantes sont donc équivalentes :
LogLevel info ssl:warn
LogLevel info mod_ssl.c:warn
LogLevel info ssl_module:warn

Niveau de journalisation par module

La directive LogLevel permet de spécifier un niveau de sévérité de journalisation pour chaque module.
Particulièrement utile pour obtenir des détails sur le fonctionnement de modules comme mod_proxy ou mod_rewrite.
La directive LogLevel remplace les directives de journalisation par module des versions précédentes du serveur, comme RewriteLog.
Permet de résoudre un problème propre à un module particulier en augmentant son volume de journalisation sans augmenter ce volume pour les autres modules.
Exemple :
# Spécifier le nom du module dans votre directive LogLevel.
# Le niveau de journalisation général est défini à info, et à trace5 pour mod_rewrite.
LogLevel info rewrite:trace5

Niveau de journalisation par répertoire

Attribuer un niveau de journalisation par répertoire :
LogLevel info
<Directory "/var/www/html/repertoire">
 LogLevel debug
</Directory>
La configuration du niveau de journalisation par répertoire n'affecte que les messages journalisés après l'interprétation de la requête et qui sont associés à cette dernière.
Les messages de journalisation associés au serveur ou à la connexion ne sont pas affectés.
Il est possible d'agir sur ces derniers à l'aide de la directive LogLevelOverride.

Informations complémentaires

Ok.png Source : https://httpd.apache.org/docs/trunk/fr/mod/core.html#loglevel
Ko.png Fichiers Journaux : https://httpd.apache.org/docs/trunk/fr/logs.html
Ko.png Voir la directive ErrorLog : https://httpd.apache.org/docs/trunk/fr/mod/core.html#errorlog
Ko.png Voir la directive LogLevelOverride : https://httpd.apache.org/docs/trunk/fr/mod/core.html#logleveloverride
La directive LogFormat permet de simplifier la sélection du contenu du journal. 
Ko.png Voir le format de la directive ErrorLog : https://httpd.apache.org/docs/trunk/fr/mod/core.html#errorlogformat

Code erreur HTTP

1xx - Information

100 	Continue 		Attente de la suite de la requête.
101 	Switching Protocols 	Acceptation du changement de protocole.
102 	Processing 		WebDAV RFC 2518 : Traitement en cours (évite que le client dépasse le temps d’attente limite).
103 	Early Hints 		RFC 82974 : (Expérimental) Dans l'attente de la réponse définitive, le serveur retourne des liens que le client peut commencer à télécharger.

2xx - Succès

200 	OK 			Requête traitée avec succès. La réponse dépendra de la méthode de requête utilisée.
201 	Created 		Requête traitée avec succès et création d’un document.
202 	Accepted 		Requête traitée, mais sans garantie de résultat.
203 	Non-Authoritative 	Information 	Information retournée, mais générée par une source non certifiée.
204 	No Content 		Requête traitée avec succès mais pas d’information à renvoyer.
205 	Reset Content 		Requête traitée avec succès, la page courante peut être effacée.
206 	Partial Content 	Une partie seulement de la ressource a été transmise.
207 	Multi-Status 		WebDAV : Réponse multiple.
208 	Already Reported 	WebDAV : Le document a été envoyé précédemment dans cette collection.
210 	Content Different 	WebDAV : La copie de la ressource côté client diffère de celle du serveur (contenu ou propriétés).
226 	IM Used 		RFC 32295 : Le serveur a accompli la requête, la réponse est une représentation du résultat d'une manipulation d'instances appliquées à l'instance actuelle.

3xx - Redirection

300 	Multiple Choices 	L’URI demandée se rapporte à plusieurs ressources.
301 	Moved Permanently 	Document déplacé de façon permanente.
302 	Found 			Document déplacé de façon temporaire.
303 	See Other 		La réponse à cette requête est ailleurs.
304 	Not Modified 		Document non modifié depuis la dernière requête.
305 	Use Proxy	 	La requête doit être ré-adressée au proxy.
306 	Switch Proxy 		Code utilisé par une ancienne version de la RFC 26166, à présent réservé. Elle signifiait "Les requêtes suivantes doivent utiliser le proxy spécifié".
307 	Temporary Redirect 	La requête doit être redirigée temporairement vers l’URI spécifiée.
308 	Permanent Redirect 	La requête doit être redirigée définitivement vers l’URI spécifiée.
310 	Too many Redirects 	La requête doit être redirigée de trop nombreuses fois, ou est victime d’une boucle de redirection.

4xx - Erreur du client web

400 	Bad Request 		La syntaxe de la requête est erronée.
401 	Unauthorized 		Une authentification est nécessaire pour accéder à la ressource.
402 	Payment Required 	Paiement requis pour accéder à la ressource.
403 	Forbidden 		L'authentification a été acceptée mais les droits d'accès ne permettent pas au client d'accéder à la ressource.
404 	Not Found 		Ressource non trouvée. Un  nom de page qui n'existe pas affiche une erreur 404. Elle sera retranscrite par défaut dans /var/log/apache2/error.log.
405 	Method Not Allowed 	Méthode de requête non autorisée.
406 	Not Acceptable 		La ressource demandée n'est pas disponible dans un format qui respecterait les en-têtes "Accept" de la requête.
407 	Proxy Authentication Required 	Accès à la ressource autorisé par identification avec le proxy.
408 	Request Time-out 	Le client n'a pas produit de requête dans le délai que le serveur était prêt à attendre. Le client PEUT répéter la demande sans modifications à tout moment ultérieur.
409 	Conflict 		La requête ne peut être traitée en l’état actuel.
410 	Gone 			La ressource n'est plus disponible et aucune adresse de redirection n’est connue.
411 	Length Required 	La longueur de la requête n’a pas été précisée.
412 	Precondition Failed 	Préconditions envoyées par la requête non vérifiées.
413 	Request Entity Too Large	Traitement abandonné dû à une requête trop importante.
414 	Request-URI Too Long 	URI trop longue.
415 	Unsupported Media Type 	Format de requête non supporté pour une méthode et une ressource données.
416 	Requested range unsatisfiable 	Champs d’en-tête de requête « range » incorrect.
417 	Expectation failed 	Comportement attendu et défini dans l’en-tête de la requête insatisfaisante.
418 	I’m a teapot 		« Je suis une théière ». Ce code est défini dans la RFC 23249 datée du premier avril 1998, Hyper Text Coffee Pot Control Protocol.
421 	Bad mapping / Misdirected Request 	La requête a été envoyée à un serveur qui n'est pas capable de produire une réponse (par exemple, car une connexion a été réutilisée).
422 	Unprocessable entity 	WebDAV : L’entité fournie avec la requête est incompréhensible ou incomplète.
423 	Locked 			WebDAV : L’opération ne peut avoir lieu car la ressource est verrouillée.
424 	Method failure 		WebDAV : Une méthode de la transaction a échoué.
425 	Unordered Collection 	WebDAV RFC 364810. Code défini dans le brouillon WebDAV Advanced Collections Protocol, mais absent de WebDAV Ordered Collections Protocol.
426 	Upgrade Required 	RFC 281711 Le client devrait changer de protocole, par exemple au profit de TLS/1.0.
428 	Precondition Required 	RFC 658512 La requête doit être conditionnelle.
429 	Too Many Requests 	RFC 658513 Le client a émis trop de requêtes dans un délai donné.
431 	Request Header 		Fields Too Large 	RFC 658513 Les entêtes HTTP émises dépassent la taille maximale admise par le serveur.
449 	Retry With 		Code défini par Microsoft. La requête devrait être renvoyée après avoir effectué une action.
450 	Blocked by Windows Parental Controls 	Code défini par Microsoft. Cette erreur est produite lorsque les outils de contrôle parental de Windows sont activés et bloquent l’accès à la page.
451 	Unavailable For Legal Reasons 	Ce code d'erreur indique que la ressource demandée est inaccessible pour des raisons d'ordre légal.
456 	Unrecoverable Error 	WebDAV : Erreur irrécupérable.

4xx étendus au serveur Nginx

444 	No Response 		Indique que le serveur n'a retourné aucune information vers le client et a fermé la connexion.
495 	SSL Certificate Error 	Une extension de l'erreur 400 Bad Request, utilisée lorsque le client a fourni un certificat invalide.
496 	SSL Certificate Required 	Une extension de l'erreur 400 Bad Request, utilisée lorsqu'un certificat client requis n'est pas fourni.
497 	HTTP Request Sent to HTTPS Port Une extension de l'erreur 400 Bad Request, utilisée lorsque le client envoie une requête HTTP vers le port 443 normalement destiné aux requêtes HTTPS.
498 	Token expired/invalid 	Le jeton a expiré ou est invalide.
499 	Client Closed Request 	Le client a fermé la connexion avant de recevoir la réponse. Cette erreur se produit quand le traitement est trop long côté serveur.

5xx - Erreur du serveur / du serveur d'application

500 	Internal Server Error 	Erreur interne du serveur.
501 	Not Implemented 	Fonctionnalité réclamée non supportée par le serveur.
502 	Bad Gateway ou Proxy Error 	En agissant en tant que serveur proxy ou passerelle, le serveur a reçu une réponse invalide depuis le serveur distant.
503 	Service Unavailable 	Service temporairement indisponible ou en maintenance.
504 	Gateway Time-out 	Temps d’attente d’une réponse d’un serveur à un serveur intermédiaire écoulé.
505 	HTTP Version not supported 	Version HTTP non gérée par le serveur.
506 	Variant Also Negotiates RFC 229517 : Erreur de négociation. Transparent content negociation.
507 	Insufficient storage 	WebDAV : Espace insuffisant pour modifier les propriétés ou construire la collection.
508 	Loop detected 		WebDAV : Boucle dans une mise en relation de ressources (RFC 5842).
509 	Bandwidth Limit Exceeded 	Utilisé par de nombreux serveurs pour indiquer un dépassement de quota.
510 	Not extended 		RFC 277419 : la requête ne respecte pas la politique d'accès aux ressources HTTP étendues.
511 	Network authentication required RFC 658513 : Le client doit s'authentifier pour accéder au réseau. Utilisé par les portails captifs pour rediriger les clients vers la page d'authentification.

5xx étendus au mandataire Cloudflare

520 	Unknown Error 		L'erreur 520 est utilisé en tant que réponse générique lorsque le serveur d'origine retourne un résultat imprévu.
521 	Web Server Is Down 	Le serveur a refusé la connexion depuis Cloudflare.
522 	Connection Timed Out 	Cloudflare n'a pas pu négocier un TCP handshake avec le serveur d'origine.
523 	Origin Is Unreachable 	Cloudflare n'a pas réussi à joindre le serveur d'origine. Cela peut se produire en cas d'échec de résolution de nom de serveur DNS.
524 	A Timeout Occurred 	Cloudflare a établi une connexion TCP avec le serveur d'origine mais n'a pas reçu de réponse HTTP avant l'expiration du délai de connexion.
525 	SSL Handshake Failed 	Cloudflare n'a pas pu négocier un SSL/TLS handshake avec le serveur d'origine.
526 	Invalid SSL Certificate Cloudflare n'a pas pu valider le certificat SSL présenté par le serveur d'origine.
527 	Railgun Error 		L'erreur 527 indique que la requête a dépassé le délai de connexion ou a échoué après que la connexion WAN ait été établie.

Les fichiers de configuration de Apache2

/etc/apache2/envvars

Éditer la configuration du fichier /etc/apache2/envvars pour changer l'utilisateur de Apache2

# Éditer la configuration pour utiliser l'utilisateur courant de la machine :
sudo nano /etc/apache2/envvars
# Avec :
export APACHE_RUN_USER=zer00cool
export APACHE_RUN_GROUP=zer00cool
# Permettre à Apache2 d'accéder à son dossier de log/lock avec l'utilisateur défini.
sudo chown zer00cool /var/lock/apache2/
# Par défaut, on utilisera www-data pour l'utilisateur et pour le groupe.

Éditer la configuration du fichier /etc/apache2/envvars pour changer le dossier principale de Apache2

# Changer éventuellement la ligne DocumentRoot "/var/www/html/" en DocumentRoot "/var/www".

/etc/apache2/apache2.conf

Le fichier apache2.conf n'est pas sensé être modifié

# Le fichier /etc/apache2/apache2.conf est le remplaçant de httpd.conf qui est lu au démarrage d'apache.
# Par convention, le fichier apache2.conf n'a pas à être modifié directement.
# On préférera ajouter la configuration personnalisée dans le fichier "/etc/apache2/httpd.conf". (Vérifier pour debian ou placer les configurations personnalisées.)
# Consulter le fichier de configuration /etc/apache2/apache2.conf :
cat /etc/apache2/apache2.conf
# Editer le fichier :
sudo nano /etc/apache2/apache2.conf
# Il inclue notamment les fichiers de configuration suivants : 
/etc/apache2/ports.conf : Indique le(s) port(s) sur lequel(s) écoute apache2. Le port 80 pour http et le port 443 pour https.
/etc/apache2/httpd.conf : Fichier généralement vide. Il essentiellement là pour des raisons historiques et sert de nos jours pour injecter une configuration personnalisée.
Sous Debian la configuration des sites et des modules de Apache2 est modulaire.
On pourrait mettre toute la configuration dans le fichier /etc/apache2/httpd.conf mais le fichier de configuration serait très long.
L'activation ou la désactivation d'un site ou d'un module consisterait à commenter ou décommenter une partie de la configuration et pourrait engendrer un certain nombre d'erreurs humaines.
Fedora propose de reproduire une décomposition proche de celle de Debian en mettant en plaçant les configurations dans le répertoire dédié /etc/apache2/conf.d.
Ko.png Source complémentaire : http://doc.fedora-fr.org/wiki/Installation_et_configuration_d%27Apache#Configuration_d.27Apache

/etc/apache2/conf.d/charset

Forcer l'encodage du serveur

nano /etc/apache2/conf.d/charset
# Décommenter la ligne suivante :
AddDefaultCharset UTF-8
nano /etc/apache2/envvars 
# Décommenter la ligne suivante :
. /etc/default/locale
# Redémarrer pour prendre en compte les modifications.
service apache2 restart 

/etc/apache2/conf-available/security.conf

Désactiver la divulgation d'informations par le serveur Apache2

# Par convention, le fichier apache2.conf n'a pas à être modifié directement.
# Ajouter la configuration suivante dans le fichier /etc/apache2/apache2.conf :
# Le fichier de configuration sera proposé par défaut dans le fichier /etc/apache2/conf-available/security.conf de Apache2.4 sous Debian :
# Désactiver la signature du serveur.
# La signature du serveur affiche notamment dans une erreur page 404 les informations suivantes : Serveur Version du Serveur Système IP et Port
ServerSignature Off
# La directive ServerSignature Email peut être ajoutée pour contacter le webmaster.
# Cela n'empêche pas de personnaliser la page de traitement du code erreur 404.
ServerSignature Email
# Passer la directive ServerTokens à Prod (Pour Product Only), le champ Server contiendra uniquement le nom du serveur web utilisé. (Server: Apache)
ServerTokens Prod
# Cette définition semble erronée. J'avais testé le résultat mais actuellement, c'est bien la valeur Prod qui me permet d'effacer le numéro de version. La ligne Server: Apache reste affichée.
# Avec Apache2.4 passer la directive "ServerTokens" à "Minimal" pour ne pas afficher du tout la valeur Server :
# ServerTokens Minimal
Tester si la valeur Server est affichée ou non suite au changement de la directive ServerTokens :
curl -I https://www.visionduweb.fr
# Désactiver la méthode HTTP TRACE.
# La méthode HTTP TRACE présente une vulnérabilité de type XST (Cross-Site-Tracing).
# Les attaques XST utilisent la méthode HTTP TRACE et une faille de type XSS (Cross-site Scripting).
# Une fois désactivée, un accès refusé de type erreur http 403 sera affiché si on souhaite utiliser la méthode TRACE.
TraceEnable Off
# Redémarrer pour prendre en compte les modifications :
sudo systemctl restart apache2
Tester si la valeur TRACE est affichée ou non suite au changement de la directive ServerTokens :
curl -i -X TRACE https://www.visionduweb.fr

Comprendre les drapeaux de réécriture de Apache2

Drapeaux de réécriture - Flags : https://httpd.apache.org/docs/current/fr/rewrite/flags.html
Le [NE] est nécessaire pour transmettre des éléments tels que les paramètres GET à la nouvelle URL sous forme inchangée.
Voir : http://httpd.apache.org/docs/2.4/rewrite/flags.html

Les modules sur Apache2

Consulter les modules installés

# Consulter la liste des modules installés, mais pas forcément utilisés, pour Apache2 :
ls /etc/apache2/mods-available/
# Apache2 dispose de nombreux modules complémentaires dont le nom de paquet débute généralement par libapache2.
# Le répertoire /etc/apache2/mods-available/ est alimenté par l'installation de paquets "libapache2-mod-...".
# Obtenir la liste des modules disponibles pour Apache2 :
apt-cache search libapache2
# Pour chaque module existe le couple de fichier .load et .conf qui informe Apache2 sur la façon de charger le module.
# Exemple : Si on installe libapache2-mod-php5, un fichier "php5.load" et "php5.conf" devrait apparaître dans ce répertoire.

Consulter la liste des modules activés

# Consulter la liste des modules activés
sudo ls /etc/apache2/mods-enabled/
# Ce répertoire contient les liens symboliques qui pointent vers les fichiers ".conf" et ".load" des modules devant être chargés au démarrage de Apache2.
# Il suffit de créer les bons liens symboliques pour indiquer à apache2 quels modules charger, et supprimer les liens symboliques des modules qu'on ne souhaite pas charger.
# On utilisera de préférence les deux commandes suivantes pour créer ou supprimer les liens symboliques :
a2enmod : (Apache2 enable module.) : Active un module Apache2.
a2dismod : (Apache2 disable module.) : Désactive un module Apache2.

Optimiser Apache2 en désactivant les modules inutiles

Les modules qui ne sont pas nécessaires n'ont pas besoin de rester activés.
Désactiver par exemple les modules concernant sqlite, quand c'est mysql ou mariadb qui est utilisé.

Activer un module

# La commande suivante active un module pour Apache2.
# Un lien symbolique va être ajouté dans le dossier /etc/apache2/mods-enabled et pointera vers le fichier de définition du module.
a2enmod Nom_du_module
# Redémarrer Apache2 pour prendre en compte l'activation d'un module.
sudo systemctl restart apache2
# Les modules utilisent leur configuration par défaut depuis le répertoire /etc/apache2/mods-available.
# En général deux fichiers existent pour chaque module installé sur le système :
# Un fichier avec une extension .load contient la directive de chargement du module réel, généralement contenu dans le répertoire /usr/lib/apache2/modules/.
# Un fichier avec une extension .conf qui contient la configuration par défaut du module.
# Il est possible de modifier cette configuration par défaut en ajoutant de nouvelles directives.
# Les distributions basée sur Debian proposent un répertoire /etc/apache2/conf.d pour ajouter de nouvelles configurations personnalisées. 
# Créer un nouveau fichier nommé à notre convenance pour ajouter une configuration personnalisée.
# L’ensemble des fichiers sont concaténés à la fin de la configuration de Apache2.
# Tout ce qui concerne Apache2 dans cet article a été testé avec Debian Stretch.
# Il est utile de préciser que a2enmod ne fait pas parti du projet apache et /etc/apache2 n'est pas utilisé sur toutes les distributions.
# Il existe notamment /etc/httpd.

Module Apache2 mod_auth_basic

Ko.png Source : https://httpd.apache.org/docs/2.4/mod/mod_auth_basic.html

Module Apache2 mod_auth_digest

Ko.png Source : https://httpd.apache.org/docs/2.4/mod/mod_auth_digest.html

Module Apache2 mod_authz_owner

Ko.png Source : https://httpd.apache.org/docs/2.4/mod/mod_authz_owner.html

Module Apache2 mod_authz_user

Ko.png Source : https://httpd.apache.org/docs/2.4/mod/mod_authz_user.html

Module Apache2 mod_file_cache

Le module mod_file_cache est le plus simple des deux mécanismes de mise en cache entre mod_file_cache et mod_cache.
On préférera mod_cache qui est d'avantage paramétrable.
Tout type de mise en cache peut améliorer les performances d'un site.
Tester le site par après pour vérifier son bon fonctionnement.
Le module mod_file_cache sert a mettre en cache le contenu qui est demandé fréquemment et qui change peu souvent.
Les fichiers ne changeront pas pendant la durée de vie de l'instance Apache actuelle.
Les techniques utilisées avec ce module empêchent la prise en compte des modifications ultérieures jusqu'au redémarrage du serveur.
Ce mécanisme de mise en cache ne peut être utilisé qu'avec des fichiers normaux.
Aucun contenu généré dynamiquement ni aucun fichier généré par des gestionnaires de contenu spéciaux ne fonctionneront ici.
Connaître les répercussions d'une mise en cache mal configurée :
Il est parfois nécessaire de réévaluer vos pratiques de sécurité après la mise en œuvre de la mise en cache.
Vérifier que les ressources privées ne sont pas accidentellement mises en cache pour la consommation publique.
Le module mod_file_cache fournit deux directives utilisées pour effectuer la mise en cache de différentes manières.

Directive MMapFile

MMapFile est une directive utilisée pour créer une liste de fichiers, puis mapper ces fichiers en mémoire.
Il est essentiel qu'aucun des fichiers configurés pour utiliser ce type de mise en cache ne soit modifié.
La création du cache se fait uniquement au démarrage du serveur !
Configurer ce type de mise en cache depuis le fichier de configuration du serveur.
Spécifier les fichiers à mettre en cache en mémoire dans une liste séparée par des espaces :
MMapFile /var/www/index.html /var/www/otherfile.html var/www/static-image.jpg
Ces fichiers seront conservés en mémoire et servis à partir de là lorsque la ressource sera demandée.
Si l'un des fichiers est modifié, vous devez redémarrer le serveur.

Directive CacheFile

Il gère un tableau de ces descripteurs de fichiers ouverts et l'utilise pour réduire le temps nécessaire à l'ouverture de ces fichiers.
Les modifications apportées au fichier pendant le fonctionnement du serveur ne seront pas reconnues par le cache.
Le contenu d'origine continuera d'être servi jusqu'au redémarrage du serveur, pour une nouvelle mise en cache.
Cette directive est utilisée en spécifiant une liste de fichiers séparés par des espaces qui doivent être mis en cache avec cette méthode :
CacheFile /this/file.html that/file.html other/file/to/server.html

Module Apache2 mod_cache

mod_deflate permet la compression des données envoyées au client.
mod_expires permet de configurer le cache côté navigateur client et le délai d'expiration des fichiers mis en cache.
mod_file_cache permet de configurer le cache côté serveur. (On privilégiera l'utilisation de mod_cache, plus puissant.)
mod_cache permet de configurer le cache côté serveur.
Todo.png
Les fichiers seront mis en cache conformément à une instruction qui spécifie la durée pendant laquelle une page peut être considérée comme "nouvelle".
Ces modèles sont plus utiles dans la plupart des cas que mod_file_cache :
Les mécanismes de mise en cache reposent sur le fait de servir des fichiers dans un état persistant.
Le module mod_cache peut gérer la modification du contenu en configurant la durée de validité d'un fichier pour la mise en cache.
Le module mod_cache s'appuie sur deux autres modules pour effectuer la majeure partie de la mise en œuvre du cache : mod_disk_cache et mod_mem_cache.
Pour le premier module le cache est conservé sur disque. Pour le deuxième module le cache est conservé en mémoire.
Les fichiers sont stockés et récupérés à l'aide de clés basées sur l'URI. Améliorer la mise en cache de votre site en activant le nommage canonique :
UseCanonicalName On

Objectif : Last-modified et code 304

Last-modified est une entête envoyée via des requêtes GET conditionnelles entre le serveur web du site et le navigateur, supporté par n’importe quel navigateur comme Google (Googlebot) et Bing (Bingbot).
Cette entête a un intérêt pour les moteurs de recherche et notamment dans le cadre de l’optimisation du crawl de Googlebot.
Les validateurs sont très importants :
Si aucune information de fraîcheur, Cache-Control ou Expires, n'est disponible, les caches ne stockeront rien.
Lorsqu'un document est demandé une première fois par un moteur de recherche, le serveur web renvoie une entête last-modified avec la date de la dernière modification.
Lorsqu'un document est demandé une deuxième fois, le moteur de recherche ajoute à sa requête une entête if-modified-since avec la dernière date qu’il connaît grâce au last-modified.
Si le document n’a pas changé depuis le if-modifed-since, le serveur envoie un code 304 not modifed sans le document.
Le moteur de recherche va utiliser la dernière version qu’il connaît. 
Cette requête GET conditionnelle est plus rapide à charger par le moteur de recherche que la réponse complète.
Si le document a changé, c’est à dire que le nouveau last-modified est supérieur au if-modified-since, alors le serveur répond normalement avec un code 200 et renvoie le nouveau document.
Je part du principe que si mod_expires est renseigné, last-modified et if-modifed-since sont renseignés, même si mod_cache n'est pas activé.
De ce fait, le code 304 serait correctement retourné au moteurs de recherches ?
# L'en-tête Expires basé sur la date de modification ne sera pas ajouté à un contenu qui ne provient pas directement d'un fichier sur disque.
# Pour que l'entête last-modified soit active sur Apache, il faut que le module mod_cache soit activé.
Todo.png
# Lire les headers retournés avec la commande cURL :
curl -I https://www.visionduweb.fr
# C'est un code 200 qui est retourné, donc, le document a été rechargé.
# J'observe bien une valeur last-modified mais pas de valeur if-modifed-since.
# Pourquoi la date d'expiration est t'elle en 2005 ?
HTTP/1.1 200 OK
Date: Sun, 03 Mar 2019 20:59:28 GMT
Server: Apache
Expires: Wed, 17 Aug 2005 00:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Set-Cookie: f4e8b27a5048454220760e16fe525d93=1u2o7k4masjbcgd5oortnmq5ev; path=/; HttpOnly;HttpOnly;Secure
X-Frame-Options: SAMEORIGIN
Referrer-Policy: no-referrer-when-downgrade
Feature-Policy: geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;
Last-Modified: Sun, 03 Mar 2019 20:59:29 GMT
Notes :
Pragma: no-cache : La valeur no-cache ne rend pas pour autant non cachable, elle traite les en-têtes de requête Pragma, les en-têtes envoyées au serveur par le navigateur.
Certains caches honorent cet en-tête, ce n'est pas le cas de la majorité, ce qui la rend sans effet.

Configurer la mise en cache avec mod_mem_cache

# Le répertoire /etc/apache2/mods-available permet de consulter la configuration par défaut des modules.
# Regarder la configuration de mod_mem_cache :
sudo nano /etc/apache2/mods-available/mem_cache.conf 
<IfModule mod_mem_cache.c>
# Indique à Apache de créer un cache mémoire pour le contenu stocké sous "/" donc, la racine, tout le contenu.
CacheEnable mem /
# Taille du cache au maximum.
MCacheSize 4096
# Nombre d'objets au maximum.
MCacheMaxObjectCount 100
# Les valeurs par défaut spécifient que les fichiers compris entre 1 octet et 2 kilo-octets seront pris en compte pour la mise en cache.
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>
# Activer mod mem_cache va également activer mod_cache :
sudo a2enmod mem_cache
# Redémarrer Apache2 :
sudo service apache2 restart

Configurer la mise en cache avec mod_disk_cache

# Le répertoire /etc/apache2/mods-available permet de consulter la configuration par défaut des modules.
# Regarder la configuration de mod_disk_cache :
sudo nano /etc/apache2/mods-available/disk_cache.conf
<IfModule mod_disk_cache.c>
# La directive "CacheRoot" spécifie où le contenu mis en cache sera conservé.
CacheRoot /var/cache/apache2/mod_disk_cache
# La directive "CacheEnable disk /" est désactivée par défaut. L'activer sur un hôte virtuel pour avoir une meilleure idée de ce qui sera mis en cache.
#CacheEnable disk /
# Les deux autres directives déterminent la structure de la mise en cache à la racine du cache.
# Chaque élément mis en cache est haché par son URL, puis le hachage est utilisé comme nom de fichier et chemin de répertoire.
# CacheDirLevel décide du nombre de répertoires à créer à partir de la chaîne de hachage.
CacheDirLevels 5
# CacheDirLength détermine le nombre de caractères contenus dans chaque nom de répertoire.
CacheDirLength 3
</IfModule>
Exemple :
Si vous avez un fichier dont le hachage est "abcdefghijklmnopqrstuvwxyz", alors un CacheDirLevel de 2 et une CacheDirLength de 4 entraîneront le stockage du fichier dans :
[path_of_cache_root] / abcd / efgh / ijklmnopqrstuv
# Activer le module mod_disk_cache pour charger la configuration :
sudo a2enmod disk_cache
# Redémarrer Apache2.
sudo service apache2 restart
Ok-ko.png Apache Module mod_disk_cache : http://httpd.apache.org/docs/2.2/mod/mod_disk_cache.html
Ok-ko.png Source complémentaire : http://careers.disneylandparis.com/manual/fr/mod/mod_cache_disk.html

Utilisation de CacheLock pour éviter de surcharger le backend

Un problème peut survenir sur un serveur occupé lorsqu'une ressource mise en cache expire.
Le cache qui doit être actualisé devra extraire à nouveau le fichier à partir de la ressource de fichier normale.
Cela peut créer une forte augmentation du nombre de demandes adressées au serveur principal lorsque la version mise en cache est en cours d'actualisation.
Activer un fichier de verrouillage qui indique que la ressource est en cours de reconnexion et que les demandes suivantes ne doivent pas aller au backend.
Ce verrou peut empêcher Apache d'essayer de mettre en cache la même ressource plusieurs fois lors de la première mise en cache.
Il servira également la ressource périmée jusqu'à la fin du cache actualisé.
Trois directives sont utilisées pour contrôler CacheLock :
# Active la fonctionnalité.
CacheLock [ On | Off ]
# Délai le plus long, en secondes, pendant lequel un fichier de verrouillage sera considéré comme valide.
# Ceci est important en cas d'échec ou de retard anormal d'actualisation d'une ressource.
CacheLockMaxAge [time_in_seconds]
# Définir le répertoire dans lequel les verrous de ressources seront créés.
CacheLockPath [/path/to/lock/directory]

Vider le cache Apache

La mise en cache stockée sur le disque peut devenir volumineuse en fonction des dates d'expiration du contenu.
Apache inclut un outil appelé "htcacheclean" pour réduire le cache à une taille configurée.
Htcacheclean - Nettoyage du cache sur disque : http://careers.disneylandparis.com/manual/fr/programs/htcacheclean.html
Htcacheclean - Nettoyage du cache sur disque : https://httpd.apache.org/docs/2.4/programs/htcacheclean.html

Module Apache2 mod_cache_socache

Ko.png Le cache des objets partagés du serveur HTTP Apache : http://blog.transparency.org/manual/fr/socache.html
Ko.png Module Apache mod_cache_socache : http://blog.transparency.org/manual/fr/mod/mod_cache_socache.html#cachesocache

Module Apache2 mod_deflate

# Activer la compression Gzip des fichiers en sortie de votre serveur.
# Activer le module.
sudo a2enmod deflate
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Il semble qu'il soit inutile de compresser des images avec DEFLATE car elles sont censées déjà être compressées.
# Cela consommerait du temps CPU pour un résultat nul. Il faudrait tout de même vérifier pour avoir un exemple des gains éventuels.
# Suivre le bon déroulement de la décompression depuis les propriétés de la page dans le navigateur.
# Depuis Firefox : Clic droit dans la page, Informations sur la page, Onglet Général, Taille.
# Comparer la taille du fichier original et la taille lue par le navigateur, à l'octet près.
# Les outils de développement intégrés au navigateur affichent les gains de performance depuis l'onglet Réseau ou Network.
# Ils mentionnent les en-têtes HTTP de compression ainsi que la quantité de données téléchargées.

Module Apache2 mod_evasive

Installer et configurer mod_evasive pour Apache2.

Module Apache2 mod_expires

# Pour les architectures PHP+MySQL, nous pouvons utiliser principalement 3 systèmes de cache :
# Le cache Apache situé au niveau du serveur.
# Le cache du navigateur qui copie sur la machine utilisateur les pages HTML, images, CSS, Javascript, pour les re-servir au client sans avoir à faire de nouvelles requêtes au serveur.
# Le cache MySQL qui garde en mémoire les résultats de requêtes SQL.
# L'en-tête HTTP Expires permet de préciser les types de fichiers pouvant rester en cache dans le navigateur du visiteur pendant une durée déterminée.
# Le navigateur n’a plus besoin de faire des requêtes pour vérifier la validité du cache ce qui diminue le nombre de requêtes sur le site.
# Il indique à tous les caches pour combien de temps la représentation associée reste valide.
# Après échéance les caches vérifieront auprès du serveur original si le document a changé.
# Les en-têtes Expires sont reconnues par pratiquement tous les caches.
# La gestion du cache rend le site plus réactif pour les utilisateurs.

# Les en-têtes de réponse Expires permettent en général :
# - de fixer une date d'expiration absolue.
# - de fixer une date basée sur celle de la dernière représentation vue par le client (Dernière date d'accès)
# - de fixer une date basée sur la dernière modification du document depuis le serveur (Dernière date de modification).

# Les en-têtes Expires conviennent parfaitement pour la mise en cache des images statiques, par exemple, pour les boutons de navigation.
# Les fichiers images n'ont pas de raison de changer de nom, la date d'expiration peut alors être éloignée dans l'avenir en permettant alors la durée de vie des images en cache.

# Les en-têtes Expires sont aussi utile pour contrôler la mise en cache d'une page qui change régulièrement.
# Pour une page quotidiennement mise à jour à cinq heures, fixer l'expiration du cache à cinq heures permet aux utilisateurs d'obtenir la nouvelle version à partir de cinq heures sans avoir à recharger la page.
# Activer le module mod_expires.
sudo a2enmod expires
# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# Consulter différents types mime disponibles : https://fr.wikipedia.org/wiki/Type_de_m%C3%A9dias#Liste_des_types_de_m%C3%A9dia_courants
# Un simple en-tête Expires admet pour seule valeur une date HTTP.
# Tout autre valeur sera probablement interprété comme une date dans le passé, la contenu n'étant alors pas mis en cache.
# Les horloges du serveur Web et du cache doivent être synchronisées. Utiliser le protocole de date de réseau (NTP).
# L'heure d'une date HTTP est relative au temps GMT, non pas au temps local.
# Vérifier la syntaxe :
### -> ### Expires: Fri, 05 Mar 2021 12:00:00 GMT (???)
Ok-ko.png Source : https://httpd.apache.org/docs/current/fr/mod/mod_expires.html

Module Apache2 mod_fastcgi

mod_fastcgi est un module cgi pour le serveur Web Apache qui peut se connecter à un serveur FASTCGI externe.
PHP doit s'exécuter en tant que utilisateur non root.
Exécuter les CGI PHP en tant qu’utilisateur non privilégié à l’aide de suEXEC ou mod_suPHP d’Apache.
Si PHP s'exécute en tant qu'utilisateur root ou utilisateur inférieur à 100, il peut accéder aux fichiers système et / ou les manipuler.
La fonctionnalité suEXEC offre aux utilisateurs Apache la possibilité d'exécuter des programmes CGI sous des ID utilisateur différents de ceux du serveur Web appelant.
# Vérifier l'utilisateur qui execute php-cgi :
su
ps aux | grep php-cgi
# Configurer le serveur pour qu'il utilise une interface FastCGI php externe s'exécutant sur le port 9000 à l'adresse IP 127.0.0.1 :
Ko.png https://www.cyberciti.biz/tips/rhel-fedora-centos-apache2-external-php-spawn.html
Ko.png https://www.cyberciti.biz/faq/freebsd-configure-nginx-php-fastcgi-server/

Module Apache2 mod_headers

# Activer le module mod_headers :
sudo a2enmod headers

HTTP Strict Transport Security

Introducation à HSTS
Sécurité
Optimiser la sécurité en activant HSTS : Header Strict Transport Security.
HSTS est une indication dans le header de la page visitée qui force le navigateur à charger immédiatement la page en https en ignorant tout appel http.
On minimise les risques de sécurité liés à une redirection effectuée de http vers https, l'échange crypté ne pouvant plus être détourné.
Il serait donc impossible pour les pirates de détourner l'échange crypté.
La première sollicitation du domaine depuis http sera traitée puis renvoyée vers https.
Les sollicitations suivantes seront envoyées directement vers https ce qui évitera des requêtes inutiles.
La première règle appliquée du serveur doit effectuer le changement de protocole de http vers https avant de charger le header de la page à consulter.
Cette méthode est donc complémentaire à la redirection mise en place depuis le fichier de configuration de l'hôte virtuel ou depuis le fichier .htaccess.
Sur un serveur VPS ou dédié, il est préférable de mettre la configuration du serveur ainsi que la ligne de configuration de HSTS directement dans le VirtualHost pour obtenir un gain de performance.
Performance
Avec HSTS activé et validé, les navigateurs forceront directement le chargement de la page via https même si l'utilisateur entre une adresse http.
On obtient un gain de performances minime lors du chargement de la page en évitant le temps de latence d'une redirection 301.
Optimisation
Il existe une liste de sites qui utilisent le pré-chargement directe vers https de certains sites qui ont validé la configuration de leur serveur.
La soumission de l'adresse URL sur https://hstspreload.org doit être faite sans le sous domaine www, que l'on choisisse ou non de conserver www.
Le test se fait globalement sur le domaine, le résultat à prendre en considération est donc celui obtenu suite au test de visionduweb.fr.
Pour faire partie de cette liste, il suffit simplement d'être validé après avoir réussi le test de hstspreload : https://hstspreload.org
Le site sera mis sur une liste d'attente et accepté si la configuration respecte toutes les conditions requises.
Consulter la liste : https://cs.chromium.org/chromium/src/net/http/transport_security_state_static.json
Vous pouvez annuler votre inscription par la suite mais cela peut prendre alors beaucoup plus de temps.
Cette liste a été mise en place par Chrome et est désormais utilisée par la plupart des navigateurs.
Faire partie de cette liste n'est pas obligatoire pour activer Header Strict Transport Security.
Consulter la liste des sites étant validés : https://caniuse.com/#feat=stricttransportsecurity
La directive preload est obligatoire uniquement si on souhaite être présent dans la liste.
Faire partie de cette liste informe le navigateur qu'il doit utiliser directement https.
Si le test effectuée sur hstspreload affiche "HTTP redirects to www first", il faut comprendre que la redirection vers l'url avec www est placé avant la redirection https, il est préférable de corriger cela.
Si le test effectuée sur hstspreload affiche le message : Status: nomdusite.fr is currently preloaded, cela signifie que le site validé est présent dans la liste, au moins pour celle du navigateur Chrome.
Tester également sur SSL Labs, et, faire le nécessaire pour obtenir une note A+ : https://www.ssllabs.com/ssltest/
La méthode de calcul est détaillée sur cette page : https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/scoring.md
Une des deux informations suivantes doit être affichée suite au test sur SSL Labs :
- en preload sur chrome, en cours sur les autres navigateurs.
- activé mais pas ajouté dans la liste preload.

SSL Labs affiche des informations complémentaires pouvant servir pour les sites de e-commerce.
Sur des sites e-commerce, on active HSTS mais on limite également le certificat TLS en version 1.1 minimum, obligatoire depuis Juin 2018 pour rester conforme au standard PCI.
Il ne sera plus possible d'utiliser un ancien navigateur pour commander ou acheter sur le site de e-commerce, comme par exemple avec une vieille version d'internet explorer sous Windows XP.
Activer HSTS facilement et rapidement pour les administrateurs utilisant Cloudflare.
Les sites utilisant les services de Cloudflare peuvent activer HSTS même pour les utilisateurs d'un plan gratuit.
Déploiement
Si j'ajoute " env=HTTPS " à la fin de la ligne, la validation ne fonctionne pas avec un message d'erreur du type : Aucun entête HSTS n'a été trouvé.
Validation HSTS
Valider la vérification de hstspreload : https://hstspreload.org pour enregistrer le site dans la liste pour profiter du préchargement https.

Hsts-preload-status-and-eligibility.png

Success
visionduweb.fr is now pending inclusion in the HSTS preload list!
Please make sure that visionduweb.fr continues to satisfy all preload requirement, or it will be removed. Please revisit this site over the next few weeks to check on the status of your domain.
Also consider scanning for TLS issues using SSL Labs.
Un B est obtenu avec SSL Labs : https://www.ssllabs.com/ssltest/analyze.html?d=visionduweb.fr
Un B+ est obtenu avec Observatory Mozilla : https://observatory.mozilla.org/analyze/visionduweb.fr
Au bout de quelques heures ou de quelques jours, le site sera bien ajouté dans la liste des sites préchargés.

Visionduweb-is-currently-preloaded.png
Configuration du serveur
Redirection pour implémenter HSTS
# Pour implémenter HSTS, la première règle doit permettre de passer de http à https avant de charger le header de la page.
# La redirection vers www intervient après la redirection vers https. Lors de mes essais, je redirige en https, j'ajoute le header pour HSTS et je redirige alors vers www.
# Ne pas activer l'obligation de www pour les utilisateurs de Aesecure. La partie #AESECURE_WITHORNOTWWW_START du code de Aesecure doit être supprimée.
# Désactiver le forçage https dans l'admin Joomla, le serveur correctement configuré se chargera du passage en https.
# Redirection de http vers https.
# Cette règle fonctionne avec Apache 2.4 depuis le VirtualHost à l'écoute du port 80.
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

# Redirection de https non-www vers https www
# Cette règle fonctionne avec Apache 2.4 depuis le VirtualHost à l'écoute du port 443.
<VirtualHost *:443>
# Intégrer le header pour HSTS.
# Rediriger alors vers www.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{SERVER_NAME} !^www\.(.*)$ [NC]
RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
# Ajouter d'autres règles, comme la protection par hotlinking.
</IfModule>
</VirtualHost>
Lors d'un test sur Google PageSpeed, Gtmetrix, ou d'autres outils en ligne d'analyse de la configuration du serveur, le message d'erreur suivant peut être indiqué : 
Éviter les redirections vers les pages de destination / Avoid landing page redirects.

Les sites qui affichent cette alerte ont tort à propos de ces redirections en ce qui concerne SSL et HSTS.
Ses sites traitent les redirections SSL comme toute autres redirections, ce qui n’est pas la bonne approche.
Il est nécessaire de laisser ces redirections en l'état, comme proposé ci-dessus.
Autres propositions de redirection
# Les propositions suivantes peuvent être potentiellement utilisées depuis le fichier .htaccess pour rediriger le site.
# Analyser la configuration du site avec des outils d'analyse SSL pour vérifier si le HSTS est bien pris en compte.
# Tester le site pour vérifier qu'il soit bien fonctionnel.
# ATTENTION ! Les redirection proposées ci-dessous n'ont pas été fonctionnelles avec mon script de protection hotlinking.
# Rediriger vers https.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# Rediriger le domaine visionduweb.fr vers le sous domaine www.visionduweb.fr.
RewriteCond %{HTTP_HOST} ^visionduweb.fr$
RewriteRule ^(.*)   https://www.visionduweb.fr/$1  [R=301,L]
### ### ###
# Vérifier les drapeaux de Apache2.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
RewriteCond %{HTTP_HOST} ^visionduweb.fr  [NC]
RewriteRule ^(.*)   http://www.mondomaine.fr/$1 [L,R=301,NC]
### ### ###
# Ce code a l'avantage de ne pas avoir à modifier le nom de domaine.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
### ### ###
# Rediriger vers https.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
# Rediriger vers www.
RewriteCond %{HTTP_HOST} ^nomdudomaine [NC]
RewriteRule ^(.*)$ https://www.nomdudomaine/$1 [L,R=301,NC]
### ### ###
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Ajouter la configuration HSTS
# Ajouter les lignes suivantes dans son VirtualHost ou dans son fichier .htaccess pour charger l'entête HSTS.
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
# Le code suivant est fonctionnel sur mon VPS avec Debian Stretch et Apache 2.4 et permet de charger HSTS et le site en preload.
# La directive "preload" n'est nécessaire que pour valider l'enregistrement du site dans la liste tenue par Chrome.
# Lors de mes essais, j'ai du retirer la valeur env=HTTPS qui m'empêchait de redémarrer Apache2.
# J'ai également du ajouter la valeur always.
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
</IfModule>
Tester avec hstspreload
Tester la bonne configuration de son site avec https://hstspreload.org
L'outil demande de forcer la redirection de http vers https directement.
Il indiquera un message d'erreur si on redirige directement http vers https://www.
Il faudrait donc mettre en place une règle de redirection de http vers https, et, seulement après, rediriger vers le sous domaine www.
Tester avec ssllabs
Cette étape devrait avoir été validée en même temps que la mise en place du certificat Let's Encrypt et devrait déjà retourner un score A+ :
Obtenir un A+ avec SSLLabs.
Effacer les paramètres HSTS dans Chrome et Firefox
Empêcher la collecte HSTS preload depuis Firefox :
about:config
network.stricttransportsecurity.preloadlist (False)
Effacer le cache HSTS de votre navigateur
Dans Chrome, taper chrome://net-internals/#hsts
Entrer le nom de domaine dans le champ texte de la section "Delete domain security policies"
Cliquer sur le bouton Delete
Entrer le nom de domaine dans le champ texte de la section "Query HSTS"
Cliquer sur le bouton Query
La réponse doit être "Not found" (non trouvé)
Avec Safari, commencer par fermer le navigateur
Effacer le fichier ~/Library/Cookies/HSTS.plist
Rouvrir Safari
Avec Firefox, fermez tous les onglets.
Ouvrir le menu de Firefox et cliquer sur Historique / Afficher l’historique. ( Ou avec un raccourci clavier CTRL MAJ H )
Rechercher la page dont vous voulez supprimer les préférences HSTS
Effectuer un clic droit sur une des entrées lui correspondant
Choisir Oublier ce site.
Ressources complémentaires
Ok.png Activer le HSTS : pourquoi et comment : https://forum.joomla.fr/forum/joomla-3-x/questions--g%C3%A9n%C3%A9rales/1991742-activer-le-hsts-pourquoi-et-comment
Ok-ko.png Redirection https et www dans le bon ordre  : https://forum.joomla.fr/forum/joomla-3-x/questions--g%C3%A9n%C3%A9rales/1991735-redirection-https-et-www-dans-le-bon-ordre
Ko.png HTTP Strict Transport Security Cheat Sheet : https://www.owasp.org/index.php/HTTP_Strict_Transport_Security_Cheat_Sheet
Ko.png Configure HSTS (HTTP Strict Transport Security) for Apache2 and Nginx : https://linux-audit.com/configure-hsts-http-strict-transport-security-apache-nginx/
Ko.png Tour d’horizon sur HTTPS et les en-têtes de sécurité : https://www.alsacreations.com/article/lire/1723-tour-horizon-https-et-en-tetes-de-securite.html
Ko.png Qu’est-ce que le HSTS et comment le met-on en œuvre ? : https://www.globalsign.fr/fr/blog/qu-est-ce-que-le-hsts-comment-le-mettre-en-uvre/
Ko.png Fiabiliser les connexions sécurisées avec HSTS (HTTP Strict Transport Security) : https://blog.dareboost.com/fr/2017/09/hsts-fiabiliser-connexions-securisees/
Ko.png Proposition de htaccess par Cavo789 pour la CSP : https://github.com/cavo789/htaccess#csp---content-security-policy
Ko.png Proposition de htaccess par Cavo789 pour le HSTS : https://github.com/cavo789/htaccess#force-https-and-www-compatible-hstspreload

Sécuriser les Cookies

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"
# Noter que avec HSTS les cookies sont censés passer uniquement par https, mais, les outils de tests de serveurs en ligne demandent cette balise, alors, autant la rajouter.

Content Security Policy

# Activer Mod Headers.
sudo a2enmod headers
Permet la mise en Liste blanche des sources de contenu de confiance pour le site Web.
Les CSP sont à ajouter dans la configuration des VirtualHosts ou depuis un fichier .htaccess.
Placer les CSP dans un fichier .htaccess pour permettre les modifications par les développeurs.
Atténue le risque d'attaques par scripts hébergés sur un autre serveur ou autres injections de contenu.
# Exemple minimaliste d'une règle Content Security Policy.
<IfModule mod_headers.c>
Header set Content-Security-Policy "script-src 'self' https://www.visionduweb.fr"
</IfModule>
Autoriser le code JavaScript en ligne : <script>function myJsFunction()</script> est non recommandé car cela nuit à l’utilisation de CSP.
Utiliser la configuration suivante pour passer outre et tout de même utiliser un tel code : script-src 'self' 'unsafe-inline'
# Le message d'erreur suivant est affiché dans la console du navigateur : Content Security Policy: Les paramètres de la page ont empêché le chargement d’une ressource à inline (« script-src »).
# Avec la CSP précédente, l'administration de Joomla ne fonctionne pas correctement.
# J'adapte la CSP pour permettre à Joomla de fonctionner normalement sans alerte dans la console du navigateur web, en backend et frontend :
<IfModule mod_headers.c>
# Certaines adresses ne sont pas ajoutées comme étant autorisées, comme celle de https://static.doubleclick.net/instream/ad_status.js” appelée lors de la consultation de ma playlist de Youtube.
Header set Access-Control-Allow-Origin: "default-src 'self' https://www.visionduweb.fr"
## La directive frame-ancestror permet de créer une exception pour un domaine et d'ignorer la commande Header always set X-Frame-Options "SAMEORIGIN".
Header set Content-Security-Policy: "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.visionduweb.fr https://www.youtube.com https://unpkg.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.fr https://i.ytimg.com https://secure.gravatar.com https://avatars3.githubusercontent.com; media-src 'self' https://www.visionduweb.fr https://youtu.be; frame-src 'self' https://www.visionduweb.fr https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.fr https://api.github.com; frame-ancestors 'self'"

# Le module correspondant à X-Content-Security-Policy n'est pas chargé.
# X-Content-Security-Policy "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.visionduweb.fr; object-src https://www.visionduweb.fr; style-src https://www.visionduweb.fr; img-src https://www.visionduweb.fr; media-src https://www.visionduweb.fr; frame-src https://www.visionduweb.fr; font-src https://www.visionduweb.fr; connect-src https://www.visionduweb.fr; report-uri https://www.visionduweb.fr"

# Le module correspondant à X-WebKit-CSP n'est pas chargé.
# X-WebKit-CSP "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.visionduweb.fr; object-src https://www.visionduweb.fr; style-src https://www.visionduweb.fr; img-src https://www.visionduweb.fr; media-src https://www.visionduweb.fr; frame-src https://www.visionduweb.fr; font-src https://www.visionduweb.fr; connect-src https://www.visionduweb.fr; report-uri https://www.visionduweb.fr"
</IfModule>
Ok.png Pour faciliter la mise en place des règles CSP, utiliser un générateur d'en-tête CSP en ligne : https://www.cspisawesome.com
Ok.png Pour vérifier les règles CSP, utiliser un validateur d'en-tête CSP en ligne : https://cspvalidator.org
Ok.png Compatibilité des CSP avec les navigateurs : https://developer.mozilla.org/fr/docs/Web/HTTP/CSP
# Redémarrer Apache2 pour appliquer la nouvelle configuration :
sudo apache2ctl restart
Ressources complémentaires
https://ole.michelsen.dk/blog/secure-your-website-with-content-security-policy.html
https://stackoverflow.com/questions/30280370/how-does-content-security-policy-work
https://www.sitepoint.com/improving-web-security-with-the-content-security-policy/
https://www.html5rocks.com/en/tutorials/security/content-security-policy/
https://www.owasp.org/index.php/Content_Security_Policy_Cheat_Sheet
https://content-security-policy.com
Sécuriser les styles et les scripts de son site avec CSP SRI
SubResource Integrity (SRI) apporte une sécurité non négligeable.
Ce n’est pas un hasard si un outil comme Mozilla Observatory recommande son utilisation.
# Générer un hash SRI depuis le terminal pour un fichier spécifique :
openssl dgst -sha384 -binary FILENAME.js | openssl base64 -A
# Générer un hash SRI en PHP pour un fichier spécifique :
echo base64_encode(hash('sha384', $input, true));
# Générer un hash SRI avec d'autres langages pour un fichier spécifique :
Ok-ko.png Générer une somme de contrôle pour les sous ressources : https://tenzer.dk/generating-subresource-integrity-checksums/
# Générateur en ligne de hash SRI
SRI Hash : https://www.srihash.org
Ajouter le lien de la ressource dans le générateur : https://cdn.keycdn.com/css/font-awesome-4.4.0.min.css
Le générateur propose le code à insérer : <link rel="stylesheet" href="https://cdn.keycdn.com/css/font-awesome-4.4.0.min.css" integrity="sha384-MI32KR77SgI9QAPUs+6R7leEOwtop70UsjEtFEezfKnMjXWx15NENsZpfDgq8m8S" crossorigin="anonymous">
On peut définir les types de fichiers qui doivent utiliser l'intégrité des sous-ressources avec la politique de sécurité du contenu, ou CSP. 
Si on souhaite que toutes les feuilles de style soient validées à l'aide de SRI, ajouter la règle suivante dans notre déclaration de CSP :
Content-Security-Policy: require-sri-for style;
Si on souhaite que tous les fichiers JavaScript utilisent l'intégrité SRI, ajouter la règle suivante dans notre déclaration de CSP :
Content-Security-Policy: require-sri-for script;
Combiner cette règle pour le script et le style en une seule règle :
Content-Security-Policy: require-sri-for style script;
# Récapitulatif des lignes, non obligatoires, une seule ligne est à ajouter dans sa politique de sécurité de contenu, CSP :
Content-Security-Policy: require-sri-for style;
Content-Security-Policy: require-sri-for script;
Content-Security-Policy: require-sri-for style script;
Toute feuille de style ou élément de script sans intégrité SRI ne sera pas chargé.
L'avenir de SRI :
Une prochaine révision de cette spécification est susceptible d’inclure le support du contrôle d’intégrité pour toutes les sous-ressources possibles.
C’est-à-dire, pour les éléments a, audio, embed, iframe, img, link, object, script, source, track, et video.
Ok-ko.png Source : https://www.w3.org/TR/SRI/#verification-of-html-document-subresources

Politique de provenance

A new security header: Referrer Policy : https://scotthelme.co.uk/a-new-security-header-referrer-policy/

Politique des fonctionnalités

A new security header: Feature Policy : https://scotthelme.co.uk/a-new-security-header-feature-policy/
Introduction to Feature Policy : https://developers.google.com/web/updates/2018/06/feature-policy
# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

Protéger contre les attaques utilisant X-XSS X-Frame X-Content

<IfModule mod_headers.c>
# Protéger contre les attaques utilisant X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
# Le mieux serait même de refuser totalement les frames avec "DENY".
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff
</IfModule>

Ne pas envoyer l'entête en cas de passage de https vers http

<IfModule mod_headers.c>
# Le navigateur n'enverra pas l'en-tête du référent lors de la navigation de HTTPS vers HTTP.
Header always set Referrer-Policy 'no-referrer-when-downgrade'
</IfModule>

Contrôle du cache

# HTTP 1.1 a introduit la classe d'en-têtes de réponse Cache-Control pour donner plus de contrôle aux éditeurs Web sur leur contenu et pour répondre aux limitations de l'en-tête Expires.
# On détermine la durée du cache pour différents types de fichiers, pour une longue durée.
# Les fichiers dynamiques comme php ou cgi sont rarement mis en cache.
# Cache-Control et en-tête Expires sont complémentaires. 

<IfModule mod_headers.c>
# Contrôle du cache navigateur.
# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
# Désactiver le cache pour les scripts et fichiers dynamiques.
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
# Mettre en cache les éléments suivants.
<filesmatch "\.(gif|ico|jpe?g|png)$">
# Mise en cache de une année.
Header set Cache-Control "max-age=33566400, public"
</filesmatch>
<filesmatch "\.(html|htm|css)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, public"
</filesmatch>
<filesmatch "\.(js)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, private"
</filesmatch>
<filesmatch "\.(gz|pdf|ttf)$">
# Mise en cache de une année. (Je n'ai pas le type gz présent dans les entêtes Expires.)
Header set Cache-Control "max-age=33566400, public"
</filesmatch>
<filesmatch "\.(flv|swf)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=33566400, public"
</filesmatch>

# Économiser les requêtes de cookies.
# Ouvrir des connexions http coûte du temps, et il n'est pas toujours efficace d'ouvrir davantage de connexions.
# Réduire le nombre de ressources est bien plus efficace que d’empiler de nombreuses connexions HTTP ouvertes.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|js|pl|cgi|spl|scgi|fcgi)$">
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>
# Les en-têtes de réponse Cache-Control :
max-age=[secondes] - Indique la quantité de temps maximale où la représentation sera considérée fraîche. Similaire à Expires, cette directive est relative à l'heure de la requête au lieu d'être absolue.
s-maxage=[secondes] - Similaire à max-age, mais ne s'applique qu'aux caches partagés (Par exemple, un mandataire.).
public - Marque les réponses authentifiées comme cachables. Normalement, si une authentification HTTP est demandée, les réponses sont automatiquement non cachables.
no-cache - Force à chaque fois les caches à soumettre la requête au serveur original pour validation avant libération d'une copie cachée. Utile pour s'assurer du respect de l'authentification en combinaison avec public, ou pour maintenir une fraîcheur rigide, sans sacrifier les bénéfices de la mise en cache.
no-store - Les caches ne doivent pas garder de copie de la représentation dans toutes les conditions.
must-revalidate - HTTP permet aux caches de servir des représentations périmées sous certaines conditions. En indiquant cette en-tête, vous dites au cache que vous voulez un respect strict de vos règles.
proxy-revalidate - Similaire à must-revalidate sauf qu'elle ne s'applique qu'aux caches de mandataires.
private - Indique que les proxys n’ont pas l’autorisation de mettre en cache.
Forcer le header pour PHP afin de désactiver le cache
# Précédemment le cache pour les scripts et fichiers dynamiques a été désactivé.
# Il est possible de forcer la désactivation du cache depuis le header des fichiers PHP.
<FilesMatch "\.php$">
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Sat, 2 Aug 1980 15:15:00 GMT"
ExpiresActive On
ExpiresDefault "access plus 0 seconds"
</FilesMatch>

Les proxies doivent donner le bon contenu

# Les proxies doivent donner le bon contenu (?)
Ajouter au Virtual Host des domaines. ( Relire les options des Header et l'ordre d'implémentation. )
Todo.png
Header append Vary User-Agent env=!dont-vary

Désactiver Etag

# Un Etag permet de faire la différence entre deux versions d’un fichier.
# Il est transmis entre le serveur et le client lors des requêtes HTTP.
# Si le fichier est identique, le navigateur utilisera son cache.
# A chaque requête, les informations sont transmises inutilement.
# Le cache serveur doit être configuré avec d'autres commandes.
# Réduire le nombre de requêtes et la bande passante utilisée.
# Note complémentaire :
# Sur les serveurs Apache, l’identifiant est basé sur la date de dernière modification.
# Si le site est géré par un cluster de plusieurs serveurs. on aura parfois un identifiant différent à cause du Etag, même si le fichier n’a jamais été modifié.
# Désactiver Etag.
FileETag none

Module Apache2 mod_log_config

Ce module apporte de la souplesse dans la journalisation des requêtes des clients.
Les journaux sont écrits sous un format personnalisable et peuvent être enregistrés directement dans un fichier ou redirigés vers un programme externe.
La journalisation conditionnelle est supportée, si bien que des requêtes individuelles peuvent être incluses ou exclues des journaux en fonction de leur caractéristiques.
Ko.png Source complémentaire : https://httpd.apache.org/docs/trunk/fr/mod/mod_log_config.html
Ko.png Source complémentaire : http://httpd.apache.org/docs/trunk/fr/mod/mod_log_config.html#formats

Module Apache2 mod_log_debug

Possibilité de journalisation supplémentaire à des fins de débogage.
Ko.png Source : https://httpd.apache.org/docs/trunk/fr/mod/mod_log_debug.html

Module Apache2 mod_log_forensic

Le module mod_log_forensic permet la journalisation à des fins d'investigation judiciaire des requêtes des clients.
La journalisation est effectuée avant et après le traitement de la requête. Ajoute deux entrées dans le journal.
Le générateur de journaux d'investigation est très strict et ne permet aucune personnalisation.
C'est un inestimable outil de débogage et de sécurité.
Ko.png Source : https://httpd.apache.org/docs/trunk/fr/mod/mod_log_forensic.html

Module Apache2 mod_logio

Ce module permet d'enregistrer le nombre d'octets reçus et envoyés pour chaque requête.
Ce nombre reflète le nombre réel d'octets transmis sur le réseau, et prend en compte les en-têtes et corps des requêtes et des réponses.
Le décompte est effectué avant SSL/TLS en entrée et après SSL/TLS en sortie, si bien que le résultat reflètera toute modification introduite par le chiffrement.
Pour fonctionner, ce module requiert le chargement du module mod_log_config.
Ko.png Source : https://httpd.apache.org/docs/trunk/fr/mod/mod_logio.html

Module Apache2 mod_cgi

Tout fichier pris en compte par le gestionnaire cgi-script sera traité en tant que script CGI et exécuté par le serveur, sa sortie étant renvoyée au client.
Ko.png Source : https://httpd.apache.org/docs/trunk/fr/mod/mod_cgi.html

Module Apache2 libapache2-mod-passenger

# Installer Mod Passenger.
sudo apt install libapache2-mod-passenger
# Activer Mod Passenger.
a2enmod passenger
# Désactiver Mod Passenger.
a2dismod passenger
# Désinstaller Mod Passenger et sa configuration.
sudo apt-get autoremove --purge libapache2-mod-passenger

Module Apache2 proxy et proxy_http

# Activer Mod Proxy et Proxy HTTP.
sudo a2enmod proxy proxy_http
<VirtualHost *:80>
ServerAdmin mail@visionduweb.com
ServerName streaming.domaine.tld
ProxyPass / http://localhost:8000/
ProxyPassReverse / http://localhost:8000/
ProxyPreserveHost On
ProxyRequests off
</VirtualHost>
Cette exemple permet de rediriger le trafic du port 80 vers le port 8000.

Module Apache2 proxy_fcgi

SCRIPT_FILENAME proxy:fcgi://localhost/srv/www/index.php
Whereas Apache 2.4.25 sets:
SCRIPT_FILENAME /srv/www/index.php
Apache documentation of mod_proxy_fcgi mentions a directive ProxyFCGIBackendType available since Apache 2.4.26 (not released yet as of 2017-05-02), which defaults to "FPM". There is a following note in the description:
One example of values that change based on the setting of this directive is SCRIPT_FILENAME. When using mod_proxy_fcgi historically, SCRIPT_FILENAME was prefixed with the string "proxy:fcgi://". This variable is what some generic FastCGI applications would read as their script input, but PHP-FPM would strip the prefix then remember it was talking to Apache. In 2.4.21 through 2.4.25, this prefix was automatically stripped by the server, breaking the ability of PHP-FPM to detect and interoperate with Apache in some scenarios.

Module Apache2 mod_rewrite

# Activer Mod Rewrite.
sudo a2enmod rewrite

URL Rewriting

Mod Rewrite permet d'utiliser la réécriture d'adresses URL (URL Rewriting).
# Rediriger un domaine http sans www vers un domaine http avec www.
# Rediriger par exemple http://visionduweb.fr vers http://www.visionduweb.fr
# Cette règle est de moins en moins présente avec le déploiement de https et de HSTS.
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}$1 [R=301,L]
Autres exemples : https://craym.eu/tutoriels/referencement/url_rewriting.html
Autres exemples : https://www.askapache.com/htaccess/modrewrite-tips-tricks/

mod_security - Un pare-feu applicatif

Mod_security est un pare-feu applicatif, un WAF (Web Application Firewall.) qui agit sur la couche 7 du modèle OSI, la couche application. 
La plupart des Pare-feu travaillent sur la couche 3 et agissent au niveau des ports, port 22 pour SSH, port 80 pour le Web...
Il filtre et modifie la réponse renvoyées par le serveur web comme par exemple les erreurs 404 ou 500.
Il surveille le trafic HTTP en temps réel et protège les applications web des attaques Brute force.
Il sert également d'IDS/IPS pour les applications web.
# Configurer modsecurity, voir par la suite pour la configuration sous Debian Stretch :
cd /etc/modsecurity/
sudo nano modsecurity.conf
Le module Apache2 mod_security peut utiliser les règles très strictes de Open Web Application Security Project (OWASP) Core Rules Set (CRS).
Consulter le site officiel : https://www.modsecurity.org (Le site officiel semble avoir des liens obsolètes sur des documentations de 2007.)
Consulter le dépôt Github : https://github.com/SpiderLabs/ModSecurity/wiki#SecStatusEngine

Installer mod-security sur Debian Stretch depuis les dépôts officiels de ModSecurity

https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)#Installation_for_Apache

Installer mod-security sur Debian Stretch

# Installer le module mod_security :
sudo apt install libapache2-mod-security2
Les paquets supplémentaires suivants seront installés : 
 liblua5.1-0 libyajl2
Paquets recommandés :
 modsecurity-crs
Les NOUVEAUX paquets suivants seront installés :
 libapache2-mod-security2 liblua5.1-0 libyajl2
# Vérifier que mod_security soit bien chargé par Apache2 :
sudo apachectl -M | grep --color sec
# Le module a été chargé :
# security2_module (shared)
# Sinon, activer Mod Security :
# sudo a2enmod mod-security
Ou plutôt :
sudo a2enmod security2_module
# L'installation comprend un fichier de configuration recommandé qui doit être renommé avec la commande suivante :
sudo cp /etc/modsecurity/modsecurity.conf{-recommended,}
# Redémarrer Apache :
sudo systemctl restart apache2

Configurer mod-security2

# Éditer le fichier de configuration :
sudo nano /etc/modsecurity/modsecurity.conf
# Remplacer :
SecRuleEngine DetectionOnly
# Par :
SecRuleEngine On
# SecResponseBodyAccess autorise ModSecurity a observer et mettre en mémoire tampon les corps de réponse.
# Cela n'est nécessaire que si une détection et une protection contre les fuites de données sont requises.
# Si activé, les ressources des serveurs seront utilisées et la taille du fichier journal augmentera également.
# La plupart des déploiements souhaitent se concentrer sur les menaces entrantes, ce qui réduit la consommation de mémoire.
# Remplacer :
SecResponseBodyAccess On
# Par :
SecResponseBodyAccess Off
# Limiter le maximum de données pouvant être publiées sur votre application Web.
# Si vous prenez en charge les téléchargements de fichiers, la valeur indiquée sur la première ligne doit être aussi grande que le fichier le plus volumineux que vous êtes prêt à accepter.
# La deuxième valeur fait référence à la taille des données, fichiers exclus. Vous voulez garder cette valeur aussi basse que possible.
# Si quelque chose de plus gros est envoyé par un client, le serveur répondra par une erreur "413 Request Entity Too Large".
SecRequestBodyLimit 13107200
SecRequestBodyNoFilesLimit 131072
On peut également utiliser des règles ModSecurity gratuites fournies par les sociétés de cybersécurité :
https://waf.comodo.com
https://www.atomicorp.com
https://www.owasp.org/index.php/Main_Page

Vérifier les logs de ModSecurity

cat /var/log/apache2/error.log | grep ModSecurity
# J'ai ce warning qui est renvoyé :
[Mon Jul 29 00:51:18.336161 2019] [:warn] [pid 2157] ModSecurity: Loaded APR do not match with compiled!
Cela signifie que la version de ModSecurity a été compilée avec une version donnée d'Apache Runtime (APR), mais qu'elle s'exécute maintenant avec une version différente d'APR.
Recompiler ModSecurity ou modifier la version d'APR (Cela peut être plus difficile à faire).
ModSecurity peut toujours fonctionner avec cette incohérence, mais vous pouvez être confronté à des problèmes de stabilité ou à des plantages.
Une issue est ouverte : https://github.com/SpiderLabs/ModSecurity/issues/2139

Utiliser ModSecurity pour un développement en local

ModSecurity est un excellent module et une protection fiable.
Il peut être un peu extrême de l'utiliser lors d'un développement en local.
Le comportement de PHPmyAdmin peut être altéré, certains scripts retournerons une erreur car jugés dangereux.
Il est possible de contourner ce problème pour les étapes de développement.
Ajouter la règle suivante dans les options du virtualHost ou dans un fichier .htaccess pour désactiver mod-security :
SecRuleEngine Off
Rétablir la sécurité une fois le développement terminé.

Ressources complémentaires

Ok.png Source : https://www.hugeserver.com/kb/install-modsecurity-centos-debian-ubuntu/
Ok-ko.png Source : https://www.skyminds.net/serveur-dedie-securiser-apache-2-avec-mod-security/
Ok-ko.png Source : https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_security-with-apache-on-debian-ubuntu
Ok-ko.png Source : https://phoenixnap.com/kb/setup-configure-modsecurity-on-apache
Ok-ko.png Source : https://www.it-connect.fr/installation-de-mod_security-devant-un-serveur-web-apache/#III_Installation_de_mod_security
Ok-ko.png Source : https://devops.profitbricks.com/tutorials/how-to-configure-modsecurity-and-mod_evasive-for-apache-on-centos-7/
Ok-ko.png Source : https://samhobbs.co.uk/2016/03/getting-started-apache-modsecurity-debian-and-ubuntu
Ok-ko.png Source : https://www.linode.com/docs/web-servers/apache-tips-and-tricks/configure-modsecurity-on-apache/
Ok-ko.png How to Configure ModSecurity and mod_evasive for Apache2 on CentOS 7 : https://devops.profitbricks.com/tutorials/how-to-configure-modsecurity-and-mod_evasive-for-apache-on-centos-7/

Module Apache2 mod_ssl

# Activer Mod SSL.
a2enmod ssl

Désactiver des modules

# Désactiver un module.
a2dismod nom_du_module
# Redémarrer Apache2 pour prendre en compte la désactivation d'un module.
sudo systemctl restart apache2

VirtualHost

Créer un VirtualHost

Sites disponibles et sites activés

# Deux répertoires sont a utiliser par défaut pour ajouter un ou plusieurs VirtualHosts : /etc/apache2/sites-available/ et /etc/apache2/sites-enabled/.
# Connaître la configuration actuelle des VirtualHosts existants :
sudo apachectl -S
sudo apache2ctl -S

Consulter les sites - sites-available

# Le répertoire /etc/apache2/sites-available/ contient les fichiers qui indiquent chaque site hébergé par Apache2.
cd /etc/apache2/sites-available/
# Ajouter un fichier dans votre répertoire sites-available pour chaque site web a héberger virtuellement.
# Il n'y a pas de limite au nombre de sites web que vous pouvez héberger virtuellement avec Apache.
# Il est recommandé de donner au fichier le même nom que le nom de domaine utilisé.
# Dans ce même répertoire se trouve un fichier de VirtualHost activé par défaut appelé "default" ou "000-default.conf".
# Utiliser le fichier par défaut comme modèle pour les nouveaux VirtualHosts en le copiant avec un nouveau nom de site.
# Ajouter un VirtualHost pour le site visionduweb.fr :
cp 000-default.conf visionduweb.fr.conf
# Les droits appliqués par défaut :
sudo chown root:root visionduweb.fr.conf
sudo chmod 644 visionduweb.fr.conf
# Éditer le fichier VirtualHost du site visionduweb.fr :
sudo nano visionduweb.fr.conf
# Utiliser l'exemple ci-dessous pour renseigner le fichier VirtualHost.
# Activer alors le site, ci-après.
Accéder au site depuis le navigateur
# La configuration par défaut rend le serveur Apache2 fonctionnel depuis l'arborescence /var/www ou /var/www/html en fonction du serveur et de sa version.
# Le site contenu dans /var/www ou /var/www/html sera accessible depuis l'adresse locale suivante depuis un navigateur : http://127.0.0.1/index.html et http://localhost/index.html
# Si le navigateur est sur une autre machine que le serveur, il faut saisir le hostname ou l'adresse IP du serveur à la place de 127.0.0.1 ou de localhost.
Remarques
# L'alias "localhost" est résolu grâce au fichier /etc/hosts.
# Si on appel http://localhost ou http://127.0.0.1, le serveur Apache2 va chercher si le fichier index.php existe, sinon il va chercher le fichier index.html.
# Définir le fichier à appeler par défaut avec la directive : DirectoryIndex index.php index.html
# Préciser le port si votre serveur Apache2 écoute sur un port autre que le port par défaut que 80 pour http et 443 pour https.
# Par exemple, s'il écoute sur le port 8888 en http, saisir l'adresse http://127.0.0.1:8888
Exemple de fichier VirtualHost
# La directive DocumentRoot est utilisée pour définir le répertoire des pages web du site sur le serveur.
# N'importe quel répertoire peut être utilisé, si il existe sur le serveur.
<VirtualHost *(TOUT_LE_RESEAU)|IP_DU_SERVEUR|NOM_DE_DOMAINE:80>
ServerName visionduweb.fr
ServerAlias www.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/visionduweb.fr
# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# La première règle évaluée par Apache2 consiste à limiter l'accès à toute l'arborescence du système Linux (/).
<Directory />
Options None
AllowOverride None
Require all denied
</Directory>

# Ensuite, on relâche un minimum de possibilités en fonction des besoins du site.
<Directory /var/www/visionduweb.fr>
# Empêcher le suivi des liens symboliques.
Options -FollowSymLinks
# Protéger l'accès aux répertoires.
Options -Indexes
# Désactiver Inclusions Côté Serveur - Server Side Includes - SSI.
Options -Includes
# Autorise la prise en compte du fichier .htaccess depuis le site.
AllowOverride All
# Définir le fichier à appeler par défaut.
DirectoryIndex index.php index.html

## Contrôle d'accès Apache 2.2 :
# Toutes les requêtes sont autorisées.
# Fonctionne aussi sur Apache 2.4.
# Order allow,deny
# allow from all
## Contrôle d'accès Apache 2.4 :
# Toutes les requêtes sont autorisées.
# Fonctionne depuis que j'ai renseigné DirectoryIndex.
Require all granted
# Require par IP permet uniquement l'accès au site depuis l'adresse IP fournie.
# Require ip xx.xx.xx.xx
</Directory>

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</files>

# Limitations contre les DoS.
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden.html>
Require all granted
</Files>
# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php
</VirtualHost>

Activer un site - sites-enabled

# Activer ou désactiver un site sous Apache2.
# Activer un site en créant un lien symbolique du dossier sites-available vers le dossier sites-enabled :
# On utilisera les commandes :
a2ensite : (Apache2 enable site.) : Active un site.
a2dissite : (Apache2 disable site.) : Désactive un site.
# Activer un site présent dans le dossier sites-available :
a2ensite NomDeMonSite
# Lister les sites activables :
ls /etc/apache2/sites-available/
# Lister les site activés :
ls /etc/apache2/sites-enabled/
# Désactiver un site va supprimer le lien symbolique présent dans le dossier sites-enabled :
a2dissite NomDeMonSite
# Redémarrer Apache2 pour appliquer les modifications.
sudo apache2ctl restart

Protéger un répertoire avec le contrôle d'accès

Mélanger d'anciennes directives pour Apache 2.2 et de nouvelles directives pour Apache 2.4 produit des résultats inattendus.
Les directives de mod_access_compat sont prioritaires par rapport à celles de mod_authz_host.
Cela signifie que les nouvelles configurations pour Apache 2.4 sont prioritaires.

Require all denied - Il n'y a pas d'authentification et toutes les requêtes sont rejetées

# Apache version 2.2 :
Order deny,allow
Deny from all
# Ajouter une exception :
Allow from xx.xx.xx.xx
# Apache version 2.4 :
Require all denied
# Ajouter un exception :
Require ip xx.xx.xxxx.xx

Require all granted - Il n'y a pas d'authentification et toutes les requêtes sont acceptées

# Apache version 2.2 :
Order allow,deny
Allow from all
# Apache version 2.4 :
# Lors de mes essais, Require all granted ne fonctionne que si DirectoryIndex est renseigné.
# DirectoryIndex index.php index.html
Require all granted

Require ip - Les adresses IP ont l'autorisation d'accès, toutes les autres sont rejetés

# Apache version 2.4 :
# Permet uniquement l'accès au site depuis l'adresse IP fournie.
Require ip xx.xx.xx.xx
# Interdire une adresse IP spécifique :
Require not ip xx.xx.xx.xx

Require host - Les hôtes du domaine ont l'autorisation d'accès, tous les autres sont rejetés

Les hôtes dont les noms correspondent ou se terminent par la chaîne spécifiée se voient accorder l'accès.
Très utile avec une adresse IP fixe et un DNS correctement configuré afin que les recherches inverses et directes renvoient une réponse valide.
L’authentification échouera pour les utilisateurs avec une adresse IP dynamique, une recherche inversée sur l’adresse IP retournera un résultat pointant sur votre fournisseur d’accès.
On me conseil d'installer un serveur DNS avec recherche direct et inverse.
Apache va effectuer une double recherche DNS sur l'adresse IP du client, sans tenir compte de la définition de la directive HostnameLookups.
D'abord Apache va effectuer une recherche DNS inverse sur l'adresse IP pour trouver le nom d'hôte associé.
Ensuite Apache va effectuer une recherche DNS directe sur le nom d'hôte pour vérifier qu'il correspond bien à l'adresse IP originale.
L'accès ne sera accordé que si le nom d'hôte correspond et si les recherches DNS inverse et directe sont cohérentes.
# Apache version 2.2 :
Order Deny,Allow
Deny from all
Allow from example.org
# Apache version 2.4 :
Require host example.org
# Interdire un domaine :
Require not host example.org
# Voici un exemple où l'authentification d'hôte fonctionnerait immédiatement :
$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.
$ host google-public-dns-a.google.com
google-public-dns-a.google.com has address 8.8.8.8
### "Je cherche à savoir si le hostname d'une machine locale, qui n'est pas dans un domaine, peut être utilisé pour l'autorisation d'accès".
La commande suivante me retourne les informations nécessaires au paramétrage.
host ipbox
Ouvrir le port 53 pour le reverse DNS.
Configurer la box pour renvoyer le trafic vers mon ip fixe de machine.
La configuration Require host avec la valeur host ipbox devrait alors permettre l'accès au site uniquement depuis la machine.
### Pour le moment je n'ai pas pu tester cette directive Require host.
### J'aurais préféré trouver une solution qui ne nécessite pas la configuration de la box.
Une solution serait d'utiliser un service comme DynDNS.
Voir les articles proposés dans la bibliographie : Contrôles d'accès.

Require forward-dns - Les adresses IP correspondant à host-name ont l'autorisation d'accès, toutes les autres sont rejetés

Le fournisseur forward-dns permet d'accéder au serveur sécurisé en fonction de simples noms d'hôte.
Lorsque Require forward-dns host-name est spécifié, toute adresse IP correspondant à host-name se voit autoriser l'accès.
A la différence du fournisseur host, ce fournisseur n'effectue pas de recherche DNS inverse.
Comme le DNS inverse n'est pas sollicité, il fonctionnera avec des clients qui utilisent un service de DNS dynamique.
Il effectue simplement une requête DNS directe pour le nom d'hôte spécifié et donne accès au client si son adresse IP correspond.
Il ne fonctionnera donc qu'avec des noms d'hôte, et non pas avec des noms de domaine.
# Apache version 2.4 :
# Permet uniquement l'accès au site pour toutes adresses IP correspondantes à host-name.
Require forward-dns host-name
Exemple :
Require forward-dns
Commande à laquelle j'ajoute la valeur retournée par la commande : host ipbox
Cela me permet l'accès à mon site, depuis ma machine uniquement, ou peut être plutôt à l'ensemble des utilisateurs de ma box (?).

Require local - Les adresses locales ont l'autorisation d'accès, toutes les autres sont rejetés

Le fournisseur local autorise l'accès au serveur si l'une au moins de ces conditions est satisfaite :
L'adresse IP du client correspond à 127.0.0.0/8
L'adresse IP du client est ::1
Les adresses IP du client et du serveur sont identiques
# Apache version 2.4 :
Require local

Options de configuration des fichiers VirtualHost

Optimiser et sécuriser certaines actions à l'aide des options de configuration des fichiers VirtualHosts.
Le fichier .htaccess peut également être utilisé pour optimiser et sécuriser la configuration de Apache2.
# Empêcher le listage des répertoires.
Options -Indexes
# Ne pas suivre les liens symboliques.
Options -FollowSymLinks
# Vues multiples ("multiviews") à contenu négocié à l'aide du module mod_negotiation.
# http://httpd.apache.org/docs/2.4/content-negotiation.html
# Empêcher l'accès à une page avec sonNom.php ou sonNom.
Options -MultiViews
# Combiner plusieurs options.
Options -Indexes -FollowSymLinks -MultiViews
Ok-ko.png Exemples depuis la documentation : http://httpd.apache.org/docs/2.2/fr/vhosts/examples.html

VirtualHosts des domaines enregistrés

Les VirtualHosts des domaines enregistrés.

Le fichier de configuration htaccess

Fichier .htaccess vs fichier VirtualHost

Il est plus rapide de passer par le VirtualHost que de passer par l’appel du fichier .htaccess.
Le fichier .htaccess sert aux développeurs qui n'ont pas accès aux configurations du serveur.

Autoriser la prise en compte du fichier htaccess

# Dans le fichier de configuration du VirtualHost du site, ajouter les lignes suivantes pour autoriser la prise en compte du fichier .htaccess.
<Directory /var/www/DossierDuSite>
# Activer le suivi des liens symboliques avec FollowSymLinks.
Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess.
AllowOverride All
</Directory>

Sécurité

Changer les droits du fichier .htaccess

# Pour éviter les attaques contre le fichier .htaccess il est préférable de changer les droits du fichier par 440 ou 444.
sudo chmod 440 .htaccess
sudo chmod 444 .htaccess

Empêcher les attaques par include de fichier externe

# Si le Module Rewrite est installé et activé :
RewriteEngine On
RewriteCond %{QUERY_STRING} =//
RewriteRule .* - [F,L]

Bloquer l'accès au site pour libwww-perl

# Si le Module Rewrite est installé et activé :
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} libwww [NC]
RewriteRule .* - [F,L]

Interdire l'utilisation de la méthode TRACE

# Si le Module Rewrite est installé et activé :
# Avant l'intégration de cette option dans la configuration d'Apache, on utilisait une réécriture depuis le fichier .htaccess.
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]

Désactiver les informations X-Powered-By

cd /etc/apache2/conf-available
sudo nano security.conf
Header always unset "X-Powered-By"
Header unset X-Powered-By
# X-Powered-By peut être désactivé depuis la configuration de PHP :
Désactiver X-Powered-By directement depuis la configuration de PHP.

Protection contre les attaques se servant de Register Global On

SetEnv REGISTER_GLOBALS 0

Astuces

Vérification de la provenance avec HTTP_REFERER

La vérification de la provenance est un mécanisme pouvant être utilisé pour restreindre l'utilisation des ressources Web.
# La première ligne active la réécriture.
# La seconde vérifie si l'en-tête «REFERER» ne commence pas par «https://www.visionduweb.fr/». Dans certains cas, le même code peut être appliqué à plusieurs domaines.
# La troisième ligne spécifie alors que l'accès aux fichiers “.pdf” est interdit.
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://www.visionduweb.fr/.*
RewriteRule .*\.pdf - [NC,F]
# Cette règle vérifie si le nom d'hôte dans le champ HTTP_REFERER est exactement le même que le nom d'hôte dans HTTP_HOST.
# Si ce n'est pas le cas, la dernière ligne indique à Apache de bloquer un type ou un nom de fichier spécifique.
# Ce code peut-être utilisé simplement par copié collé sans rien avoir à modifier dans la source.
# La chaîne de gauche rendrait par exemple visionduweb.fr@@http://visionduweb.fr/outils
# La règle de validation, ^([^@]*) signifie tout se souvenir avant le premier signe @.
# Ensuite, on ignore le @@http://, ou éventuellement le @@https://.
# S'assurer que le prochain bit correspond au nom d’hôte mémorisé.
# S'assurer que le nom d'hôte est suivi d'un slash.
RewriteEngine On
RewriteCond %{HTTP_HOST}@@%{HTTP_REFERER} !^([^@]*)@@https?://\1/.*
RewriteRule .*\.pdf [NC,F]

Rediriger http vers https avec www

Méthode RedirectMatch

RedirectMatch permanent ^(.*)$ https://www.visionduweb.fr$1
( Avec cette méthode, je n'arrive pas à faire fonctionner le hotlinking. )

Méthode RewriteRule pour Apache 2.4

# Redirection http://(www).domaine.ext vers https://www pour Apache 2.4
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.visionduweb.fr%{REQUEST_URI} [NE,L,R]
</IfModule>
( Avec cette méthode, je n'arrive pas à faire fonctionner le hotlinking. )

Méthode RewriteRule

# Il est toujours "correct" (et plus efficace) de disposer d'une seule redirection www et HTTPS. Elles ne doivent être séparées que lors de l'implémentation de HSTS.
# Sans HSTS (Simple redirection) :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
</IfModule>
# Pour HSTS (Double redirection) :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
</IfModule>
# Ses conditions sont implicitement AND et la deuxième condition sera toujours vraie (sauf si vous avez d'autres domaines), de sorte que les règles actuelles ne redirigeront que le trafic non SSL.
# Si SERVER_PORT n'est pas 443 (c'est-à-dire qu'il ne s'agit pas de HTTPS) ou que l'hôte ne commence pas par www. (c'est-à-dire que vous accédez au domaine nu), la redirection renvoie vers l'URL canonique.
# Toutefois, le fait que cela redirige https://example.com vers https://www.example.com dépendra de votre certificat de sécurité : le site doit être accessible à la fois sur www et sur www sur SSL.
# Utiliser alors la règle optimisée suivante.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443 [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.visionduweb.fr/$1 [R=301,L,NE]
</IfModule>
( Avec cette méthode, je n'arrive pas à faire fonctionner le hotlinking. )

Méthode RewriteRule sur le port 80 et 443

# ----------port 80----------
RewriteEngine on
# redirect http non-www to https www
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

# redirect http www to https www
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_NAME} =www.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

# ----------port 443----------
RewriteEngine on
# redirect https non-www to https www
RewriteCond %{SERVER_NAME} !^www\.(.*)$ [NC]
RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
( Avec cette méthode, j'arrive à faire fonctionner le hotlinking ! )

Interdire le Hotlinking

Explication

Les contenus mis à disposition du public devraient toujours être hébergés directement sur nos propres serveurs.
Si l'hébergeur limite la consommation de bande passante, le site victime de Hotlinking risque de devenir inaccessible.
La pratique consistant à utiliser la bande passante d'un autre site qui ne nous appartient pas et sans son approbation est considérée comme du Hotlinking.
Cette méthode illégale peut également entraîner un surcoût financier pour les sites qui sont facturés en fonction de la consommation de leur bande passante.
Interdire le Hotlinking permet donc d'économiser de la bande passante.
Les visiteurs devront impérativement passer par notre site pour visiter le contenu mis à disposition.
Le contenu est protégé d'une mise à disposition par un service tiers qui proposerait le contenu directement depuis notre serveur.
L'utilisation directe d'images, de vidéos, de fichiers sons, de feuilles de styles, de fichiers pdf, de fichiers zip ne sera plus possible depuis un autre site.

Vérifier si les images de son site sont victimes de Hotlinking

Tester si les images de son site sont utilisées via un autre serveur.
Google Images permet de tester les images indexées de son site à l'aide de la recherche suivante :
-site:visionduweb.eu inurl:visionduweb.eu

Exemples de codes Anti Hotlinking

Anti Hotlinking avec FilesMatch et ErrorDocument
SetEnvIfNoCase Referer "^https://www.visionduweb.fr/" good
SetEnvIfNoCase Referer "^$" good
<FilesMatch "\.(png|jpg|jpeg|gif|bmp|swf|flv)$">
# Contrôle d'accès Apache version 2.2 :
# Toutes les requêtes sont refusées.
Order Deny,Allow
Deny from all
Allow from env=good
ErrorDocument 403 https://www.visionduweb.fr/images/structure/no-hotlinking.png
</FilesMatch>
Anti Hotlinking avec RewriteCond
Interdire l'affichage de certains fichiers sur les sites non autorisés
# Configuration minimaliste.
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.visionduweb.fr" [NC]
RewriteRule "\.(gif|jpg|png)$"    "-" [F,NC]
# Configuration avancée.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https://[-_a-z0-9.]*visionduweb\.fr$ [NC] 
RewriteCond %{HTTP_REFERER} !^https://[-_a-z0-9.]*visionduweb\.fr/.*$ [NC] 
RewriteCond %{HTTP_REFERER} !visionduweb\.eu [NC]
RewriteCond %{HTTP_REFERER} !visionduweb\.info [NC]
RewriteCond %{HTTP_REFERER} !^https?://.*(translate|paypal|google|bing|yahoo|yandex|baidu|facebook|qwant|duck|ixquick|pinterest|twitter).*$ [NC]
RewriteRule .*\.(gif|jpe?g?|jp2|png|svgz?|css|pdf|zip|gz|js|mp3|m4a|mp4|mov|divx|avi|wma?v?|wmp|swf|flv|docx?|xlsx?|pptx?|vbs|rtf|asf?x?|odt|ods|odp|odg|odb)$ - [F,NC]
Interdire l'affichage de certains fichiers sur les sites non autorisés et afficher une image à la place
# Configuration minimaliste.
RewriteCond %{HTTP_REFERER} !^https://(.+\.)?visionduweb\.fr/ [NC]
# Dans le cas d'un entête réécrit, une URL de provenance vide sera autorisée.
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ https://www.visionduweb.fr/images/structure/no-hotlinking.png [L]
# Configuration avancée.
RewriteEngine on
# Divers formats de fichiers présents sur votre site seront protégés.
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*jpeg$|.*gif$|.*png$ [NC]
# Les sites suivants sont autorisés à afficher les images.
# Dans le cas d'un entête réécrit, une URL de provenance vide sera autorisée.
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !visionduweb\.com[NC]
RewriteCond %{HTTP_REFERER} !visionduweb\.eu [NC]
RewriteCond %{HTTP_REFERER} !visionduweb\.fr [NC]
RewriteCond %{HTTP_REFERER} !visionduweb\.info [NC]
RewriteCond %{HTTP_REFERER} !^https?://.*(translate|paypal|google|bing|yahoo|yandex|baidu|facebook|qwant|duck|ixquick|pinterest|twitter).*$ [NC]
# Rediriger les images interdites vers une image de substitution.
RewriteRule (.*) https://www.visionduweb.fr/images/structure/no-hotlinking.png [L]
Utiliser un outil en ligne "Tester son Hotlinking" pour vérifier le bon fonctionnement de la configuration.
De préférence, utiliser un autre navigateur pour faire les tests de vérification.
Attention au cache du navigateur qui peut entraîner des affichages erronés.
Configurer le serveur pour ne pas autoriser le cache est une solution.
Cela réduirait les performances que l'on cherche pourtant à optimiser.
# La configuration suivante est fonctionnelle sur le site https://www.visionduweb.fr
# Interdire l'affichage des types de fichiers suivants sur les sites non autorisés.
# Visionduweb fr est autorisé.
RewriteCond %{HTTP_REFERER} !^https://(.+.)?visionduweb.fr/ [NC]
# Dans le cas d'un entête réécrit, une URL de provenance vide sera autorisée.
RewriteCond %{HTTP_REFERER} !^$
# Rediriger les fichiers vers une image de hotlinking.
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/structure/no-hotlinking.png [L]
Cette image doit s'afficher sur les sites internet qui utiliseraient une image directement hébergée sur le serveur de visionduweb.fr. 
No-hotlinking.png
Il semble que pour un test en local, l'image cible du site s'affiche tout de même normalement, sans utiliser l'image de Hotlinking.
Cela est peut être du à la condition : RewriteCond %{HTTP_REFERER} !^$

Erreurs de mise en application

La redirection http vers https et www m'a empêché de rediriger correctement les images avec la protection de hotlinking.
Tester le hotlinking depuis un site distant : https://soweclipse.000webhostapp.com/securite/hotlinking/
L'image "volée" ne s'affiche pas, mais, l'image de remplacement non plus.
Si j'ouvre l'image qui ne s'affiche pas dans une nouvelle fenêtre, l'url de l'image no-hotlinking remplace bien celle de l'image "volée" et est affichée dans la barre d'adresse du navigateur.
L'image n'est pas affichée, sauf si je réactualise la demande d'affichage avec la touche entrée.
A la place de l'image no-hotlinking, le message d'erreur suivant a été affiché :
ERR_TOO_MANY_REDIRECTS
Ou encore cet autre message d'erreur :
The page isn’t redirecting properly
Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
This problem can sometimes be caused by disabling or refusing to accept cookies.
###
Une règle pour un domaine spécifique :
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^visionduweb\.fr [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^visionduweb\.fr [NC] [OR]
RewriteCond %{HTTP_HOST} ^www.visionduweb\.fr [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

Rediriger un domaine vers un nouveau répertoire

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?domain.com$ [NC]
RewriteCond %{REQUEST_URI} !^/dossier/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /dossier/$1
RewriteCond %{HTTP_HOST} ^(www.)?domain$ [NC]
RewriteRule ^(/)?$ dossier/index.php [L]

Outils en ligne pour .htaccess

Générer le fichier .htaccess en ligne : http://www.htaccesseditor.com/fr.shtml
Tester le fichier .htaccess : https://htaccess.madewithlove.be

Protéger un répertoire avec htpasswd

Dans le répertoire à protéger :
Créer un fichier appelé path.php :
sudo touch path.php
sudo chown www-data:www-data path.php
sudo nano path.php
Coller le contenu suivant à l'intérieur :
<?php echo realpath('path.php'); ?>
Supprimer le fichier après qu'il ait été lu :
sudo rm path.php
Pour une configuration standard sur un serveur Apache2, la réponse sera de la forme :
/var/www/html/domaine.ext/repertoire/path.php
Créer un fichier appelé password.php
sudo touch password.php
sudo chown www-data:www-data password.php
sudo nano password.php
Coller le contenu suivant à l'intérieur :
<?php echo crypt('UnCodeSecret'); ?>
Supprimer le fichier après qu'il ait été lu :
sudo rm password.php
Créer le fichier .htaccess
sudo touch .htaccess
sudo chown www-data:www-data .htaccess
sudo nano .htaccess
Coller le contenu suivant à l'intérieur :
AuthName "Ce répertoire n'est pas autorisé à la consultation."
AuthType Basic
AuthUserFile "/var/www/html/domaine.ext/repertoire/.htpasswd"
Require valid-user
Créer le fichier .htpasswd
sudo touch .htpasswd
sudo chown www-data:www-data .htpasswd
sudo nano .htpasswd
Coller le contenu suivant à l'intérieur :
login:Le_Hash_Généré_Précédemment
Si la boîte de saisie du login et du mot de passe n'affiche pas correctement les accents, vérifier que le fichier .htaccess est bien encodé en ISO-8859-1.
file .htaccess
sudo bash
iconv -f UTF-8 -t ISO-8859-1 .htaccess > .htaccess.iso
mv .htaccess.iso .htaccess

Écrire du contenu dans un fichier avec PHP derrière un répertoire protégé par un mot de passe .htpasswd

# Écrire l'adresse IP locale de la box dans un fichier texte, suite à la consultation d'une page PHP.
<?php
$ip_en_cours = $_SERVER["REMOTE_ADDR"];

$jour = array("Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi");
$mois = array("","Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre");
$datefr = utf8_decode($jour[date("w")]." ".date("d")." ".$mois[date("n")]." ".date("Y"));
echo "Nous sommes le ". utf8_encode($datefr)."."; 

$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip_en_cours)); //connection au serveur de ip-api.com et recuperation des données
if($query && $query['status'] == 'success') 
{
echo " Visiteur de " . $query[city] . ", en " . $query['country'].".";
}

# Chemin vers fichier texte.
$file ="ip.txt";
# Ouverture en mode écriture.
$fileopen=(fopen("$file",'r+'));
# Ecriture les variables dans le fichier texte.
fwrite($fileopen,"L'adresse IP de la box est $ip_en_cours le $datefr. Le visiteur provient de $query[city] en $query[country]\r\n");
# On ferme le fichier proprement.
fclose($fileopen);
?>
# Créer une tâche cron localement pour accéder par mot de passe au script PHP précédent, protégé via .htpasswd, pour le ping et récupérer l'adresse IP courante :
crontab -e
15 */6 * * * curl -u USER:PASSWORD --silent --compressed https://www.example.com/script.php
Lien de l'API : http://ip-api.com
Source : https://codes-sources.commentcamarche.net/source/view/101395/1409111#browser

Accorder un accès en écriture à un répertoire de mise en cache

# Accorder un accès en écriture à un répertoire de mise en cache à l'aide des commandes suivantes :
sudo chmod a+w /var/www/html/blog/wp-content/cache
# Bloquer l'accès à tout le monde :
echo 'Require all denied' > /var/www/html/blog/wp-content/cache/.htaccess

Surcouche de sécurité Aesecure pour configurer le fichier .htaccess

La surcouche de sécurité Aesecure permet d'assister la création du fichier .htaccess.

Htaccess Time Cheatsheet

#     TIME CHEAT SHEET
#      300   5 MIN
#      600  10 MIN
#      900  15 MIN
#     1800  30 MIN
#     2700  45 MIN
#
#     3600   1 HR
#     7200   2 HR
#    10800   3 HR
#    14400   4 HR
#    18000   5 HR
#    36000  10 HR
#    39600  11 HR
#    43200  12 HR
#    46800  13 HR
#    50400  14 HR
#    54000  15 HR
#    86400  24 HR
#
#    86400   1 DAY
#   172800   2 DAY
#   259200   3 DAY
#   345600   4 DAY
#   432000   5 DAY
#   518400   6 DAY
#   604800   7 DAY
#
#   604800   1 WEEK
#  1209600   2 WEEK
#  1814400   3 WEEK
#  2419200   4 WEEK
#
#  2419200   1 MONTH
#  4838400   2 MONTH
#  7257600   3 MONTH
#  9676800   4 MONTH
# 12096000   5 MONTH
# 14515200   6 MONTH
# 16934400   7 MONTH
# 19353600   8 MONTH
# 21772800   9 MONTH
# 24192000  10 MONTH
# 26611200  11 MONTH
# 29030400  12 MONTH (1 YEAR)

Configurer un reverse proxy Apache - HTTP/HTTPS

Source : https://blog.victor-hery.com/2012/10/configurer-reverse-proxy-apache.html

Installer et configurer Memcached

Définition de Memcached :
Système de mise en cache d’objets de mémoire distribuée de haute qualité et à haute performance, gratuit et de nature générique.
Memcached peut mutualiser la mémoire sur plusieurs serveurs afin que plusieurs serveurs puissent accéder au même pool partagé.
Memcached tire parti de la mémoire système inutilisée en stockant les données fréquemment consultées.
Destiné à accélérer les applications Web dynamiques en allégeant la charge de la base de données.
Attention au DDos avec Memcached.
Bien que le service Memcached puisse réduire considérablement les temps de chargement des sites Web et des applications, il peut également être exploité par des pirates informatiques, qui ont utilisé Memcached pour amplifier les attaques par déni de service distribué.
Article complémentaire : https://www.bleepingcomputer.com/news/security/memfixed-tool-helps-mitigate-memcached-based-ddos-attacks/
Article complémentaire : https://www.bleepingcomputer.com/news/security/memcached-servers-can-be-abused-for-insanely-massive-ddos-attacks/
# Installer Memcached.
sudo apt-get install memcached
# Configurer memcached
sudo nano /etc/memcached.conf
# Chercher -m 64 et remplacer par -m 128
# Redémarrer memcached
sudo service memcached restart
sudo /etc/init.d/memcached restart
# Tester si ça marche :
sudo netstat -tap | grep memcache
# Doit retourner :
tcp        0      0 localhost:11211         0.0.0.0:*               LISTEN      2522/memcached
Memcached et mod_cache : Utiliser les deux en même temps, est-ce judicieux ?
# Je part du principe, sans avoir lu de documentation dans ce sens, que Memcached peut s'installer même si mod_cache déjà installé.
# Je part du principe, sans avoir lu de documentation dans ce sens, que Memcached va permettre aux requêtes vers la base de données d'être conservées en cache.
# Entre temps j'ai désinstallé memcached.

TTFB - Time To First Byte

Le TTFB est le temps de latence entre la demande d’un navigateur vers un site et le début de réponse du serveur de ce site web.
La rapidité du TTFB dépend de 3 facteurs :
1- Le temps que met que la requête à parcourir le réseau pour aller jusqu’au serveur web.
2- Le temps que met le serveur à traiter la requête et à produire une réponse au navigateur.
3- Le temps mis par la réponse à se propager à travers le web pour atteindre le navigateur.
Les configurations effectuées jusqu'à présent ont déjà du permettre d'améliorer les performances d'accès au site.
Mettre en place un CDN va le premier et le troisième point.
Il va réduire la distance et le nombre de noeuds entre le serveur web et le navigateur, surtout si l’audience du site est internationale.
Le deuxième point a été partiellement traité sur cette page. Il s'agit de configurer le serveur pour optimiser ses performances de traitement.
Diminuer les requêtes avec des systèmes de cache serveur, optimiser l’architecture des bases de données ...
Pour ces raisons, produire des pages moins complexes à générer améliore également les performances du TTFB.
Il arrive un moment où le principal facteur limitant c’est le temps processeur et/ou l’infrastructure matériel du serveur.
Si après tout ça la site ne se charge toujours pas assez vite, penser à changer d’hébergeur ou à investir dans un bon serveur dédié.

Diminuer la consommation de la RAM

Vérifier les modules chargés : apache2ctl -M

mpm_prefork_module

Apache utilise mpm_prefork_module par défaut.

MPM Worker

Le MPM worker crée par défaut 25 threads par processus, utilisant chacun au moins 8 Mo pour la pile.
En réduisant la taille par défaut de la pile, on peut largement diminuer la mémoire consommée par Apache :
ulimit -s
8192
sudo ulimit -s 512
sudo /etc/init.d/apache2 restart
Source complémentaire : https://buzut.developpez.com/tutoriels/installer-optimiser-apache2/#LII-F

Note de sécurité

Limiter les droits sur les fichiers

Voir au début de cette page.

Diffuser un minimum d'informations sensibles sur la version de l'application

Voir dans le tutoriel, désactiver la version de Apache.

Limiter la portée des fichiers auxquels peut accéder un client

Un internaute ne devrait jamais être en mesure de sortir de l'arborescence associé à un site.
Si il était est en mesure d'accéder en dehors de cette arborescence, il serait susceptible d'accéder à des fichiers sensibles comme /etc/passwd obtenant ainsi les logins à attaquer par BruteForce.

Limiter les accès réseaux

On peut restreindre les machines autorisées à accéder à apache2, soit directement dans la configuration du serveur apache, soit à l'aide d'un pare-feu comme par exemple ufw ou iptables.

Chiffrer les communications grâce à SSL

Créer un certificat SSL Let's Encrypt : Certificats SSL TLS Let’s Encrypt.

Désactiver la réponse au ping de votre machine

Cette configuration permet d'éviter des attaques par déni de service (DoS) qui utilisent ce genre de requêtes pour saturer un serveur (ICMP Flood).
Désactiver la réponse au Ping :
sudo nano /proc/sys/net/ipv4/icmp_echo_ignore_all
# Remplacer la valeur 0 par défaut par la valeur 1 pour désactiver la réponse au ping.
# Le changement de configuration est immédiatement pris en compte.
Réactiver la réponse au Ping :
sudo nano /proc/sys/net/ipv4/icmp_echo_ignore_all
# Remplacer la valeur 1 par la valeur 0 par défaut pour réactiver la réponse au ping.
La valeur par défaut 0 est rétablie au prochain démarrage.
Pour rendre la modification permanente, faire la modification directement dans le fichier sysctl.conf :
cd /etc/
sudo nano sysctl.conf
# Ajouter la ligne suivante pour conserver votre modification après redémarrage :
net.ipv4.icmp_echo_ignore_all = 1
# Il est possible que cette configuration empêche de consulter les statistiques de monitoring depuis le panel OVH.

Méthode d'authentification d'Apache pour l'accès a un répertoire

Il est déconseillé de sécuriser un répertoire par un accès à l'aide de la méthode d'authentification d'Apache.
Les informations transitent en clair et de ce fait, à l'aide d'une attaque MITM, il est très facile d'obtenir celles-ci.

Effectuer un test de montée en charge

Maintenant que le serveur Apache2 est installé et plus ou moins bien configuré, un test de montée en charge permettra de mieux connaître les limites de son serveur.
Voir à exécuter un test de montée en charge avec jmeter :
Site officiel : http://jmeter.apache.org

Effectuer un audit de sécurité

Utiliser un scanner de vulnérabilité pour améliorer la sécurité de votre serveur Apache2.
Consulter la page sécurité : Sommaire sécurité.

Note de sécurité - Informations complémentaires

ICMP Flood - Vous êtes floodé de milliers de requêtes

Votre site ce voit empêché de fonctionner normalement car le serveur n'arrive plus à traiter les requêtes.
Aucune de ces proposition seule ne peut suffire mais toutes ensemble elles permettent de limiter ce type de problème.
Si l’attaque ne s’effectue que sur certaine url, vous pouvez directement les bloquer depuis votre firewall avec des règles ad-hoc.
La plupart du temps, ce type d’attaque s’effectue sur le port 80. Si vous avez la possibilité de passer votre solution en https vous réglerez le problème.
Faites en sorte que votre apache n’écoute plus sur le port 80 et vous stoppez net une partie des attaques.
Activer le mod security d’Apache (Efficacité limitée pour des grosses attaques)
Optez pour un vrai firewall de préférence physique ou à défaut logiciel type pfsense car Iptables ne suffira pas.
Changer d’adresse IP votre machine et faites oublier l’ancienne adresse en ne l’utilisant pas pendant un certain temps.
Si vous pouvez filtrer les adresses IP de votre client directement dans le firewall, ceci est encore plus efficace.
Mettre en place un VPN avec les clients de l’application si possible (rarement le cas).
Vérifier que votre machine n’est pas vérolée par un rootkit et dans le doute réinstaller votre front à partir d’une distribution à jour et propre.
Sécurité Serveur aller plus loin : Modifier le nom du script d'accès à APC (?)

Que faire en cas d'attaque DDoS

Réduire l'impact des attaques DDoS avec Cloudflare : https://www.cloudflare.com/plans/
Empêcher les attaques par déni de service distribué : https://ftp.traduc.org/doc-vf/gazette-linux/html/2006/126/lg126-A.html#lg126a-5.fr
Autres informations sur DDoS : https://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service

Bloquer une IP ou une plage IP

A la racine de ton site ou dans le répertoire de ton choix, placer ou éditer le fichier .htaccess avec le code ci-dessous :
# Bloquer l’accès à l’ip "172.16.35.45" :
order allow,deny
allow from all
deny from 172.16.35.45
# Bloquer l’accès à la plage d’IP "10.25.35.0/24" (Toutes les IP commençant par 10.25.35) :
order allow,deny
allow from all
deny from 10.25.35
# Bloquer l’accès à l’adresse IP "172.16.35.45" et à la plage d’IP "10.25.35.0/24" :
order allow,deny
allow from all
deny from 172.16.35.45
deny from 10.25.35

Surveiller l'activité du serveur avec apachetop

# Installer apachetop :
sudo apt install apachetop
apachetop

sql.safe_mode

Vérifier le bon usage pour sql.safe_mode :
sql.safe_mode ?
You need to set mysql db setting in httpd.conf:
     php_admin_value mysql.default_host "192.168.1.5"
     php_admin_value mysql.default_user "DB_USER_LOGIN"
     php_admin_value mysql.default_password "DB_USER_PASSWORD"
In php.ini or security.ini :
sql.safe_mode=On

Todo.png

Se prémunir des failles CSRF

Source : https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
Source : https://opensourceforu.com/2010/11/securing-apache-part-3-xsrf-csrf/
Source : https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

Todo.png

Bibliographie

Ok.png La gestion des modules : https://technique.arscenic.org/lamp-linux-apache-mysql-php/apache-le-serveur-http/article/la-gestion-des-modules
Ok.png Activer ou désactiver un site sous apache 2 : http://www.billyboylindien.com/hebergement/memento-apache-ajout-suppression-de-site.html
Ok.png Désactiver la méthode HTTP TRACE sous Apache 2 : https://www.it-connect.fr/desactiver-la-methode-http-trace-sous-apache-2/
Ok.png VirtualHosts : https://wiki.gandi.net/fr/hosting/using-linux/tutorials/ubuntu/virtualhosts
Ok-ko.png Installer Apache PHP MySQL et Webmin : https://www.skyminds.net/serveur-dedie-installation-dapache-php-mysql-et-webmin/
Ok-ko.png Debian 9 - Apache MariaDB PHPMyAdmin : http://jc.etiemble.free.fr/abc/index.php/realisations/trucs-astuces/deb9php7
Ok-ko.png Utiliser la documentation officielle pour le serveur HTTP Apache Version 2.4 : https://httpd.apache.org/docs/2.4/
Ok-ko.png Installer un serveur web : http://www.linux-note.com/installer-un-serveur-web/
Ok-ko.png Documentation Apache2 Ubuntu : https://doc.ubuntu-fr.org/apache2
Ko.png http://www.commentcamarche.net/contents/796-installation-d-un-serveur-web-sous-linux-apache-php-et-mysql
Ko.png Installer et optimiser Apache2 : https://buzut.fr/configuration-dun-serveur-linux-apache2/
Ko.png http://olange.developpez.com/articles/debian/installation-serveur-dedie/
404.png Fixme.png https://linux.goffinet.org/31_services_apache_http_server/
Ko.png http://debian-facile.org/doc:reseau:apache2:multisite
Ko.png https://www.tecmint.com/apache-security-tips/
Ko.png Htaccess Ultime : https://www.askapache.com/htaccess/
Ko.png Améliorer les performances de Apache2 : https://duckduckgo.com/?q=apache2+tuning&t=lm&ia=web

Sécurité

Ok-ko.png Cours à télécharger pour approfondir la sécurité de vos configurations : https://www.cisecurity.org/cis-benchmarks/
Ok-ko.png Securing Apache HTTP Server An objective, consensus-driven security guideline for the Apache HTTP Server Server Software : https://www.cisecurity.org/benchmark/apache_http_server/
Ok-ko.png Sécurité Apache 2 : Le B.A.-BA : https://jeanphi.net/blog/2013/06/securite-apache-2-le-baba
Ok-ko.png Conseils sur la sécurité : https://httpd.apache.org/docs/current/misc/security_tips.html
Ok-ko.png Support suEXEC : https://httpd.apache.org/docs/current/suexec.html
Ko.png Sécuriser Apache2 : https://wiki.debian-fr.xyz/S%C3%A9curiser_Apache2

Cache

Ok-ko.png Guide de la mise en cache : http://httpd.apache.org/docs/2.2/caching.html
Ok-ko.png Manuel pour mod_cache : https://httpd.apache.org/docs/2.4/fr/mod/mod_cache.html
Ok.png How To Configure Content Caching Using Apache Modules On A VPS : https://www.digitalocean.com/community/tutorials/how-to-configure-content-caching-using-apache-modules-on-a-vps

Contrôle d'accès

Ok-ko.png Source : https://httpd.apache.org/docs/2.4/fr/upgrading.html
Ok-ko.png Source : https://httpd.apache.org/docs/2.4/fr/howto/access.html
Ok-ko.png Source : https://httpd.apache.org/docs/current/fr/mod/mod_authz_host.html
Ok-ko.png System: Apache authorization with dynamic DNS : https://www.the-art-of-web.com/system/apache-auth-ddns/
Ok-ko.png System: Access authorization in Apache 2.4 : https://www.the-art-of-web.com/system/apache-authorization/

Erreur HTTP

Ok.png Liste des codes HTTP : https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP
Ok.png Consulter les codes erreurs HTTP : https://httpstatuses.com

Optimiser les performances de Apache2

Ok.png Htaccess : performances et temps de chargement : https://www.seomix.fr/guide-htaccess-performances-et-temps-de-chargement/
Ok.png Guide SEO: optimiser les performances côté serveur : https://www.creapulse.fr/guide-seo-optimiser-performances-serveur/
Ok.png Un tutoriel de la mise en cache : https://www.mnot.net/cache_docs/

Installer et configurer Nginx

Installer et configurer Nginx.

NAVIGATION

PARTICIPER ET PARTAGER

Vous êtes sur le wiki de Vision du Web.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Pour participer sur le wiki, créer un compte utilisateur en haut à droite.
La recherche interne du wiki permet de trouver le contenu qui vous intéresse.
Les informations présentes sur ce wiki sont issues d'une recherche personnelle.
Identifiez-vous pour poser vos questions sur la page de discussion de VisionDuWeb.
Améliorer le contenu des pages en faisant des propositions depuis l'onglet discussion.
Les informations du wiki ne doivent pas servir à nuire à autrui ou à un système informatique.
De nombreux outils gratuits sont listés et disponibles dans la boîte à outils de Vision du web.
D'autres pages du wiki peuvent correspondre à vos attentes. La liste de toutes les pages du wiki.

VALORISER LE WIKI

Valoriser le contenu partagé sur le wiki avec un don en monnaie numérique :
AEON - Bitcoins - Bitcoins Cash - Bitcoins Gold - Bitcore - Blackcoins - Basic Attention Token - Bytecoins - Clams - Dash - Monero - Dogecoins - Ğ1 - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Gagner des Altcoins - Miner des Altcoins.
Consulter le miroir du wiki depuis Planet Hoster : Le miroir du wiki version du 12 Juillet 2019.