Installer Apache2 sur Debian

De Analyse Développement Hacking
Sauter à la navigation Sauter à la recherche

Glider.png

Le wiki : Accueil - Administrateur - Bureautique - Développeur - Intégrateur - Marketing - Multimédia - Objets numériques - Jeux - We make Hack

Le site : Accueil du site - Annuaire - Blog - Forum - Outils - Utilisateur
Le FTP : Accueil du FTP - Le privatebin : Accueil du privatebin
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 est préférable de lancer Apache2 avec la commande sudo /etc/init.d/apache2 start ou apache2ctl start !
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 avec sudo service apache2 start.
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/"
# Cette solution n'est pas pratique ni conseillée.
# Redémarrer le test de démarrage de Apache2 avec la commande suivante : sudo apache2 -k start afficherait alors 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/
# La commande -print0 / -0 permet de changer les droits sur les fichiers et dossiers qui seraient nommés avec un espace ou un accent.
# Première méthode :
sudo find /var/www -type f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+rw
sudo find /var/www -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rwx
# Deuxième méthode :
sudo find /var/www -type f -print0 | xargs -0 chmod 660
sudo find /var/www -type d -print0 | xargs -0 chmod 770

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).
# Première méthode :
# Chercher tous les fichiers (-type f) 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 à lire avec "u+rw".
# Autoriser le groupe www-data à lire uniquement "g+r".
# Quand il s'agit de dossiers, on rajoute l'autorisation exécuter (x) pour le propriétaire et pour le 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 f -print0 | xargs -0 chmod -t,a-rwxs,u+rw,g+r
# Chercher tous les dossiers (-type d) dans /var/www/ et ses sous-répertoires.
# Même chose que précédemment sauf qu'on cherche des dossiers (-type d) au lieu des fichiers.
sudo find /var/www/ -type d -print0 | xargs -0 chmod -t,a-rwxs,u+rwx,g+rx
# Deuxième méthode :
sudo find /var/www -type f -print0 | xargs -0 chmod 640
sudo find /var/www -type d -print0 | xargs -0 chmod 750
# 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 fichier ou répertoire :
sudo chmod g+w /var/www/site/path/fichier
sudo chmod -R g+w /var/www/site/path/dossier
# Script de Zer00CooL pour vérifier les CHMOD de façon automatisée #
# Ce script gist hébergé sur Github permet de vérifier les droits CHMOD sur un projet web, Joomla, WordPress ou Mediawiki :
https://gist.github.com/ZerooCool/4a22e96a52c4268b68679e4269e66f73
# Déplacé vers le projet Github :
https://github.com/ZerooCool/fix-apache-permissions.sh

Droits ACL

# Les droits ACL permettent de travailler à plusieurs utilisateurs et de définir des droits particuliers à certains utilisateurs.

Droits SELinux

# SELinux permet par exemple de n'autoriser l'accès à un 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 :
sudo systemctl status apache2.service
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.

Connaître l'utilisateur et le groupe faisant tourner Apache2

# L'utilisateur et le groupe est renseignée depuis le fichier de configuration de Apache2.
nano /etc/apache2/envvars
# Ils peuvent également être obtenue avec la commande suivante :
ps axo user,group,comm | egrep '(apache|httpd)'
# Va afficher les lignes suivantes sur un serveur en production :
root     root     apache2
www-data www-data apache2
www-data www-data apache2
www-data www-data apache2
# Connaître le nombre de processus démarrés par Apache2 :
sudo ps aux | egrep --color '([a|A]pache|[h|H]ttpd)'
sudo ps aux | egrep '([a|A]pache|[h|H]ttpd)'
sudo ps aux | egrep '(apache|httpd)'
sudo ps aux | grep apache
# Connaître l'utilisateur faisant tourner Apache2 et afficher une seule réponse :
ps aux | egrep '([a|A]pache|[h|H]ttpd)' | awk '{ print $1}' | uniq | tail -1
ps axo user,group,comm | egrep '(apache|httpd)' | grep -v ^root | uniq | cut -d\  -f 1
ps axo user,group,comm | egrep '(apache|httpd)' | grep -v ^root | tail -1 | awk '{print $1}'
# Va afficher :
www-data
# Connaître le groupe faisant tourner Apache2 et afficher une seule réponse :
ps axo user,group,comm | egrep '(apache|httpd)' | grep -v ^root | uniq | cut -d\  -f 2

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 de Apache2

