Installer Apache2 sur Debian

De Wiki. Analyse, Communication, Développement, Hacking.
Aller à : navigation, rechercher
Naviguer sur le wiki : Accueil du wiki - Administrateur - Développeur - Intégrateur - Marketing - Multimédia - Objectifs - We make Hack
Naviguer sur le site : Accueil du site - Les annuaires - Les éditoriaux - Le forum - Les outils - Les projets
 
Consulter le sommaire de cette page en étant déconnecté du réseau : Télécharger le sommaire en PDF

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.

Connaître la version du serveur Apache2

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

Réinitialiser Apache2

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

Désinstaller Apache2

sudo apt autoremove apache2

Démarrer Apache2

Simuler le démarrage de Apache2

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

Exemple d'erreurs de variables d'environnement

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

Variables d'environnement

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

Démarrer Apache2

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

Debian-apache2-configuration-overview.png

Redémarrer Apache2

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

Recharger la configuration de Apache2

sudo /etc/init.d/apache2 reload

Arrêter Apache2

sudo /etc/init.d/apache2 stop

Vérifier si Apache2 écoute le réseau

netstat -ntlp | grep ":80"
tcp  0 0 :::80  :::*  LISTEN 3996/httpd

Gestion des erreurs : status, configtest, logs, journal

Consulter les statuts du service Apache2

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

Utiliser configtest pour identifier une erreur de démarrage

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

Lire les logs de Apache2

Le fichier error.log de Apache2 est localisé dans /var/log/apache2/error.log
Consulter le journal avec la commande journalctl -xn

Le fichier de configuration de Apache2

apache2.conf

# Éditer le fichier de configuration :
sudo nano /etc/apache2/apache2.conf

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

# Désactiver la signature du serveur.
ServerSignature Off
# Passer la directive ServerTokens à Prod (Pour Product Only). Le champ Server contiendra uniquement le nom du serveur web utilisé.
ServerTokens Prod

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

Comprendre les drapeaux de réécriture de Apache2

Drapeaux de réécriture - Flags : https://httpd.apache.org/docs/current/fr/rewrite/flags.html

Les modules sur Apache2

Afficher la liste des modules activés

# Afficher la liste des modules activés
sudo ls /etc/apache2/mods-enabled/

Vérifier les modules disponibles

Obtenir la liste des modules disponibles par défaut pour Apache2.
sudo ls /etc/apache2/mods-available/
Apache2 dispose d’un nombre important de modules complémentaires dont le nom de paquet débute généralement par libapache2.
Obtenir la liste des modules disponibles pour Apache2.
apt-cache search libapache2

Activer des modules

# Activer un module.
# Un lien symbolique va être ajouté dans le dossier /etc/apache2/mods-enabled et pointera vers le fichier de définition du module.
a2enmod Nom_du_module
# Redémarrer Apache2 pour prendre en compte l'activation d'un module.
sudo systemctl restart apache2
# Les modules utilisent leur configuration par défaut depuis le répertoire /etc/apache2/mods-available.
# En général deux fichiers existent pour chaque module installé sur le système :
# Un fichier avec une extension .load contient la directive de chargement du module réel, généralement contenu dans le répertoire /usr/lib/apache2/modules/.
# Un fichier avec une extension .conf qui contient la configuration par défaut du module.
# Il est possible de modifier cette configuration par défaut en ajoutant de nouvelles directives.
# Les distributions basée sur Debian proposent un répertoire /etc/apache2/conf.d pour ajouter de nouvelles configurations personnalisées. 
# Créer un nouveau fichier nommé à notre convenance pour ajouter une configuration personnalisée.
# L’ensemble des fichiers sont concaténés à la fin de la configuration de Apache2.

Mod Evasive

Installer et configurer mod_evasive pour Apache2.

Mod Headers

Content Security Policy

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

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

