VirtualHosts des domaines enregistrés

De Wiki Amis SH
Aller à la navigation Aller à la recherche



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


VirtualHosts des domaines enregistrés

Les VirtualHosts suivants ont été ajoutés sur le serveur VPS

# Les hôtes virtuels sont placés par défaut dans le dossier /etc/apache2/sites-available/.
cd /etc/apache2/sites-available/
# Les fichiers de configuration des VirtualHosts sont à donner à l'utiliser et au groupe root.
# Les dossiers et fichiers du site à l'utilisateur et au groupe www-data.
# Activer mod rewrite et mod ssl :
sudo a2enmod rewrite
sudo a2enmod ssl
sudo systemctl restart apache2
# Le script Bad Bot Blocker a également été installé pour limiter le passage des indésirables.

Optimiser les VirtualHost en supprimant les commentaires

# Sauvegarder une copie de la configuration existante par défaut :
sudo cp domaine.ext.conf domaine.ext.conf.defaut
# Enlever les commentaires par défaut sur le fichier de production :
sudo su
sudo more domaine.ext.conf.defaut | sed '/ *#/d; /^ *$/d' > domaine.ext.conf
exit
# Redémarrer Apache2 :
sudo service apache2 restart

000-default.conf

Désactiver la configuration par défaut.
sudo a2dissite 000-default.conf
Consulter la configuration par défaut :
sudo nano 000-default.conf
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html
       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Supprimer le fichier 000-default.conf.
cd /etc/apache2/sites-available
sudo rm 000-default.conf

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo service apache2 restart
# Privilégier cette commande pour redémarrer Apache2.
sudo apache2ctl restart
# Recharger PHP FPM si nécessaire.
sudo service php7.2-fpm restart

127.0.0.1.conf

Ce VirtualHost a pour objectif de loguer les requêtes effectuées par Apache en local.
Cela permet de gérer les messages Internal dummy connection dans un fichier séparé.
Normalement, ce message est uniquement affiché lors de connexions qui ne sont pas https.
Par exemple, lors de l'utilisation du serveur FTP via le navigateur, un message est sûrement écrit.
En fait, non, je ne vois pas d'écriture de message quand j'utilise le domaine redirigé qui mène aux fichiers du FTP.
Source : https://www.visionduweb.eu/wiki/index.php?title=Gestion_des_logs#Internal_dummy_connection
# Créer le fichier de configuration pour le VirtualHost.
sudo touch 127.0.0.1.conf
sudo chown root:root 127.0.0.1.conf
sudo chmod 644 127.0.0.1.conf
# Créer le fichier de log erreurs_local
sudo touch /var/log/apache2/access_local.log
sudo touch /var/log/apache2/erreurs_local.log
sudo chown root:adm /var/log/apache2/access_local.log
sudo chown root:adm /var/log/apache2/erreurs_local.log
# Ajouter la configuration suivante dans le fichier 127.0.0.1.conf
sudo nano 127.0.0.1.conf

Capturer les requêtes locales

<VirtualHost 127.0.0.1:80 [::1]:80>
 # Capturer les requêtes locales :
 ErrorLog ${APACHE_LOG_DIR}/erreurs_local.log
 CustomLog ${APACHE_LOG_DIR}/access_local.log combined
</VirtualHost>
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite 127.0.0.1.conf
sudo systemctl reload apache2

ethernium.fun

# Le site ethernium.fun possède son propre dossier sur le serveur Apache2.
# /var/www/ethernium.fun
# Créer le fichier de configuration pour le VirtualHost.
sudo touch ethernium.fun.conf
sudo chown root:root ethernium.fun.conf
sudo chmod 644 ethernium.fun.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite ethernium.fun.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier ethernium.fun.conf
sudo nano ethernium.fun.conf

ethernium.fun écoute du port HTTP 80

# VirtualHost du domaine ethernium.fun
## ## ## Port 80 ## ## ##
<VirtualHost ethernium.fun:80>
ServerName ethernium.fun
ServerAlias www.ethernium.fun

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/ethernium.fun

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

ethernium.fun écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost ethernium.fun:443>
ServerName ethernium.fun
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/ethernium.fun

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.ethernium.fun"
# Header set Content-Security-Policy: "default-src 'self' https://www.ethernium.fun; script-src 'self' 'unsafe-inline' https://www.ethernium.fun https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.ethernium.fun; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.ethernium.fun https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.ethernium.fun https://youtu.be; frame-src 'self' https://www.ethernium.fun https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.ethernium.fun https://fonts.gstatic.com data:; connect-src 'self' https://www.ethernium.fun; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/ethernium.fun/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ethernium.fun/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ethernium.fun/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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/ethernium.fun>
# Empêcher le suivi des liens symboliques.
# Suivre les liens symboliques pour prendre en compte le script 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. Je commente pour permettre au script Bad Bot Blocker de travailler.
# 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

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/visionduweb.fr/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de https www vers https sans www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ 
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L,NE,QSA]

# Interdire l'affichage des types de fichiers suivants sur les sites non autorisés.
# ethernium fun est autorisé.
RewriteCond %{HTTP_REFERER} !^https://ethernium.fun/ [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)$ https://www.visionduweb.fr/images/structure/no-hotlinking.png [L]
</IfModule>

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://ethernium.fun/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

ftp.visionduweb.fr

# VirtualHost pour le sous domaine pour rediriger vers le partage FTP de visionduweb.fr : ftp.visionduweb.fr
# Créer le fichier de configuration pour le VirtualHost.
sudo touch ftp.visionduweb.fr.conf
sudo chown root:root ftp.visionduweb.fr.conf
sudo chmod 644 ftp.visionduweb.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite ftp.visionduweb.fr.conf
sudo apache2ctl restart
# Ajouter la configuration suivante dans le fichier ftp.visionduweb.fr.conf
sudo nano ftp.visionduweb.fr.conf

ftp.visionduweb.fr écoute du port HTTP 80

<VirtualHost ftp.visionduweb.fr:80>
ServerName ftp.visionduweb.fr
ServerAdmin mail@visionduweb.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/ftp.visionduweb.fr/ftp/www

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>
# Suite à l'activation de PHP-FPM, je ne peux pas redémarrer Apache2 suite à la commande invalide suivante :
# Nov 23 01:40:25 vps178370 apachectl[17462]: AH00526: Syntax error on line 16 of /etc/apache2/sites-enabled/ftp.visionduweb.fr.conf:
# Nov 23 01:40:25 vps178370 apachectl[17462]: Invalid command 'php_admin_value', perhaps misspelled or defined by a module not included in the server configura
# Je met en commentaire la ligne : php_admin_value open_basedir "/tmp:/var/lib/php:/home/partageproftpd/www"
# Apache2 redémarre correctement en utilisant maintenant PHP-FPM.

ftp.visionduweb.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost ftp.visionduweb.fr:443>
ServerName ftp.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/ftp.visionduweb.fr/ftp/www

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error_ftp.log
CustomLog ${APACHE_LOG_DIR}/access_ftp.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://ftp.visionduweb.fr"
# La directive frame-ancestror permet de créer une exception pour le domaine gratuit du FTP et d'ignorer la commande Header always set X-Frame-Options "SAMEORIGIN".
# Le mieux sera de gérer directement un sous domaine pour gérer son adresse FTP.
Header set Content-Security-Policy: "frame-ancestors 'self' https://ftp.visionduweb.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.green-nrj.com; script-src 'self' 'unsafe-inline' https://www.green-nrj.com; object-src 'self' https://www.green-nrj.com; style-src 'self' 'unsafe-inline'; img-src 'self' https://www.green-nrj.com; media-src 'self' https://www.green-nrj.com; frame-src 'self' https://www.green-nrj.com; font-src 'self' 'unsafe-inline' https://www.green-nrj.com; connect-src 'self' https://www.green-nrj.com; frame-ancestors 'self' http://visionduweb.user.fr"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
# Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

# Contrôle du cache navigateur.
# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
# Désactiver le cache pour les scripts et fichiers dynamiques.
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
# Mettre en cache les éléments suivants.
<filesmatch "\.(gif|ico|jpe?g|png)$">
# Mise en cache de une année.
Header set Cache-Control "max-age=33566400, public"
# Économiser des requêtes de cookie sur les images.
# Si je décommente, je peux me connecter mais pas naviguer.
# https://forum.joomla.fr/forum/joomla-3-x/gestion-des-templates-design-css-et-bootstrap/2002540-boker-le-template-gratuit-de-globbersthemes
## RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesmatch>
<filesmatch "\.(html|htm|css)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, public"
</filesmatch>
<filesmatch "\.(js)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, private"
</filesmatch>
<filesmatch "\.(gz|pdf|ttf)$">
# Mise en cache de une année. (Je n'ai pas le type gz présent dans les entêtes Expires.)
Header set Cache-Control "max-age=33566400, public"
</filesmatch>
<filesmatch "\.(flv|swf)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=33566400, public"
</filesmatch>

# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/ftp.visionduweb.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ftp.visionduweb.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ftp.visionduweb.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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/ftp.visionduweb.fr/ftp/www>
# Empêcher le suivi des liens symboliques.
# Suivre les liens symboliques pour 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.
# Ne pas appliquer pour permettre 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on
# Interdire l'affichage des types de fichiers suivants sur les sites non autorisés.
# Visionduweb fr est autorisé.
# RewriteCond %{HTTP_REFERER} !^https://(.+.)?green-nrj.com/ [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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://ftp.visionduweb.fr/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl reload

AJOUTER gitignore.fr

# Une redirection visible est effectuée depuis OVH vers le sommaire de la page Git sur le wiki.

green-adn.com

# Créer le fichier de configuration pour le VirtualHost.
sudo touch green-adn.com.conf
sudo chown root:root green-adn.com.conf
sudo chmod 644 green-adn.com.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite green-adn.com.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier green-adn.com
sudo nano green-adn.com.conf

green-adn.com écoute du port HTTP 80

# VirtualHost du domaine green-adn.com
## ## ## Port 80 ## ## ##
<VirtualHost green-adn.com:80>
ServerName green-adn.com
ServerAlias www.green-adn.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/html

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

green-adn.com écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost green-adn.com:443>
ServerName green-adn.com
ServerAlias www.green-adn.com
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://www.green-adn.com"
# La directive frame-ancestror permet de créer une exception pour le domaine gratuit du FTP et d'ignorer la commande Header always set X-Frame-Options "SAMEORIGIN".
# Le mieux sera de gérer directement un sous domaine pour gérer son adresse FTP.
# Header set Content-Security-Policy: "frame-ancestors 'self' http://visionduweb.user.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.green-adn.com; script-src 'self' 'unsafe-inline' https://www.green-adn.com; object-src 'self' https://www.green-adn.com; style-src 'self' 'unsafe-inline'; img-src 'self' https://www.green-adn.com; media-src 'self' https://www.green-adn.com; frame-src 'self' https://www.green-adn.com; font-src 'self' 'unsafe-inline' https://www.green-adn.com; connect-src 'self' https://www.green-adn.com; frame-ancestors 'self' http://visionduweb.user.fr"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

# Contrôle du cache navigateur.
# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
# Désactiver le cache pour les scripts et fichiers dynamiques.
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
# Mettre en cache les éléments suivants.
<filesmatch "\.(gif|ico|jpe?g|png)$">
# Mise en cache de une année.
Header set Cache-Control "max-age=33566400, public"
# Économiser des requêtes de cookie sur les images.
# Si je décommente, je peux me connecter mais pas naviguer.
# https://forum.joomla.fr/forum/joomla-3-x/gestion-des-templates-design-css-et-bootstrap/2002540-boker-le-template-gratuit-de-globbersthemes
## RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesmatch>
<filesmatch "\.(html|htm|css)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, public"
</filesmatch>
<filesmatch "\.(js)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, private"
</filesmatch>
<filesmatch "\.(gz|pdf|ttf)$">
# Mise en cache de une année. (Je n'ai pas le type gz présent dans les entêtes Expires.)
Header set Cache-Control "max-age=33566400, public"
</filesmatch>
<filesmatch "\.(flv|swf)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=33566400, public"
</filesmatch>

# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/green-adn.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/green-adn.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/green-adn.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/green-adn.com/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</Directory>