Les modules de 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 par défaut si le fichier index.php existe, sinon il va chercher le fichier 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>
# Autre exemple :
<VirtualHost green-adn.com:80>
ServerName green-adn.com
ServerAlias www.green-adn.com
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html
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 />
Require all denied
</Directory>

<Directory /var/www/html>
# Empêcher le suivi des liens symboliques.
# Suivi des liens symboliques pour le fonctionnement de la liste noire bad bot blocker.
Options +FollowSymLinks
# Protéger l'accès aux répertoires.
Options -Indexes
# Désactiver Inclusions Côté Serveur - Server Side Includes - SSI.
Options -Includes
# Permet la prise en compte du fichier .htaccess.
AllowOverride All
# Définir le fichier à appeler par défaut.
DirectoryIndex index.php index.html

## Contrôle d'accès Apache 2.4 :
# Toutes les requêtes sont autorisées.
# Fonctionne depuis que j'ai renseigné DirectoryIndex.
# Commenté pour le fonctionnement de la liste noire bad bot blocker.
# Require all granted
# Require par IP permet uniquement l'accès au site depuis l'adresse IP fournie.
# Require ip xx.xx.xx.xx

# Inclure le script de liste noire Bad Bot Blocker :
# Include custom.d/globalblacklist.conf
</Directory>

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de https non-www vers https www
RewriteCond %{SERVER_NAME} !^www\.(.*)$ [NC]
RewriteRule ^ https://www.%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

# 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]
</IfModule>

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

Définir le domaine par défaut

# La commande suivante de Apache2 affiche la liste des Virtualhosts configurés sur le serveur.
# Cette commande permet également d'identifier le domaine par défaut.
sudo apachectl -S
# Dans mon cas, on constate que le serveur par défaut est ethernium.fun ce que je voudrais fixer par moi même.
# Consulter la documentation suivante pour fixer le serveur par défaut : https://httpd.apache.org/docs/2.4/fr/vhosts/examples.html

# En temps normal, le Virtualhost par défaut de Apache2 est le suivant 000-default car il affiche d'abord les chiffres puis les lettres.
# Dans mon cas, je l'avais supprimé, donc, je dois recréer le Virtualhost par défaut.

# Script pour activer un nouveau Virtualhost par défaut :
DEFAULT_TO_USE='visionduweb.fr.conf'
echo $DEFAULT_TO_USE
# a2dissite $DEFAULT_TO_USE
sudo cp /etc/apache2/sites-available/${DEFAULT_TO_USE} /etc/apache2/sites-available/00000-${DEFAULT_TO_USE}
sudo a2ensite 00000-${DEFAULT_TO_USE}

# Remplacer la première ligne du Virtualhost en écoute du port 80 et la seconde en écoute du port 443 avec la valeur _default_: de la façon suivante :
<VirtualHost _default_:80>
<VirtualHost _default_:443>
# Les autres virtualhosts devraient être en *:80 et *:443 mais dans mon cas ce sont les domaine:port qui sont renseignés et la configuration par défaut ne semble pas s'appliquer.
# Pour arriver à appliquer ma configuration par défaut, j'ai mis l'adresse IP en écoute des ports 80 et 443 au lieu d'utiliser _default_: dans le Virtualhost par défaut 00000- :
<VirtualHost 139.99.173.195:80>
<VirtualHost 139.99.173.195:443>
# Redémarrer le serveur pour appliquer la nouvelle configuration.
sudo service apache2 restart
# Je continue de rencontrer différentes erreurs à l'usage.
# Je remet visionduweb.fr dans les deux lignes du VirtualHost.
# Je renomme le VirtuHost en 135-visionduweb.fr.conf pour le positionner entre la configuration 127.0.0.1.conf et 139.99.173.195.conf.
# C'est bien visionduweb.fr qui devient alors le Virtualhost par défaut, pour le port 80 et 443, mais, j'ai l'impression de voir le serveur subir des lenteurs supplémentaires.
# Pour le moment, je continue d'utiliser ma méthode, un VirtualHost pour ip:80 et ip:443 et un VirtualHost pour chaque domaine domaine1:80 et domaine1:443
# En conclusion, la bonne pratique serait la suivante :
# Pour le domaine par défaut :
<VirtualHost _default_:80>
<VirtualHost _default_:443>
# Les autres virtualhosts devraient être en *:80 et *:443

Configurer Apache avec le SNI