# Le module correspondant à X-WebKit-CSP n'est pas chargé.
# X-WebKit-CSP "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.visionduweb.fr; object-src https://www.visionduweb.fr; style-src https://www.visionduweb.fr; img-src https://www.visionduweb.fr; media-src https://www.visionduweb.fr; frame-src https://www.visionduweb.fr; font-src https://www.visionduweb.fr; connect-src https://www.visionduweb.fr; report-uri https://www.visionduweb.fr"
</IfModule>
Nouvelles règles à tester !
X-Content-Security-Policy: "default-src 'self' https://www.visionduweb.fr; script-src 'self' https://www.visionduweb.fr; object-src 'self' https://www.visionduweb.fr; style-src 'self' https://www.visionduweb.fr; img-src 'self' https://www.visionduweb.fr; media-src 'self' https://www.visionduweb.fr https://youtu.be; frame-src 'self' https://www.visionduweb.fr; font-src 'none'; connect-src 'self' https://www.visionduweb.fr"

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

HTTP Strict Transport Security

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

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

Hsts-preload-status-and-eligibility.png

Success
visionduweb.fr is now pending inclusion in the HSTS preload list!
Please make sure that visionduweb.fr continues to satisfy all preload requirement, or it will be removed. Please revisit this site over the next few weeks to check on the status of your domain.
Also consider scanning for TLS issues using SSL Labs.
Un B est obtenu avec SSL Labs : https://www.ssllabs.com/ssltest/analyze.html?d=visionduweb.fr
Un B+ est obtenu avec Observatory Mozilla : https://observatory.mozilla.org/analyze/visionduweb.fr
Configuration du serveur
Redirection
# La première règle doit permettre de passer de http à https avant de charger le header de la page.
# Le serveur doit avoir un certificat SSL de configuré pour le nom de domaine.
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

# Rediriger le domaine visionduweb.fr vers le sous domaine www.visionduweb.fr.
RewriteCond %{HTTP_HOST} ^visionduweb.fr$
RewriteRule ^(.*)   https://www.visionduweb.fr/$1  [R=301,L]
### ### ###
# Peut être plutôt utiliser cette syntaxe. A tester !
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]

RewriteCond %{HTTP_HOST} ^mondomaine.fr  [NC]
RewriteRule ^(.*)   http://www.mondomaine.fr/$1 [L,R=301,NC]
### ### ###
# Du deux en un, avec l'avantage de ne pas avoir à modifier le nom de domaine. A tester.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
### ### ###
# La règle suivante devrait être pleinement fonctionnelle.
#Uncomment if want to force HTTPS and if your server can handle it
# verification cond-rule HTTPS en premier
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# puis cond-rule pour la redirection www
RewriteCond %{HTTP_HOST} ^nomdudomaine [NC]
RewriteRule ^(.*)$ https://www.nomdudomaine/$1 [L,R=301,NC]

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

<IfModule mod_headers.c>
# Force HTTPS (don't use this if you're still on http)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
# Il faut remplacer la partie en rouge par le nom de domaine.
# Il ne faut pas activer l'obligation de www dans Aesecure. Cette partie du code de Aesecure doit être supprimée : #AESECURE_WITHORNOTWWW_START
# Désactiver le forçage https dans l'admin Joomla!.
HSTS
La directive "preload" n'est nécessaire que pour valider l'enregistrement du site dans la liste tenue par Chrome.
# Ajouter les lignes suivantes dans son VirtualHost ou dans son fichier .htaccess. ( Pour celui en écoute du port 80 ? )
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
Tester avec hstspreload
Tester la bonne configuration de son site avec https://hstspreload.org
L'outil demande de forcer la redirection de http vers https directement.
Il indiquera un message d'erreur si on redirige directement http vers https://www.
Il faudrait donc mettre en place une règle de redirection de http vers https, et, seulement après, rediriger vers le sous domaine www.
Tester avec ssllabs
Tester également avec SSL Labs qui devra retourner un A+
https://www.ssllabs.com/ssltest/
Ressources complémentaires
Ok.png Activer le HSTS : pourquoi et comment : https://forum.joomla.fr/forum/joomla-3-x/questions--g%C3%A9n%C3%A9rales/1991742-activer-le-hsts-pourquoi-et-comment
Ok-ko.png Redirection https et www dans le bon ordre  : https://forum.joomla.fr/forum/joomla-3-x/questions--g%C3%A9n%C3%A9rales/1991735-redirection-https-et-www-dans-le-bon-ordre
Ko.png HTTP Strict Transport Security Cheat Sheet : https://www.owasp.org/index.php/HTTP_Strict_Transport_Security_Cheat_Sheet
Ko.png Configure HSTS (HTTP Strict Transport Security) for Apache and Nginx : https://linux-audit.com/configure-hsts-http-strict-transport-security-apache-nginx/
Ko.png Tour d’horizon sur HTTPS et les en-têtes de sécurité : https://www.alsacreations.com/article/lire/1723-tour-horizon-https-et-en-tetes-de-securite.html
Ko.png Qu’est-ce que le HSTS et comment le met-on en œuvre ? : https://www.globalsign.fr/fr/blog/qu-est-ce-que-le-hsts-comment-le-mettre-en-uvre/
Ko.png Fiabiliser les connexions sécurisées avec HSTS (HTTP Strict Transport Security) : https://blog.dareboost.com/fr/2017/09/hsts-fiabiliser-connexions-securisees/
Ko.png Proposition de htaccess par Cavo789 pour la CSP : https://github.com/cavo789/htaccess#csp---content-security-policy
Ko.png Proposition de htaccess par Cavo789 pour le HSTS : https://github.com/cavo789/htaccess#force-https-and-www-compatible-hstspreload