<Directory /var/www/html>
# 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
# 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.2 :
# Toutes les requêtes sont autorisées.
# Fonctionne aussi sur Apache 2.4.
# Order allow,deny
# allow from all
#### Require forward-dns (Retour de la commande host hostname)
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?green-adn.com/ [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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://www.green-adn.com/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

green-adn.fr

# Créer le fichier de configuration pour le VirtualHost.
sudo touch green-adn.fr.conf
sudo chown root:root green-adn.fr.conf
sudo chmod 644 green-adn.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite green-adn.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier green-adn.fr
sudo nano green-adn.fr.conf

green-adn.fr écoute du port HTTP 80

# VirtualHost du domaine green-adn.fr
## ## ## Port 80 ## ## ##
<VirtualHost green-adn.fr:80>
ServerName green-adn.fr
ServerAlias www.green-adn.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/html

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

green-adn.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost green-adn.fr:443>
ServerName green-adn.fr
ServerAlias www.green-adn.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://www.green-adn.fr"
# La directive frame-ancestror permet de créer une exception pour le domaine gratuit du FTP et d'ignorer la commande Header always set X-Frame-Options "SAMEORIGIN".
# Le mieux sera de gérer directement un sous domaine pour gérer son adresse FTP.
# Header set Content-Security-Policy: "frame-ancestors 'self' http://visionduweb.user.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.green-adn.fr; script-src 'self' 'unsafe-inline' https://www.green-adn.fr; object-src 'self' https://www.green-adn.fr; style-src 'self' 'unsafe-inline'; img-src 'self' https://www.green-adn.fr; media-src 'self' https://www.green-adn.fr; frame-src 'self' https://www.green-adn.fr; font-src 'self' 'unsafe-inline' https://www.green-adn.fr; connect-src 'self' https://www.green-adn.fr; frame-ancestors 'self' http://visionduweb.user.fr"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

# Contrôle du cache navigateur.
# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
# Désactiver le cache pour les scripts et fichiers dynamiques.
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
# Mettre en cache les éléments suivants.
<filesmatch "\.(gif|ico|jpe?g|png)$">
# Mise en cache de une année.
Header set Cache-Control "max-age=33566400, public"
# Économiser des requêtes de cookie sur les images.
# Si je décommente, je peux me connecter mais pas naviguer.
# https://forum.joomla.fr/forum/joomla-3-x/gestion-des-templates-design-css-et-bootstrap/2002540-boker-le-template-gratuit-de-globbersthemes
## RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesmatch>
<filesmatch "\.(html|htm|css)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, public"
</filesmatch>
<filesmatch "\.(js)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, private"
</filesmatch>
<filesmatch "\.(gz|pdf|ttf)$">
# Mise en cache de une année. (Je n'ai pas le type gz présent dans les entêtes Expires.)
Header set Cache-Control "max-age=33566400, public"
</filesmatch>
<filesmatch "\.(flv|swf)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=33566400, public"
</filesmatch>

# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/green-adn.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/green-adn.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/green-adn.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/green-adn.fr/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</Directory>

<Directory /var/www/html>
# 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
# 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.2 :
# Toutes les requêtes sont autorisées.
# Fonctionne aussi sur Apache 2.4.
# Order allow,deny
# allow from all
#### Require forward-dns (Retour de la commande host hostname)
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?green-adn.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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://www.green-adn.fr/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

green-nrj.com

# Créer le fichier de configuration pour le VirtualHost.
sudo touch green-nrj.com.conf
sudo chown root:root green-nrj.com.conf
sudo chmod 644 green-nrj.com.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite green-nrj.com.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier green-nrj.com.conf
sudo nano green-nrj.com.conf

green-nrj.com écoute du port HTTP 80

### curl -I https://www.green-nrj.com
### HTTP/1.1 503 Service Unavailable
### Pourtant la page d'accueil de Joomla (Site hors ligne) est accessible.
### Si je passe le site en ligne, cette erreur disparaît.
### curl -I https://www.green-nrj.com
### HTTP/1.1 200 OK
### Résolu.
# VirtualHost du domaine green-nrj.com
## ## ## Port 80 ## ## ##
<VirtualHost green-nrj.com:80>
ServerName green-nrj.com
ServerAlias www.green-nrj.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/html/

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

green-nrj.com écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost green-nrj.com:443>
ServerName green-nrj.com
ServerAlias www.green-nrj.com
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://www.green-nrj.com"
# La directive frame-ancestror permet de créer une exception pour le domaine gratuit du FTP et d'ignorer la commande Header always set X-Frame-Options "SAMEORIGIN".
# Le mieux sera de gérer directement un sous domaine pour gérer son adresse FTP.
Header set Content-Security-Policy: "frame-ancestors 'self' http://visionduweb.user.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.green-nrj.com; script-src 'self' 'unsafe-inline' https://www.green-nrj.com; object-src 'self' https://www.green-nrj.com; style-src 'self' 'unsafe-inline'; img-src 'self' https://www.green-nrj.com; media-src 'self' https://www.green-nrj.com; frame-src 'self' https://www.green-nrj.com; font-src 'self' 'unsafe-inline' https://www.green-nrj.com; connect-src 'self' https://www.green-nrj.com; frame-ancestors 'self' http://visionduweb.user.fr"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

# Contrôle du cache navigateur.
# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
# Désactiver le cache pour les scripts et fichiers dynamiques.
<FilesMatch "\.(pl|php|cgi|spl|scgi|fcgi)$">
Header unset Cache-Control
</FilesMatch>
# Mettre en cache les éléments suivants.
<filesmatch "\.(gif|ico|jpe?g|png)$">
# Mise en cache de une année.
Header set Cache-Control "max-age=33566400, public"
# Économiser des requêtes de cookie sur les images.
# Si je décommente, je peux me connecter mais pas naviguer.
# https://forum.joomla.fr/forum/joomla-3-x/gestion-des-templates-design-css-et-bootstrap/2002540-boker-le-template-gratuit-de-globbersthemes
## RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesmatch>
<filesmatch "\.(html|htm|css)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, public"
</filesmatch>
<filesmatch "\.(js)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=604800, private"
</filesmatch>
<filesmatch "\.(gz|pdf|ttf)$">
# Mise en cache de une année. (Je n'ai pas le type gz présent dans les entêtes Expires.)
Header set Cache-Control "max-age=33566400, public"
</filesmatch>
<filesmatch "\.(flv|swf)$">
# Mise en cache de une semaine.
Header set Cache-Control "max-age=33566400, public"
</filesmatch>

# Ne pas mettre en cache si ces fichiers le sont déjà.
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/unis-pour-la-planete.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/unis-pour-la-planete.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/unis-pour-la-planete.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/visionduweb.fr/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</Directory>

<Directory /var/www/html>
# 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
# 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.2 :
# Toutes les requêtes sont autorisées.
# Fonctionne aussi sur Apache 2.4.
# Order allow,deny
# allow from all
#### Require forward-dns (Retour de la commande host hostname)
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?green-nrj.com/ [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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://www.green-nrj.com/403-forbidden.php
</VirtualHost>

Configuration de l'écoute du port TCP 3000

# Ne fonctionne pas. A voir par la suite.
# Aucun ajout de configuration.
# Le port 3000 est accessible, sans passer par une connexion sécurisée https.
# http://green-nrj.com:3000
# C'est au niveau de DemocracyOS (Installation avec Docker.) qu'il faudra chercher à configurer le SSL et une éventuelle redirection.

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

privatebin.visionduweb.fr

# Le site privatebin.visionduweb.fr possède son propre dossier sur le serveur Apache2.
# /var/www/privatebin.visionduweb.fr
# Créer le fichier de configuration pour le VirtualHost.
sudo touch privatebin.visionduweb.fr.conf
sudo chown root:root privatebin.visionduweb.fr.conf
sudo chmod 644 privatebin.visionduweb.fr.conf

# Créer les fichiers de log :
sudo su
touch /var/log/apache2/privatebin_erreurs.log
touch /var/log/apache2/privatebin_access.log
chown root:adm /var/log/apache2/privatebin_erreurs.log
chown root:adm /var/log/apache2/privatebin_access.log
exit

# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite privatebin.visionduweb.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier privatebin.visionduweb.fr.conf
sudo nano privatebin.visionduweb.fr.conf

privatebin.visionduweb.fr écoute du port HTTP 80

# VirtualHost du domaine privatebin.visionduweb.fr
## ## ## Port 80 ## ## ##
<VirtualHost privatebin.visionduweb.fr:80>
ServerName privatebin.visionduweb.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/privatebin.visionduweb.fr

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

privatebin.visionduweb.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost privatebin.visionduweb.fr:443>
ServerName privatebin.visionduweb.fr
ServerAdmin contacter@visionduweb.fr
DocumentRoot /var/www/privatebin.visionduweb.fr

# Définir la valeur open_basedir pour le wiki. ( A suivre. )
#SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/privatebin.visionduweb.fr/:/tmp/:/var/lib/php/sessions"
#SetEnv PHP_ADMIN_VALUE "open_basedir=none"

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/privatebin_erreurs.log
CustomLog ${APACHE_LOG_DIR}/privatebin_access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://privatebin.visionduweb.fr"
Header set Content-Security-Policy: "default-src 'self' https://privatebin.visionduweb.fr; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://privatebin.visionduweb.fr; object-src 'self' https://privatebin.visionduweb.fr; style-src 'self' 'unsafe-inline'; img-src 'self' https://privatebin.visionduweb.fr; media-src 'self' https://privatebin.visionduweb.fr; frame-src 'self' https://privatebin.visionduweb.fr; font-src 'self' 'unsafe-inline' https://privatebin.visionduweb.fr data:; connect-src 'self' https://privatebin.visionduweb.fr; frame-ancestors 'self'; upgrade-insecure-requests;"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Économiser les requêtes de cookies.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|js|pl|cgi|spl|scgi|fcgi)$">
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/privatebin.visionduweb.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/privatebin.visionduweb.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/privatebin.visionduweb.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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>
# Autoriser uniquement mon IP locale pour l'accès à l'administration.
# <Directory /var/www/privatebin.visionduweb.fr/administrator>
# Require all denied
# Require ip xx.xx.xxx.xx
# </Directory>

# Ensuite, on relâche un minimum de possibilités en fonction des besoins du site.
<Directory /var/www/privatebin.visionduweb.fr>
# Empêcher le suivi des liens symboliques.
# J'autorise le suivi des liens symboliques :
# Permet l'inclusion de la liste noire anti bad bots blocker.
# Depuis le fichier de configuration complémentaire.
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 :
# Require forward-dns 19.252.11.80.in-addr.arpa domain name pointer lmontsouris-657-1-225-19.w80-11.abo.wanadoo.fr.
## Contrôle d'accès Apache 2.4 :
# Toutes les requêtes sont autorisées. Est commenté pour prendre en compte le script anti bad bot blocker.
# 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

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
# Include custom.d/globalblacklist.conf
</Directory>
 
# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</files>
# Sur le même principe le fichier configuration.php du CMS peut être protégé.

# Interdire la lecture de certains fichiers :
<files ~ "\.(log|bak|defaut)$">
Require all denied
</files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden.*>
Require all granted
</Files>
# Toujours autoriser le favicon.
<Files favicon.ico>
Require all granted
</Files>
# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

# <IfModule mod_rewrite.c>
# RewriteEngine on
# Redirection de https www vers https sans www
# RewriteCond %{HTTP_HOST} ^www\.(.+)$ 
# RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L,NE,QSA]

# Interdire l'affichage des types de fichiers suivants sur les sites non autorisés.
# Visionduweb fr est autorisé.
# RewriteCond %{HTTP_REFERER} !^https://(.+.)?privatebin.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>

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

# 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.php>
Require all granted
</Files>
# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://privatebin.visionduweb.fr/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

redmine.lecannabiste.fr

# Créer le fichier de configuration pour le VirtualHost.
sudo touch redmine.lecannabiste.fr.conf
sudo chown root:root redmine.lecannabiste.fr.conf
sudo chmod 644 redmine.lecannabiste.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite redmine.lecannabiste.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier redmine.lecannabiste.fr.conf
sudo nano redmine.lecannabiste.fr.conf

redmine visionduweb.fr écoute du port HTTP 80

# VirtualHost du domaine redmine.lecannabiste.fr
## ## ## Port 80 ## ## ##
<VirtualHost redmine.lecannabiste.fr:80>
ServerName redmine.lecannabiste.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /opt/redmine/canna/public/
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

redmine.lecannabiste.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost redmine.lecannabiste.fr:443>
ServerName redmine.lecannabiste.fr
ServerAdmin mail@visionduweb.fr
DocumentRoot /opt/redmine/canna/public/
RailsBaseURI /
PassengerAppRoot /opt/redmine/canna
PassengerUser www-data
PassengerGroup www-data

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/redmine.error.log
CustomLog ${APACHE_LOG_DIR}/redmine.access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://redmine.lecannabiste.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.fr https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.visionduweb.fr https://youtu.be; frame-src 'self' https://www.visionduweb.fr https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.fr; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/redmine.lecannabiste.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/redmine.lecannabiste.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/redmine.lecannabiste.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>
# 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 /opt/redmine/canna/public/>
Options +Indexes +FollowSymLinks -MultiViews
AllowOverride All
# Je commente les lignes pour Apache 2.2. 
# Order allow,deny
# Allow from all
# Je remplace par les lignes pour Apache 2.4
Require all granted
# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

# <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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
# Couper le temps d'expiration en le passant à 0 seconds.
# Met fin au problème du wiki qui ne rafraîchit pas les informations texte entre deux éditions.
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# 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.php>
Require all granted
</Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

redmine.unis-pour-la-planete.com

# Créer le fichier de configuration pour le VirtualHost.
sudo touch redmine.unis-pour-la-planete.com.conf
sudo chown root:root redmine.unis-pour-la-planete.com.conf
sudo chmod 644 redmine.unis-pour-la-planete.com.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite redmine.unis-pour-la-planete.com.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier redmine.unis-pour-la-planete.com.conf
sudo nano redmine.unis-pour-la-planete.com.conf

redmine unis-pour-la-planete.com écoute du port HTTP 80

# VirtualHost du domaine redmine.unis-pour-la-planete.com
## ## ## Port 80 ## ## ##
<VirtualHost redmine.unis-pour-la-planete.com:80>
ServerName redmine.unis-pour-la-planete.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /opt/redmine/unis/public/
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

redmine.unis-pour-la-planete.com écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost redmine.unis-pour-la-planete.com:443>
ServerName redmine.unis-pour-la-planete.com
ServerAdmin mail@visionduweb.com
DocumentRoot /opt/redmine/unis/public/
RailsBaseURI /
PassengerAppRoot /opt/redmine/unis
PassengerUser www-data
PassengerGroup www-data

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/redmine.error.log
CustomLog ${APACHE_LOG_DIR}/redmine.access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://redmine.unis-pour-la-planete.com"
# Header set Content-Security-Policy: "default-src 'self' https://www.unis-pour-la-planete.com; script-src 'self' 'unsafe-inline' https://www.unis-pour-la-planete.com https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.unis-pour-la-planete.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.unis-pour-la-planete.com https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.unis-pour-la-planete.com https://youtu.be; frame-src 'self' https://www.unis-pour-la-planete.com https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.unis-pour-la-planete.com https://fonts.gstatic.com data:; connect-src 'self' https://www.unis-pour-la-planete.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/redmine.unis-pour-la-planete.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/redmine.unis-pour-la-planete.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/redmine.unis-pour-la-planete.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>
# 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 /opt/redmine/unis/public/>
Options +Indexes +FollowSymLinks -MultiViews
AllowOverride All
# Je commente les lignes pour Apache 2.2. 
# Order allow,deny
# Allow from all
# Je remplace par les lignes pour Apache 2.4
Require all granted
# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?unis-pour-la-planete.com/ [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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
# Couper le temps d'expiration en le passant à 0 seconds.
# Met fin au problème du wiki qui ne rafraîchit pas les informations texte entre deux éditions.
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# 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.php>
Require all granted
</Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

redmine.unis-pour-le-climat.com

# Créer le fichier de configuration pour le VirtualHost.
sudo touch redmine.unis-pour-le-climat.com.conf
sudo chown root:root redmine.unis-pour-le-climat.com.conf
sudo chmod 644 redmine.unis-pour-le-climat.com.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite redmine.unis-pour-le-climat.com.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier redmine.unis-pour-le-climat.com.conf
sudo nano redmine.unis-pour-le-climat.com.conf

redmine unis-pour-le-climat.com écoute du port HTTP 80

# VirtualHost du domaine redmine.unis-pour-le-climat.com
## ## ## Port 80 ## ## ##
<VirtualHost redmine.unis-pour-le-climat.com:80>
ServerName redmine.unis-pour-le-climat.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /opt/redmine/unis/public/
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

redmine.unis-pour-le-climat.com écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost redmine.unis-pour-le-climat.com:443>
ServerName redmine.unis-pour-le-climat.com
ServerAdmin mail@visionduweb.com
DocumentRoot /opt/redmine/unis/public/
RailsBaseURI /
PassengerAppRoot /opt/redmine/unis
PassengerUser www-data
PassengerGroup www-data

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/redmine.error.log
CustomLog ${APACHE_LOG_DIR}/redmine.access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://redmine.unis-pour-le-climat.com"
# Header set Content-Security-Policy: "default-src 'self' https://www.unis-pour-le-climat.com; script-src 'self' 'unsafe-inline' https://www.unis-pour-le-climat.com https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.unis-pour-le-climat.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.unis-pour-le-climat.com https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.unis-pour-le-climat.com https://youtu.be; frame-src 'self' https://www.unis-pour-le-climat.com https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.unis-pour-le-climat.com https://fonts.gstatic.com data:; connect-src 'self' https://www.unis-pour-le-climat.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/redmine.unis-pour-le-climat.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/redmine.unis-pour-le-climat.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/redmine.unis-pour-le-climat.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>
# 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 /opt/redmine/unis/public/>
Options +Indexes +FollowSymLinks -MultiViews
AllowOverride All
# Je commente les lignes pour Apache 2.2. 
# Order allow,deny
# Allow from all
# Je remplace par les lignes pour Apache 2.4
Require all granted
# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?unis-pour-le-climat.com/ [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]

RewriteCond %{HTTP_Host} ^redmine\.unis-pour-le-climat\.com$ [NC]
RewriteRule ^/robots\.txt$  /robots-miroir.txt [L]
</IfModule>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
# Couper le temps d'expiration en le passant à 0 seconds.
# Met fin au problème du wiki qui ne rafraîchit pas les informations texte entre deux éditions.
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# 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.php>
Require all granted
</Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

redmine.visionduweb.fr

# Créer le fichier de configuration pour le VirtualHost.
sudo touch redmine.visionduweb.fr.conf
sudo chown root:root redmine.visionduweb.fr.conf
sudo chmod 644 redmine.visionduweb.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite redmine.visionduweb.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier redmine.visionduweb.fr.conf
sudo nano redmine.visionduweb.fr.conf

redmine visionduweb.fr écoute du port HTTP 80

# VirtualHost du domaine redmine.visionduweb.fr
## ## ## Port 80 ## ## ##
<VirtualHost redmine.visionduweb.fr:80>
ServerName redmine.visionduweb.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /opt/redmine/vdw/public/
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

redmine.visionduweb.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost redmine.visionduweb.fr:443>
ServerName redmine.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /opt/redmine/vdw/public/
RailsBaseURI /
PassengerAppRoot /opt/redmine/vdw
PassengerUser www-data
PassengerGroup www-data

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/redmine.error.log
CustomLog ${APACHE_LOG_DIR}/redmine.access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://redmine.visionduweb.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.fr https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.visionduweb.fr https://youtu.be; frame-src 'self' https://www.visionduweb.fr https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.fr; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/redmine.visionduweb.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/redmine.visionduweb.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/redmine.visionduweb.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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 /opt/redmine/vdw/public/>
Options +Indexes +FollowSymLinks -MultiViews
AllowOverride All
# Je commente les lignes pour Apache 2.2. 
# Order allow,deny
# Allow from all
# Je remplace par les lignes pour Apache 2.4
Require all granted

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

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

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
# Couper le temps d'expiration en le passant à 0 seconds.
# Met fin au problème du wiki qui ne rafraîchit pas les informations texte entre deux éditions.
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# 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.php>
Require all granted
</Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

redmine.md-progressistes.fr

# Créer le fichier de configuration pour le VirtualHost.
sudo touch redmine.md-progressistes.fr.conf
sudo chown root:root redmine.md-progressistes.fr.conf
sudo chmod 644 redmine.md-progressistes.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite redmine.md-progressistes.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier redmine.md-progressistes.fr.conf
sudo nano redmine.md-progressistes.fr.conf

redmine visionduweb.fr écoute du port HTTP 80

# VirtualHost du domaine redmine.md-progressistes.fr
## ## ## Port 80 ## ## ##
<VirtualHost redmine.md-progressistes.fr:80>
ServerName redmine.md-progressistes.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /opt/redmine/mdp/public/
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

redmine.md-progressistes.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost redmine.md-progressistes.fr:443>
ServerName redmine.md-progressistes.fr
ServerAdmin mail@visionduweb.fr
DocumentRoot /opt/redmine/mdp/public/
RailsBaseURI /
PassengerAppRoot /opt/redmine/mdp
PassengerUser www-data
PassengerGroup www-data

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/redmine.error.log
CustomLog ${APACHE_LOG_DIR}/redmine.access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://redmine.md-progressistes.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.fr https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.visionduweb.fr https://youtu.be; frame-src 'self' https://www.visionduweb.fr https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.fr; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/redmine.md-progressistes.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/redmine.md-progressistes.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/redmine.md-progressistes.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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 /opt/redmine/mdp/public/>
Options +Indexes +FollowSymLinks -MultiViews
AllowOverride All
# Je commente les lignes pour Apache 2.2. 
# Order allow,deny
# Allow from all
# Je remplace par les lignes pour Apache 2.4
Require all granted

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

# <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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
# Couper le temps d'expiration en le passant à 0 seconds.
# Met fin au problème du wiki qui ne rafraîchit pas les informations texte entre deux éditions.
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# 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.php>
Require all granted
</Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

tiger-green.fr

# Le site tiger-green.fr possède son propre dossier sur le serveur Apache2.
# /var/www/tiger-green.fr
# Créer le fichier de configuration pour le VirtualHost.
sudo touch tiger-green.fr.conf
sudo chown root:root tiger-green.fr.conf
sudo chmod 644 tiger-green.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite tiger-green.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier tiger-green.fr.conf
sudo nano tiger-green.fr.conf

tiger-green.fr écoute du port HTTP 80

# VirtualHost du domaine tiger-green.fr
## ## ## Port 80 ## ## ##
<VirtualHost tiger-green.fr:80>
ServerName tiger-green.fr
ServerAlias www.tiger-green.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/tiger-green.fr

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

tiger-green.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost tiger-green.fr:443>
ServerName tiger-green.fr
ServerAlias www.tiger-green.fr
ServerAdmin contacter@visionduweb.fr
DocumentRoot /var/www/tiger-green.fr

# Définir la valeur open_basedir pour le wiki.
#SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/visionduweb.fr/:/tmp/:/var/lib/php/sessions"
#SetEnv PHP_ADMIN_VALUE "open_basedir=none"

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger contre les attaques utilisant X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.tiger-green.fr"
Header set Content-Security-Policy: "default-src 'self' https://www.tiger-green.fr https://secure.gravatar.com https://fonts.googleapis.com https://www.youtube.com; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.tiger-green.fr https://www.youtube.com https://s.ytimg.com; object-src 'self' https://www.tiger-green.fr; style-src 'self' 'unsafe-inline' https://www.tiger-green.fr https://fonts.googleapis.com; img-src 'self' https://www.tiger-green.fr https://secure.gravatar.com data:; media-src 'self' https://www.tiger-green.fr https://youtu.be https://www.youtube.com; frame-src 'self' https://www.tiger-green.fr https://www.youtube.com https://www.youtube-nocookie.com; font-src 'self' 'unsafe-inline' https://www.tiger-green.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.tiger-green.fr; frame-ancestors https://www.tiger-green.fr; upgrade-insecure-requests;"
# Header set Content-Security-Policy: "default-src 'self' https://www.tiger-green.fr;"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

# Forcer la version de PHP-FPM.
# <FilesMatch \.php$>
#       SetHandler "proxy:unix:/var/run/php/php7.3-fpm.sock|fcgi://localhost/"
# </FilesMatch>

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

# Économiser les requêtes de cookies.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|pl|cgi|spl|scgi|fcgi)$">
# Reste à remettre l'option "js" dans les choix plus haut, et, à réactiver le cache joomla/wordpress pour observer le fonctionnement.
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/tiger-green.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tiger-green.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/tiger-green.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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/tiger-green.fr>
# Empêcher le suivi des liens symboliques.
# J'autorise le suivi des liens symboliques :
# Permet l'inclusion de la liste noire anti bad bots blocker.
# Depuis le fichier de configuration complémentaire.
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

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

# Interdire l'utilisation de xmlrpc.php pour Apache 2.4 :
<Files xmlrpc.php>
Require all denied
# Require par IP permet uniquement l'accès au site depuis l'adresse IP fournie.
# Require ip xx.yyy.xx.zzz
</Files> 

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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.
# Tiger Green fr est autorisé.
RewriteCond %{HTTP_REFERER} !^https://(.+.)?tiger-green.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>

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
#<Files /var/www/tiger-green.fr/403-forbidden.php>
<Files 403-forbidden.php>
Require all granted
</Files>
<Files favicon.ico>
Require all granted
</Files>
<Files /images/structure/403-forbidden.jpg>
Require all granted
</Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.tiger-green.fr/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

top-du-bitcoin.info

# Le site top-du-bitcoin.info possède son propre dossier sur le serveur Apache2.
# /var/www/top-du-bitcoin.info
# Créer le fichier de configuration pour le VirtualHost.
sudo touch top-du-bitcoin.info.conf
sudo chown root:root top-du-bitcoin.info.conf
sudo chmod 644 top-du-bitcoin.info.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite top-du-bitcoin.info.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier top-du-bitcoin.info.conf
sudo nano top-du-bitcoin.info.conf

top-du-bitcoin.info écoute du port HTTP 80

# VirtualHost du domaine top-du-bitcoin.info
## ## ## Port 80 ## ## ##
<VirtualHost top-du-bitcoin.info:80>
ServerName top-du-bitcoin.info
ServerAlias www.top-du-bitcoin.info

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/top-du-bitcoin.info

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

top-du-bitcoin.info écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost top-du-bitcoin.info:443>
ServerName top-du-bitcoin.info
ServerAlias www.top-du-bitcoin.info
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/top-du-bitcoin.info

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.top-du-bitcoin.info"
# Header set Content-Security-Policy: "default-src 'self' https://www.top-du-bitcoin.info; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.top-du-bitcoin.info https://www.youtube.com https://unpkg.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.top-du-bitcoin.info; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.top-du-bitcoin.info https://i.ytimg.com https://secure.gravatar.com https://avatars3.githubusercontent.com; media-src 'self' https://www.top-du-bitcoin.info https://youtu.be; frame-src 'self' https://www.top-du-bitcoin.info https://www.youtube.com https://www.youtube-nocookie.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.top-du-bitcoin.info https://fonts.gstatic.com data:; connect-src 'self' https://www.top-du-bitcoin.info https://api.github.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
# Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Économiser les requêtes de cookies.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|js|pl|cgi|spl|scgi|fcgi)$">
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/top-du-bitcoin.info/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/top-du-bitcoin.info/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/top-du-bitcoin.info/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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/top-du-bitcoin.info>
# Empêcher le suivi des liens symboliques.
# J'autorise le suivi des liens symboliques :
# Permet l'inclusion de la liste noire anti bad bots blocker.
# Depuis le fichier de configuration complémentaire.
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 :
# Require forward-dns 19.252.11.80.in-addr.arpa domain name pointer lmontsouris-657-1-225-19.w80-11.abo.wanadoo.fr.
## Contrôle d'accès Apache 2.4 :
# Toutes les requêtes sont autorisées. Est commenté pour prendre en compte le script anti bad bot blocker.
# 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

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

# Interdire l'utilisation de xmlrpc.php pour Apache 2.4 :
<Files xmlrpc.php>
Require all denied
# Require par IP permet uniquement l'accès au site depuis l'adresse IP fournie.
# Require ip xx.yyy.xx.zzz
</Files> 

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</files>
# Sur le même principe le fichier configuration.php du CMS peut être protégé.

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?top-du-bitcoin.info/ [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>

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://top-du-bitcoin.info/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

unis-pour-la-planete.com

# Créer le fichier de configuration pour le VirtualHost.
sudo touch unis-pour-la-planete.com.conf
sudo chown root:root unis-pour-la-planete.com.conf
sudo chmod 644 unis-pour-la-planete.com.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite unis-pour-la-planete.com.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier unis-pour-la-planete.com.conf
sudo nano unis-pour-la-planete.com.conf

unis-pour-la-planete.com écoute du port HTTP 80

# VirtualHost du domaine unis-pour-la-planete.com
## ## ## Port 80 ## ## ##
<VirtualHost unis-pour-la-planete.com:80>
ServerName unis-pour-la-planete.com
ServerAlias www.unis-pour-la-planete.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /var/www/html
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

unis-pour-la-planete.com écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost unis-pour-la-planete.com:443>
ServerName unis-pour-la-planete.com
ServerAlias www.unis-pour-la-planete.com
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://www.unis-pour-la-planete.com"
# Header set Content-Security-Policy: "default-src 'self' https://www.unis-pour-la-planete.com; script-src 'self' 'unsafe-inline' https://www.unis-pour-la-planete.com https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.unis-pour-la-planete.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.unis-pour-la-planete.com https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.unis-pour-la-planete.com https://youtu.be; frame-src 'self' https://www.unis-pour-la-planete.com https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.unis-pour-la-planete.com https://fonts.gstatic.com data:; connect-src 'self' https://www.unis-pour-la-planete.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/unis-pour-la-planete.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/unis-pour-la-planete.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/unis-pour-la-planete.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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.
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.2 :
# Toutes les requêtes sont autorisées.
# Fonctionne aussi sur Apache 2.4.
# Order allow,deny
# allow from all
#### Require forward-dns (Retour de la commande host hostname)
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/unis-pour-la-planete.com/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?unis-pour-la-planete.com/ [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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# Limitations contre les DoS.
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://www.unis-pour-la-planete.com/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

unis-pour-le-climat.com

# Créer le fichier de configuration pour le VirtualHost.
sudo touch unis-pour-le-climat.com.conf
sudo chown root:root unis-pour-le-climat.com.conf
sudo chmod 644 unis-pour-le-climat.com.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite unis-pour-le-climat.com.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier unis-pour-le-climat.com.conf
sudo nano unis-pour-le-climat.com.conf

unis-pour-le-climat.com écoute du port HTTP 80

# VirtualHost du domaine unis-pour-le-climat.com
## ## ## Port 80 ## ## ##
<VirtualHost unis-pour-le-climat.com:80>
ServerName unis-pour-le-climat.com
ServerAlias www.unis-pour-le-climat.com

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Situation actuelle : Multi-domaines sur un seul certificat.
DocumentRoot /var/www/html
# Renouveler avec : sudo certbot --force-renewal renew

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

unis-pour-le-climat.com écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost unis-pour-le-climat.com:443>
ServerName unis-pour-le-climat.com
ServerAlias www.unis-pour-le-climat.com
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

Header set Access-Control-Allow-Origin: "default-src 'self' https://www.unis-pour-le-climat.com"
# Header set Content-Security-Policy: "default-src 'self' https://www.unis-pour-le-climat.com; script-src 'self' 'unsafe-inline' https://www.unis-pour-le-climat.com https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.unis-pour-le-climat.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.unis-pour-le-climat.com https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.unis-pour-le-climat.com https://youtu.be; frame-src 'self' https://www.unis-pour-le-climat.com https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.unis-pour-le-climat.com https://fonts.gstatic.com data:; connect-src 'self' https://www.unis-pour-le-climat.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/unis-pour-la-planete.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/unis-pour-la-planete.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/unis-pour-la-planete.com/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>
# 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.
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.2 :
# Toutes les requêtes sont autorisées.
# Fonctionne aussi sur Apache 2.4.
# Order allow,deny
# allow from all
#### Require forward-dns (Retour de la commande host hostname)
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/unis-pour-le-climat.com/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<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://(.+.)?unis-pour-le-climat.com/ [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>

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>
# Limitations contre les DoS.
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://www.unis-pour-le-climat.com/403-forbidden.php
</VirtualHost>

Configuration de l'écoute du port TCP 3000

# Ne fonctionne pas. A voir par la suite.
# Aucun ajout de configuration.
# Le port 3000 est accessible, sans passer par une connexion sécurisée https.
# http://unis-pour-le-climat.com:3000
# C'est au niveau de DemocracyOS (Installation avec Docker.) qu'il faudra chercher à configurer le SSL et une éventuelle redirection.

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

visionduweb.fr

# Le site visionduweb.fr possède son propre dossier sur le serveur Apache2.
# /var/www/visionduweb.fr
# Créer le fichier de configuration pour le VirtualHost.
sudo touch visionduweb.fr.conf
sudo chown root:root visionduweb.fr.conf
sudo chmod 644 visionduweb.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite visionduweb.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier visionduweb.fr.conf
sudo nano visionduweb.fr.conf

visionduweb.fr écoute du port HTTP 80

# <MDomain visionduweb.fr>
# MDCertificateFile /etc/letsencrypt/live/visionduweb.fr/cert.pem
# MDCertificateKeyFile /etc/letsencrypt/live/visionduweb.fr/privkey.pem
# </Mdomain>
# Invalid command '<MDomain', perhaps misspelled or defined by a module not included in the server configuration
# VirtualHost du domaine visionduweb.fr
## ## ## Port 80 ## ## ##
<VirtualHost visionduweb.fr:80>
ServerName visionduweb.fr
ServerAlias www.visionduweb.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/visionduweb.fr

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

visionduweb.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost visionduweb.fr:443>
# Ajouter pour chaque VirtualHost, ou, au niveau global de la configuration, la commande suivante pour activer HTTP/2.
# L'activation du module semble suffire à généraliser l'activation de HTTP/2 sans même avoir à renseigner le VirtualHost, Wappanalyser indiquant que tous mes sites sont en HTTP/2.
# On préférera renseigner la ligne pour activer HTTP/2, si disponible, depuis chaque VirtualHost :
Protocols h2 h2c http/1.1

ServerName visionduweb.fr
ServerAlias www.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/visionduweb.fr

# Définir la valeur open_basedir pour le wiki. ( A suivre. )
#SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/visionduweb.fr/:/tmp/:/var/lib/php/sessions"
SetEnv PHP_ADMIN_VALUE "open_basedir=none"

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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"
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.ebwidget.com https://www.youtube.com https://unpkg.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.fr https://thumbs2.ebaystatic.com https://thumbs3.ebaystatic.com https://thumbs4.ebaystatic.com https://pics.ebaystatic.com https://i.ytimg.com https://secure.gravatar.com https://avatars3.githubusercontent.com; media-src 'self' https://www.visionduweb.fr https://youtu.be; frame-src 'self' https://www.visionduweb.fr https://www.youtube.com https://www.youtube-nocookie.com https://cdn.jsdelivr.net https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.fr https://api.github.com; frame-ancestors 'self'; upgrade-insecure-requests;"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Économiser les requêtes de cookies.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|js|pl|cgi|spl|scgi|fcgi)$">
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/visionduweb.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/visionduweb.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/visionduweb.fr/chain.pem

# Proposé avec le générateur SSL de Mozilla : https://ssl-config.mozilla.org
# Configuration tolérante pour les anciens appareils :
SSLProtocol             all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
 # En autorisant les Ciphers suivant, les outils de monitoring sous Android continuerons de fonctionner :
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLSessionTickets       off

SSLCompression off
SSLOptions +StrictRequire
</IfModule>

# 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>

# Autoriser uniquement mon IP locale pour l'accès à l'administration.
<Directory /var/www/visionduweb.fr/administrator>
Require all denied
Require ip xx.xx.xxx.xx
</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.
# J'autorise le suivi des liens symboliques :
# Permet l'inclusion de la liste noire anti bad bots blocker.
# Depuis le fichier de configuration complémentaire.
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 :
# Require forward-dns 19.252.11.80.in-addr.arpa domain name pointer lmontsouris-657-1-225-19.w80-11.abo.wanadoo.fr.
## Contrôle d'accès Apache 2.4 :
# Toutes les requêtes sont autorisées. Est commenté pour prendre en compte le script anti bad bot blocker.
# 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

# Inclure le script de liste noire anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>
 
# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</files>
# Sur le même principe le fichier configuration.php du CMS peut être protégé.

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

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

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

# 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.php>
Require all granted
</Files>
# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://www.visionduweb.fr/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

visionduweb.eu

# Le site visionduweb.eu possède son propre dossier sur le serveur Apache2.
# /var/www/visionduweb.eu
# Non !
# Créer le fichier de configuration pour le VirtualHost.
sudo touch visionduweb.eu.conf
sudo chown root:root visionduweb.eu.conf
sudo chmod 644 visionduweb.eu.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite visionduweb.eu.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier visionduweb.eu.conf
sudo nano visionduweb.eu.conf

visionduweb.eu écoute du port HTTP 80

# VirtualHost du domaine visionduweb.eu
## ## ## Port 80 ## ## ##
<VirtualHost visionduweb.eu:80>
ServerName visionduweb.eu
ServerAlias www.visionduweb.eu

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/visionduweb.eu

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

visionduweb.eu écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost visionduweb.eu:443>
ServerName visionduweb.eu
ServerAlias www.visionduweb.eu
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/visionduweb.eu

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.eu"
Header set Content-Security-Policy: "default-src 'self' https://www.visionduweb.eu; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.visionduweb.eu https://www.youtube.com https://unpkg.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.eu; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.eu https://i.ytimg.com https://secure.gravatar.com https://avatars3.githubusercontent.com; media-src 'self' https://www.visionduweb.eu https://youtu.be; frame-src 'self' https://www.visionduweb.eu https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.eu https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.eu https://api.github.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Économiser les requêtes de cookies.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|js|pl|cgi|spl|scgi|fcgi)$">
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/visionduweb.eu/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/visionduweb.eu/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/visionduweb.eu/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

<Directory /var/www/visionduweb.eu>
# 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
# 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.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 :
# Uniquement les requêtes de visionduweb.eu sont autorisées.
# Pourtant cela ne fonctionne pas ! You don't have permission to access / on this server.
#<RequireAll>
#Require host monhostname
#</RequireAll>
####Require forward-dns alien
## 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
# Contrôle d'accès Apache 2.4 :
# 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>
# Sur le même principe le fichier configuration.php du CMS peut être protégé.

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

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

# 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.php>
Require all granted
</Files>
# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.eu/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

visionduweb.info

# Le site visionduweb.info possède son propre dossier sur le serveur Apache2.
# /var/www/visionduweb.info
# Non !
# Créer le fichier de configuration pour le VirtualHost.
sudo touch visionduweb.info.conf
sudo chown root:root visionduweb.info.conf
sudo chmod 644 visionduweb.info.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite visionduweb.info.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier visionduweb.info.conf
sudo nano visionduweb.info.conf

visionduweb.info écoute du port HTTP 80

# VirtualHost du domaine visionduweb.info
## ## ## Port 80 ## ## ##
<VirtualHost visionduweb.info:80>
ServerName visionduweb.info
ServerAlias www.visionduweb.info

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/visionduweb.info

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

visionduweb.info écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost visionduweb.info:443>
ServerName visionduweb.info
ServerAlias www.visionduweb.info
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/visionduweb.info

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.info"
Header set Content-Security-Policy: "default-src 'self' https://www.visionduweb.info; script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.visionduweb.info https://www.youtube.com https://unpkg.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.visionduweb.info; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.visionduweb.info https://i.ytimg.com https://secure.gravatar.com https://avatars3.githubusercontent.com; media-src 'self' https://www.visionduweb.info https://youtu.be; frame-src 'self' https://www.visionduweb.info https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.visionduweb.info https://fonts.gstatic.com data:; connect-src 'self' https://www.visionduweb.info https://api.github.com; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Économiser les requêtes de cookies.
# L'extension php n'est pas ajoutée, sinon, impossible de se connecter au site.
<filesMatch "\\.(ico|jpe?g|png|gif|svg|swf|gz|ttf|eot|woff|html|htm|css|js|pl|cgi|spl|scgi|fcgi)$">
RequestHeader unset Cookie
Header unset Cookie
Header unset Set-Cookie
</filesMatch>
</IfModule>

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/visionduweb.info/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/visionduweb.info/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/visionduweb.info/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

<Directory /var/www/visionduweb.info>
# 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
# 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.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 :
# Uniquement les requêtes de visionduweb.info sont autorisées.
# Pourtant cela ne fonctionne pas ! You don't have permission to access / on this server.
#<RequireAll>
#Require host monhostname
#</RequireAll>
####Require forward-dns alien
## 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
# Contrôle d'accès Apache 2.4 :
# 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>
# Sur le même principe le fichier configuration.php du CMS peut être protégé.

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

# Désactiver Etag.
FileETag none
# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

# 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.php>
Require all granted
</Files>
# Erreur 403 - Forbidden.
ErrorDocument 403 https://www.visionduweb.info/403-forbidden.php

</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

wiki.visionduweb.fr

# Le site wiki.visionduweb.fr possède son propre dossier sur le serveur Apache2.
# /var/www/wiki.visionduweb.fr
# Créer le fichier de configuration pour le VirtualHost.
sudo touch wiki.visionduweb.fr.conf
sudo chown root:root wiki.visionduweb.fr.conf
sudo chmod 644 wiki.visionduweb.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite wiki.visionduweb.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier wiki.visionduweb.fr.conf
sudo nano wiki.visionduweb.fr.conf

wiki.visionduweb.fr écoute du port HTTP 80

# VirtualHost du domaine wiki.visionduweb.fr
## ## ## Port 80 ## ## ##
<VirtualHost wiki.visionduweb.fr:80>
ServerName wiki.visionduweb.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/wiki.visionduweb.fr

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

wiki.visionduweb.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost wiki.visionduweb.fr:443>
ServerName wiki.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/wiki.visionduweb.fr

# Définir la valeur open_basedir pour le wiki.
# SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/wiki.visionduweb.fr/:/tmp/"

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.wiki.visionduweb.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.wiki.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.wiki.visionduweb.fr https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.wiki.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.wiki.visionduweb.fr https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.wiki.visionduweb.fr https://youtu.be; frame-src 'self' https://www.wiki.visionduweb.fr https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.wiki.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.wiki.visionduweb.fr; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/wiki.visionduweb.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/wiki.visionduweb.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/wiki.visionduweb.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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/wiki.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
# 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.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 :
# Uniquement les requêtes de wiki.visionduweb.fr sont autorisées.
# Pourtant cela ne fonctionne pas ! You don't have permission to access / on this server.
#<RequireAll>
#Require host monhostname
#</RequireAll>
####Require forward-dns alien
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on
# Interdire l'affichage des types de fichiers suivants sur les sites non autorisés.
# Visionduweb fr est autorisé.
RewriteCond %{HTTP_REFERER} !^https://wiki.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)$ https://www.visionduweb.fr/images/structure/no-hotlinking.png [L]
</IfModule>

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://wiki.visionduweb.fr/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

mediawiki.visionduweb.fr

# Le site mediawiki.visionduweb.fr utilise le dossier du site déjà existant sur le serveur Apache2.
# /var/www/wiki.visionduweb.fr
# Ce VirtualHost permet de contourner la censure mise en place par Facebook sur mon wiki !
# Créer le fichier de configuration pour le VirtualHost.
sudo touch mediawiki.visionduweb.fr.conf
sudo chown root:root mediawiki.visionduweb.fr.conf
sudo chmod 644 mediawiki.visionduweb.fr.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration.
sudo a2ensite mediawiki.visionduweb.fr.conf
sudo service apache2 restart
# Ajouter la configuration suivante dans le fichier mediawiki.visionduweb.fr.conf
sudo nano mediawiki.visionduweb.fr.conf

mediawiki.visionduweb.fr écoute du port HTTP 80

# VirtualHost du domaine mediawiki.visionduweb.fr
## ## ## Port 80 ## ## ##
<VirtualHost mediawiki.visionduweb.fr:80>
ServerName mediawiki.visionduweb.fr

# Ce vhost redirige de http vers https. 100% du trafic doit passer par https.
# Les informations complémentaires sont inutiles. Pas de documentRoot, pas de logs.

# La ligne suivante peut-être conservée dans le cas suivant :
# Forcer le renouvellement ou recréer le certificat Let's Encrypt.
# Renouveler avec : sudo certbot --force-renewal renew
DocumentRoot /var/www/wiki.visionduweb.fr

<IfModule mod_rewrite.c>
RewriteEngine on
# Redirection de http vers https.
RewriteCond %{HTTPS} off
# Le dossier .well-know de certbot doit être exclu de la réécriture d'URL.
RewriteRule (^|/)\.(?!well-known) - [F]
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</IfModule>
</VirtualHost>

mediawiki.visionduweb.fr écoute du port SSL 443

## ## ## Port 443 ## ## ##
<VirtualHost mediawiki.visionduweb.fr:443>
ServerName mediawiki.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/wiki.visionduweb.fr

# Définir la valeur open_basedir pour le wiki.
# SetEnv PHP_ADMIN_VALUE "open_basedir=/var/www/mediawiki.visionduweb.fr/:/tmp/"

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# CSP - Politique de sécurité du contenu.
<IfModule mod_headers.c>
# Charger l'entête HSTS.
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

# Sécuriser les Cookies.
# Interdire l’utilisation du cookie côté client avec l’instruction HttpOnly.
# Interdire l’utilisation du cookie sans HTTPs avec le flag Secure.
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# Protéger des failles X-XSS X-Frame X-Content.
Header set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options nosniff

# 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.mediawiki.visionduweb.fr"
# Header set Content-Security-Policy: "default-src 'self' https://www.mediawiki.visionduweb.fr; script-src 'self' 'unsafe-inline' https://www.mediawiki.visionduweb.fr https://www.youtube.com https://s.ytimg.com https://www.google.com https://www.gstatic.com; object-src 'self' https://www.mediawiki.visionduweb.fr; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' https://www.mediawiki.visionduweb.fr https://i.ytimg.com https://secure.gravatar.com; media-src 'self' https://www.mediawiki.visionduweb.fr https://youtu.be; frame-src 'self' https://www.mediawiki.visionduweb.fr https://www.youtube.com https://www.coingecko.com https://hackbbs.org:7777 https://www.spreaker.com https://widget.spreaker.com https://www.google.com; font-src 'self' 'unsafe-inline' https://www.mediawiki.visionduweb.fr https://fonts.gstatic.com data:; connect-src 'self' https://www.mediawiki.visionduweb.fr; frame-ancestors 'self'"

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

# Identique à CSP mais au lieu de contrôler la sécurité c'est un contrôle des fonctionnalités.
Header always set Feature-Policy "geolocation none;midi none;notifications none;push none;sync-xhr self;microphone none;camera none;magnetometer none;gyroscope none;speaker self;vibrate none;fullscreen self;payment none;"

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

# Charger le certificat Let's Encrypt.
<IfModule mod_ssl.c>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mediawiki.visionduweb.fr/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mediawiki.visionduweb.fr/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mediawiki.visionduweb.fr/chain.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCompression off
SSLOptions +StrictRequire
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
</IfModule>

# 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/wiki.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
# 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.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 :
# Uniquement les requêtes de mediawiki.visionduweb.fr sont autorisées.
# Pourtant cela ne fonctionne pas ! You don't have permission to access / on this server.
#<RequireAll>
#Require host monhostname
#</RequireAll>
####Require forward-dns alien
## 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
# Contrôle d'accès Apache 2.4 :
# 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 anti bad bots :
# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/blob/master/Apache_2.4/README.md
Include custom.d/globalblacklist.conf
</Directory>

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

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<IfModule mod_rewrite.c>
RewriteEngine on
# Interdire l'affichage des types de fichiers suivants sur les sites non autorisés.
# Visionduweb fr est autorisé.
RewriteCond %{HTTP_REFERER} !^https://mediawiki.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)$ https://www.visionduweb.fr/images/structure/no-hotlinking.png [L]

RewriteCond %{HTTP_Host} ^mediawiki\.visionduweb\.fr$ [NC]
RewriteRule ^/robots\.txt$  /robots-miroir.txt [L]
</IfModule>

# Désactiver Etag.
FileETag none

# Activer la compression.
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/plain
</IfModule>

# DEFLATE pour les navigateurs non compatibles.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Mise en cache du navigateur.
<IfModule mod_expires.c>
ExpiresActive On
# Mise en cache par défaut du navigateur.
ExpiresDefault "access plus 1 month"
# Images.
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
AddType image/svg+xml .svg
ExpiresByType image/svg+xml "access plus 1 year"
AddType image/x-icon .ico
ExpiresByType image/ico "access plus 1 year"
ExpiresByType image/icon "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# Structure du site.
ExpiresByType application/xhtml+xml "access plus 1 week"
ExpiresByType text/html "access plus 1 week"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/x-javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType application/x-javascript "access plus 1 week"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
# Documents.
ExpiresByType application/pdf "access plus 1 year"
# Polices.
AddType application/vnd.ms-fontobject .eot
AddType application/x-font-ttf .ttf
AddType application/x-font-opentype .otf
AddType application/x-font-woff .woff
ExpiresByType application/vnd.ms-fontobject "access 1 year"
ExpiresByType application/x-font-ttf "access 1 year"
ExpiresByType application/x-font-opentype "access 1 year"
ExpiresByType application/x-font-woff "access 1 year"
</IfModule>

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

# Toujours refuser la lecture des fichiers de log.
<Files *.log>
Require all denied
</Files>

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden*>
Require all granted
</Files>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 https://wiki.visionduweb.fr/403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

xyz-139.99.173.195.conf

# Créer le fichier de configuration pour le VirtualHost xyz-139.99.173.195.conf qui est positionné à la fin des VirtualHost du fait de son nom :
sudo touch xyz-139.99.173.195.conf
sudo chown root:root xyz-139.99.173.195.conf
sudo chmod 644 xyz-139.99.173.195.conf
# Activer le site et redémarrer Apache2 pour appliquer la nouvelle configuration :
sudo a2ensite xyz-139.99.173.195.conf
sudo service apache2 restart
# Créer le dossier /var/www/139.99.173.195 et un fichier index.html
sudo mkdir /var/www/139.99.173.195
sudo touch /var/www/139.99.173.195/index.html
# Ajouter la configuration suivante dans le fichier xyz-139.99.173.195.conf :
sudo nano xyz-139.99.173.195.conf

139.99.173.195 écoute du port HTTP 80

<VirtualHost 139.99.173.195:80>
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/139.99.173.195

# ServerName 139.99.173.195

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/ip-error.log
CustomLog ${APACHE_LOG_DIR}/ip-access.log combined

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/ip-error.log
CustomLog ${APACHE_LOG_DIR}/ip-access.log combined

# Erreur 403 - Forbidden.
<Files 403-forbidden.*>
Require all granted
</Files>
<Files favicon.ico>
Require all granted
</Files>
<Files robots.txt>
Require all granted
</Files>

<Directory />
Require all denied
</Directory>

<Directory /var/www/139.99.173.195>
Require all denied
</Directory>

# Rediriger l'adresse IP vers le domaine par défaut en https.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^139.99.173.195$
RewriteRule ^(.*)$ https://www.visionduweb.fr$1 [QSA,L,R=301]
</IfModule>

ErrorDocument 403 /403-forbidden.php
</VirtualHost>

139.99.173.195 écoute du port HTTP 443

Si aucune configuration n'est ajoutée

# Si aucune configuration n'est ajoutée !
# La requête vers 139.99.173.195:443 affiche :
Bad Request
Your browser sent a request that this server could not understand.
Reason: You're speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.
Apache/2.4.38 (Debian) Server at green-nrj.com Port 80
# La requête vers https://139.99.173.195 affiche :
139.99.173.195 utilise un certificat de sécurité invalide. Le certificat n’est valide que pour les noms suivants : ethernium.fun Code d’erreur : SSL_ERROR_BAD_CERT_DOMAIN

Si la configuration suivante est ajoutée

<VirtualHost 139.99.173.195:443>
# Rediriger l'adresse IP vers le domaine par défaut en https.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^139.99.173.195$
RewriteRule ^(.*)$ https://www.visionduweb.fr$1 [QSA,L,R=301]
</IfModule>
</VirtualHost>
# La requête vers visionduweb.fr affiche :
Une erreur est survenue pendant une connexion à www.visionduweb.fr. SSL a reçu un enregistrement qui dépasse la longueur maximale autorisée.
Code d’erreur : SSL_ERROR_RX_RECORD_TOO_LONG

La page que vous essayez de consulter ne peut pas être affichée car l'authenticité des données reçues ne peut être vérifiée.
Veuillez contacter les propriétaires du site web pour les informer de ce problème.

La configuration actuelle pour bloquer l'accès au serveur depuis son adresse IP sur le port 443

# Cette configuration fonctionne pour les VirtualHost du VPS et les domaines utilisant les DNS de OVH.
# Le site tiger-green.fr avec les DNS de Cloudflare et SSL/TLS FULL/Strict n'était plus accessible quand le nommage du VirtualHost était 139.99.173.195.conf
# Les erreurs Cloudflare 525 ou 526 étaient affichées. Renommer le VirtualHost 139.99.173.195.conf pour le positionner à la fin de la liste a corriger ce problème.
<VirtualHost 139.99.173.195:443>
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/139.99.173.195

# ServerName 139.99.173.195

# Comportement par défaut du niveau d'alerte retourné.
# LogLevel warn
ErrorLog ${APACHE_LOG_DIR}/ip-error.log
CustomLog ${APACHE_LOG_DIR}/ip-access.log combined

# Toujours autoriser la consultation de ce message en cas d'erreur 403.
<Files 403-forbidden.*>
Require all granted
</Files>
# Toujours autoriser le favicon.
<Files favicon.ico>
Require all granted
</Files>

# Toujours autoriser la consultation du fichier robots.txt :
<Files robots.txt>
Require all granted
</Files>

<Directory />
Require all denied
</Directory>

<Directory /var/www/139.99.173.195>
Require all denied
</Directory>

# Le certificat suivant n'est pas utilisé et ne sert que pour valider la configuration.
# C'est celui du VirtualHost par défaut ethernium.fun qui sera comparé.
# Il ne correspondra pas à l'adresse IP. La page 403 prend le relais.
<IfModule mod_ssl.c>
SSLEngine on

# Ce certificat ne sert que pour valider la configuration du VirtualHost par défaut sur IP.
# C'est le certificat ethernium.fun qui est présenté pour https://139.99.173.195
# La page 403 prend le relais.

# Création d'un certificat méthode une :
# sudo mkdir /etc/apache2/ssl
# sudo openssl req -new -x509 -days 365 -nodes -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem
# SSLCertificateFile /etc/apache2/ssl/apache.pem

# Création d'un certificat méthode deux :
# Permet de résoudre le message :
# RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE)
# sudo mkdir /etc/apache2/ssl
# cd /etc/apache2/ssl
# Générer une clé privée et une demande de signature de certificat :
# sudo openssl genrsa -des3 -out server.pass.key 4096
# Ajouter le mot de passe : Pass
# sudo openssl rsa -passin pass:Pass -in server.pass.key -out server.key
# sudo rm server.pass.key
# sudo openssl req -new -key server.key -out server.csr
# Générer le certificat SSL :
# sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
SSLCertificateChainFile /etc/apache2/ssl/server.csr
# En cas d'appel du site https://139.99.173.195 c'est le certificat ethernium.fun qui est proposé.
# Le certificat ne match pas.

# ErrorLog /var/log/apache2/ssl_test_cloudflare.log
# LogLevel debug
</IfModule>

# Rediriger l'adresse IP vers le domaine par défaut en https.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^139.99.173.195$
RewriteRule ^(.*)$ https://www.visionduweb.fr$1 [QSA,L,R=301]
</IfModule>

# Erreur 403 - Forbidden.
# Une adresse absolue charge l'url vers la nouvelle page.
# Une adresse relative ne change pas l'url mais uniquement le contenu.
ErrorDocument 403 /403-forbidden.php
</VirtualHost>

Recharger la configuration de Apache2

# Recharger la configuration de Apache2 pour appliquer la nouvelle configuration.
sudo apache2ctl restart

NAVIGATION

PARTICIPER ET PARTAGER

Bienvenue sur le wiki de Amis SH.
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 Amis SH vous permet de poser vos questions.
Consulter le site amis-sh.fr pour installer votre propre serveur web.
Améliorer le contenu des pages avec vos retours depuis l'onglet discussion.
Ce contenu ne doit pas servir à nuire à autrui ou à un système informatique.
Protéger votre système Linux ou Windows avec cette page dédiée à la sécurité.

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 :
Miner de la cryptomonnaie.