# Le Server Name Indication permet au serveur de présenter le bon certificat lors de la connexion SSL depuis le client, le navigateur web, afin de spécifier vers quel nom de domaine il doit se connecter.
# Plusieurs certificats SSL peuvent alors être liés à une seule adresse IP, et, il n'est plus nécessaire de sacrifier une adresse IP par site web SSL.
# Consulter la RFC 4366 pour en savoir plus sur le SNI "Server Name Indication" : https://www.ietf.org/rfc/rfc4366.txt
# Les navigateurs et les serveurs doivent implémenter cette extension.
# Le SNI est et reste une bonne alternative provisoire.
# SNI n'est pas un modèle parfait car le nom d'hôte est transmis en n'étant pas crypté.
# La sécurité est renforcée si vous n'avez pas à utiliser le SNI en faisant en sorte que chaque site Web obtienne sa propre adresse IP.
# Une alternative au SNI serait d'utiliser les certificats Subject Alternative Name (SAN) qui permet l'utilisation de plusieurs domaines ou noms d'hôtes.
# L'inconvénient des certificats SAN est leur prix, par conséquent, de nombreux exploitants de sites Web ne sont pas disposés à mettre en œuvre de tels certificats.
# Avec un certificat SAN, le domaine vers lequel le client souhaite s'adresser n'a pas d'importance pour le serveur car le certificat est valide pour tous les domaines du serveur.
# Systèmes d'exploitation et navigateurs non compatibles avec SNI :
# Windows XP et toutes les versions d'Internet Explorer dans ce système
# Internet Explorer version 6 et inférieure
# Safari sur Windows XP
# Konqueror/KDE inférieur à 4.7
# Microsoft Internet Information Server IIS jusqu'à la version 7 inclue.
# Navigateur Android version 2.x
# Windows Mobile jusqu'à la version 6.5
# Pour utiliser SNI avec le serveur Apache, le module mod_ssl doit être installé.
# Il n'y a pas grand chose de plus à faire si ce n'est interdire l'utilisation de la version 2 du protocole SSL dans les fichiers de configuration Apache :
Listen 443
NameVirtualHost *:443

# On interdit le SSLv2 et le TLSv1 ...
# On active l'utilisation de certains Cipher ... (Pourrait répondre au problème de l'erreur 525 rencontrée sur Cloudflare.)
SSLProtocol ALL -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

SSLEngine on
# Gérer la connexion au premier VirtualHost chargé par Apache à partir de clients non SNI :
# Par défaut, la directive est à off. ( Voir /etc/apache2/mods-available/ssl.conf )
# Les navigateurs non pris en charge chargent le certificat SSL du premier vhost chargé par défaut par Apache.
SSLStrictSNIVHostCheck off
# Les navigateurs non pris en charge chargent la page erreur 403 du premier vhost chargé par défaut par Apache.
SSLStrictSNIVHostCheck on
# SNI et la sécurité
# Le nom d'hôte souhaité n'est pas chiffré, donc un espion peut voir quel site est demandé.
# Cela aide les sociétés de sécurité à fournir une fonction de filtrage et les gouvernements mettent en œuvre la censure.
# En 2018, une mise à niveau appelée Encrypted SNI (ESNI) est expérimenté pour faire face à ce risque d'écoute clandestine de domaine.
# Le 1er mars 2019, Daniel Stenberg a déclaré que Mozilla Firefox prend en charge ESNI.

Directives de Apache2

CustomLog et ErrorLog

# Définir l'emplacement des fichiers de logs pour les erreurs et les accès au site avec ErrorLog et CustomLog.
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

combined

# Combined Log Format (Format de journalisation combiné).
# Ce format est identique au Common Log Format, avec deux champs supplémentaires.
# Les champs supplémentaires sont :
# L'en-tête "Referer" de la requête HTTP.
# Il indique le site depuis lequel le client prétend avoir lancé sa requête. Ce doit être la page qui contient un lien vers le fichier ou qui inclut le fichier.
# "Mozilla/4.08 [en] (Win98; I ;Nav)" (\"%{User-agent}i\")
# L'en-tête User-Agent de la requête HTTP. C'est une information d'identification que le navigateur du client envoie à propos de lui-même.
Source : https://httpd.apache.org/docs/2.2/fr/logs.html
Source : https://httpd.apache.org/docs/2.4/fr/logs.html

DirectoryIndex

# Définir le fichier a appeler par défaut avec la directive :
DirectoryIndex index.php index.html
Source complémentaire : https://ubuntuplace.info/questions/170435/changer-la-page-dindex-par-defaut-avec-htaccess

EnableSendfile