Mod Passenger

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

Mod Proxy et Proxy HTTP

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

Mod Rewrite

# Activer Mod Rewrite.
sudo a2enmod rewrite

URL Rewriting

Mod Rewrite permet d'utiliser la réécriture d'adresses URL (URL Rewriting).
Exemples : https://craym.eu/tutoriels/referencement/url_rewriting.html
Exemples : https://www.askapache.com/htaccess/modrewrite-tips-tricks/

Mod Security2

Mod_security est un Pare-feu applicatif, un WAF ("Web Application Firewall"), qui agit sur la couche 7 du modèle OSI, la couche application. 
La plupart des Pare-feu travaillent sur la couche 3 et agissent au niveau des ports (Port 22 pour SSH, 80 pour le Web, ...). Il sert également d'IDS/IPS pour les applications web.
Il peut utiliser les règles très strictes de Open Web Application Security Project (OWASP) Core Rules Set (CRS).
Il surveille le trafic HTTP en temps réel et protège les applications web des attaques Brute force.
Il filtre et modifie la réponse renvoyées par le serveur web (Exemple : Les erreurs 404 ou 500).

Installer mod-security2

On va installer mod-security2 un pare-feu web pour Apache.
Créer le fichier /etc/apt/sources.list.d/mod-security2.list et y inscrire :
### Dépôt pour mod-security2 ###
deb //etc.inittab.org/~agi/debian/libapache-mod-security2 ./
Récupérer la clef gpg :
[email protected] # gpg --keyserver pgpkeys.mit.edu --recv-keys C514AF8E4BA401C3
[email protected] # gpg --export -a C514AF8E4BA401C3 | apt-key add - 
Mettre à jour les dépôts :
[email protected] # aptitude update 
Installer le module :
[email protected] # aptitude install libapache-mod-security mod-security-common
Source complémentaire : https://www.it-connect.fr/installation-de-mod_security-devant-un-serveur-web-apache/#III_Installation_de_mod_security
Source complémentaire : https://devops.profitbricks.com/tutorials/how-to-configure-modsecurity-and-mod_evasive-for-apache-on-centos-7/

Configurer mod-security2