# Le mécanisme sendfile évite la séparation des opérations de lecture et d'envoi, ainsi que les réservations de tampons.
# Sur certains systèmes cependant, ou sous certains systèmes de fichiers, il est préférable de désactiver cette fonctionnalité afin d'éviter certains problèmes opérationnels :
# Certains systèmes peuvent présenter un support sendfile défectueux que le système de compilation n'a pas détecté, en particulier si les exécutables ont été compilés sur une autre machine, puis copiés sur la première avec un support sendfile défectueux.
# Sous Linux, l'utilisation de sendfile induit des bogues lors de la récupération des paquets de vérification TCP (TCP-checksum) avec certaines cartes réseau lorsqu'on utilise IPv6.
# Sous Linux sur Itanium, sendfile peut s'avérer incapable de traiter les fichiers de plus de 2 Go.
# Avec un montage réseau de DocumentRoot (par exemple NFS, SMB, CIFS, FUSE), le noyau peut s'avérer incapable de servir un fichier de ce montage réseau en passant par son propre cache.
# Le problème du site serait que les images ou fichiers css ne s'afficheraient pas sur un site local.
# Pour les configurations de serveur non sujettes à ce genre de problème, vous pouvez activer cette fonctionnalité en spécifiant :
EnableSendfile On
# Pour les montages réseau, cette fonctionnalité peut être explicitement désactivée pour les fichiers concernés en spécifiant :
<Directory "/path-to-nfs-files">
 EnableSendfile Off
</Directory>
EnableSendfile : http://httpd.apache.org/docs/current/mod/core.html#enablesendfile

Le fichier de configuration htaccess

Fichier .htaccess vs fichier VirtualHost

Il est plus performant de configurer les VirtualHosts directement que de passer par l'appel de fichiers .htaccess.
Le fichier .htaccess sert aux développeurs n'ayant pas accès au VirtualHost de configurer leur serveur.
L'un comme l'autre permet la mise en place de protections comme par exemple Bad Bot Blocker.

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/ ( Ce site doit être réinstallé sur le serveur. )
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

https://httpd.apache.org/docs/2.4/fr/howto/reverse_proxy.html
https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html
https://www.ionos.fr/digitalguide/serveur/know-how/quest-ce-quun-reverse-proxy-le-serveur-reverse-proxy/
https://journaldunadminlinux.fr/tutoriel-mettre-en-place-un-reverse-proxy-sur-apache-via-mod_proxy/
https://www.it-connect.fr/mise-en-place-dun-reverse-proxy-apache-avec-mod_proxy/
https://perhonen.fr/blog/2015/05/un-reverse-proxy-apache-avec-mod_proxy-1713
https://www.vincentliefooghe.net/content/apache-reverse-proxy-https

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.

Loguer les erreurs SSL pour obtenir plus d'informations

# Il est intéressant de loguer les erreurs SSL pour obtenir plus d'informations :
<IfModule mod_ssl.c>
ErrorLog /var/log/apache2/ssl_test.log
LogLevel debug
</IfModule>
# J'ajoute l'enregistrement des logs sur le port 443 depuis la configuration du VirtualHost xyz-139.99.173.195.conf.
# Suite à la consultation du site tiger-green.fr le fichier de log ssl_test.log est créé et affiche :
[ssl:debug] [pid 17666] ssl_engine_init.c(1750): AH10083: Init: (www.tiger-green.fr:443) mod_md support is unavailable.
[ssl:debug] [pid 17666] ssl_engine_init.c(479): AH01893: Configuring TLS extension handling
# Suite à l'installation du module mod_md, les logs sur SSL en mode debug ne retournent plus le message qui indiquait que mod_md est manquant.
ssl_engine_init.c(1750): AH10083: Init: (tiger-green.fr:443) mod_md support is available.

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.
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 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/
Ko.png https://linux.goffinet.org/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://web.archive.org/web/20160129221633/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

Bienvenue sur le wiki de Vision du Web.
De nombreuses pages sont partagées sur ce wiki.
Créer un compte utilisateur pour participer sur le wiki.
Les pages présentées sur le wiki évoluent tous les jours.
Certaines recherches sont peu abouties et incluent des erreurs.
Utiliser la recherche interne du wiki pour trouver votre contenu.
La page de discussion de VisionDuWeb vous permet de poser une question.
Utiliser la recherche interne du site pour chercher dans tout le contenu.
Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique.
Protéger votre système Linux ou Windows en lisant la page dédié à la sécurité.
Améliorer le contenu des pages avec vos propositions depuis l'onglet discussion.

SOUTENIR CE WIKI

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