Configuration du module, créer le fichier /etc/apache2/conf.d/mod-security.conf et ajouter ceci :
<IfModule mod_security2.c>
 Include /etc/modsecurity/*.conf
</IfModule>
Il va falloir créer le dossier /etc/modsecurity et copier les fichiers de configuration :
[email protected] # mkdir /etc/modsecurity
[email protected] # cd /usr/share/doc/mod-security-common/examples/rules
[email protected] # cp *.conf base_rules/* /etc/modsecurity/ 
De plus, il faut créer le dossier pour les logs :
[email protected] # mkdir /etc/apache2/logs 
Optionnel : commenter la ligne contenant Host header is a numeric IP address du fichier /etc/modsecurity/modsecurity_crs_21_protocol_anomalies.conf pour autoriser l'accès au site par l'intermédiaire d'une adresse IP.

Activer le module mod-security2

# Activer Mod Security.
a2enmod mod-security
Relancer Apache :
[email protected] # apache2ctl restart 
# Vérifier que le module est bien chargé :
[email protected] # cat /var/log/apache2/error.log | grep ModSecurity 
# Devrait renvoyer :
[notice] ModSecurity for Apache/2.5.12 (http://www.modsecurity.org/) configured.
Un excellent module et une protection fiable.
Il peut être un peu extrême de l'utiliser lors d'un développement en local.
Le comportement de PHPmyAdmin peut être altéré, certains scripts retournerons une erreur car jugés dangereux.
Il est possible de contourner ce problème pour les étapes de développement.
Ajouter une règle dans les options du virtualHost ou dans un .htaccess pour désactiver mod-security :
SecRuleEngine Off
Une fois le développement terminé, il est fortement recommandé de rétablir la sécurité.
Ok-ko.png Source : https://www.skyminds.net/serveur-dedie-securiser-apache-2-avec-mod-security/
Ok-ko.png How to Configure ModSecurity and mod_evasive for Apache on CentOS 7 : https://devops.profitbricks.com/tutorials/how-to-configure-modsecurity-and-mod_evasive-for-apache-on-centos-7/

Mod SSL

# Activer Mod SSL.
a2enmod ssl

Désactiver des modules

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

VirtualHost

Créer un VirtualHost

Deux répertoires sont a utiliser par défaut pour ajouter un (ou plusieurs) VirtualHost(s) : /etc/apache2/sites-available/ et /etc/apache2/sites-enabled/.
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 le répertoire /etc/apache2/sites-available/ se trouve un fichier par défaut appelé "default" ou "000-default.conf".
Utiliser ce fichier comme modèle pour vos VirtualHost en le copiant avec un nouveau nom.
cd /etc/apache2/sites-available/
Ajouter un VirtualHost pour le site visionduweb.com :
cp default visionduweb.com
Les droits appliqués par défaut :
sudo chown root:root visionduweb.com
sudo chmod 644 visionduweb.com
Configurer le VirtualHost du site visionduweb.com :
sudo nano visionduweb.com
<VirtualHost IP_DU_SERVEUR:80>
  ServerAdmin [email protected]
  ServerName visionduweb.com
  ServerAlias www.visionduweb.com
  DocumentRoot /var/www/html/visionduweb.com/
  <Directory />
      Options FollowSymLinks
      AllowOverride None
  </Directory>
  <Directory /var/www/html/visionduweb.com/>
      Options Indexes FollowSymLinks MultiViews
      # Permet la prise en compte du fichier .htaccess
      AllowOverride ALL
      Order allow,deny
      allow from all
  </Directory>
  LogLevel warn
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
 </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.

Activer ou désactiver un site sous Apache2

# Activer un site en créant un lien symbolique du dossier sites-enabled vers le dossier sites-available :
# Ce lien symbolique peut également être créé manuellement avec la commande ln -s.
a2ensite NomDeMonSite
# Désactiver le site en supprimant ce lien symbolique :
a2dissite NomDeMonSite
# Lister les site activés :
ls /etc/apache2/sites-enabled/
# Lister les sites activables :
ls /etc/apache2/sites-available/
# Redémarrer Apache2 pour appliquer les modifications.
sudo apache2ctl restart

Options de configuration de VirtualHost

Il est possible de bloquer certaines actions avec les options des VirtualHosts.
Le fichier .htaccess peut également être utilisé pour configurer Apache2.
# Empêcher le listage des répertoires.
Options -Indexes
# Ne pas suivre les liens symboliques.
Options -FollowSymLinks
# Empêcher l'accès à une page avec sonNom.php ou sonNom.
Options -MultiViews
# Combiner plusieurs options.
Options -Indexes -FollowSymLinks -MultiViews
Ok-ko.png Exemples depuis la documentation : http://httpd.apache.org/docs/2.2/fr/vhosts/examples.html

VirtualHosts des domaines enregistrés

Les VirtualHosts des domaines enregistrés.

Le fichier de configuration htaccess

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>
Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess avec Apache2.
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]

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 [email protected]@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://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

Interdire le Hotlinking

Avec FilesMatch et ErrorDocument
SetEnvIfNoCase Referer "^https://www.visionduweb.fr/" good
SetEnvIfNoCase Referer "^$" good
<FilesMatch "\.(png|jpg|jpeg|gif|bmp|swf|flv)$">
Order Deny,Allow
Deny from all
Allow from env=good
ErrorDocument 403 https://www.visionduweb.fr/images/structure/no-hotlinking.png
</FilesMatch>
Avec RewriteCond
# Interdire l'affichage de nos 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]
# Interdire l'affichage de nos fichiers sur les sites non autorisés.
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 des images sur les sites non autorisés. Configuration minimaliste.
RewriteCond %{HTTP_REFERER} !^https://(.+\.)?visionduweb\.fr/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ https://www.visionduweb.fr/images/structure/no-hotlinking.png [L]
# Interdire l'affichage des images sur les sites non autorisés.
RewriteEngine on
# Divers formats images présents sur votre site qui seront protégés.
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*jpeg$|.*gif$|.*png$ [NC]
# Les sites suivants sont autorisés à afficher les images.
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 pour tester si votre configuration est fonctionnelle.
Chercher "Tester son Hotlinking" sur un moteur de recherche pour trouver des sites de test.
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.
Voir pourquoi.

Erreurs de mise en application

Il semble que ma redirection http vers https et www ait posée problème pour rediriger correctement les images avec la protection de hotlinking.
Tester le hotlinking depuis un site distant : https://soweclipse.000webhostapp.com/securite/hotlinking/
L'image "volée" ne s'affiche pas, mais, l'image de remplacement non plus.
Si je tente de forcer l'affichage de 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 mais l'image n'est pas affichée, sauf si je réactualise la demande d'affichage avec entrée.
A la place de l'image no-hotlinking, j'ai l'erreur :
ERR_TOO_MANY_REDIRECTS
Ou encore cette autre erreur lors du test d'un second code :
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.
Retester à nouveau cette règle mais ajouter par la suite le traitement de www comme proposé pour implémenter HSTS.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI}
Amélioration avec les flags de Apache2.
RewriteEngine On 
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^ https://www.visionduweb.fr%{REQUEST_URI} [R=301,L,NE]
# Le NE est nécessaire pour transmettre des éléments tels que les paramètres GET, etc., au nouvel URI sous forme inchangée, voir : http://httpd.apache.org/docs/2.4/rewrite/flags.html
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

Configurer un reverse proxy Apache - HTTP/HTTPS

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

Note de sécurité

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.

Sécurité avec Apache2 - 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 (?)
Voir également : port-knocking

Bibliographie

Ok.png La gestion des modules : https://technique.arscenic.org/lamp-linux-apache-mysql-php/apache-le-serveur-http/article/la-gestion-des-modules
Ok.png Activer ou désactiver un site sous apache 2 : http://www.billyboylindien.com/hebergement/memento-apache-ajout-suppression-de-site.html
Ok.png Désactiver la méthode HTTP TRACE sous Apache 2 : https://www.it-connect.fr/desactiver-la-methode-http-trace-sous-apache-2/
Ok.png VirtualHosts : https://wiki.gandi.net/fr/hosting/using-linux/tutorials/ubuntu/virtualhosts
Ok-ko.png Cours à télécharger pour approfondir la sécurité de vos configurations : https://www.cisecurity.org/cis-benchmarks/
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 Sécurité Apache 2 : Le B.A.-BA : https://jeanphi.net/blog/2013/06/securite-apache-2-le-baba
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 Sécuriser Apache2 : https://wiki.debian-fr.xyz/S%C3%A9curiser_Apache2
Ko.png https://www.mistra.fr/tutoriel-linux-serveur-web-apache2.html
Ko.png https://linux.goffinet.org/31_services_apache_http_server/
Ko.png http://debian-facile.org/doc:reseau:apache2:multisite
Ko.png https://www.tecmint.com/apache-security-tips/
Ko.png Htaccess Ultime : https://www.askapache.com/htaccess/
Ko.png Améliorer les performances de Apache2 : https://duckduckgo.com/?q=apache2+tuning&t=lm&ia=web

NAVIGATION

PARTICIPER ET PARTAGER

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

VALORISER LE WIKI

Valoriser le contenu partagé sur le wiki avec un don en monnaie numérique :
AEON - Bitcoins (BTC) - Bitcoins Cash - Bitcoins Gold - Bitcore (BTX) - Blackcoins - Bytecoins - Clams - Dash - Monero - Dogecoins - 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.
Miroir PlanetHoster du 1er Novembre 2018.