VirtualHosts des domaines enregistrés

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

Sommaire

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/
Activer mod rewrite et mod ssl :
sudo a2enmod rewrite
sudo a2enmod ssl
sudo systemctl restart apache2

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

139.99.173.195.conf

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

139.99.173.195 écoute du port HTTP 80

<VirtualHost 139.99.173.195:80>
# Mesure défensive.
# Il est fortement conseillé de tout interdire par défaut.
# Autoriser ensuite l'accès aux répertoires correspondant aux sites.

<Directory />
Require all denied
</Directory>

DocumentRoot /var/www/visionduweb.fr

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

139.99.173.195 écoute du port HTTP 443

Pas de configuration !
# Fait planter l'accès à https://www.visionduweb.fr ou au wiki https://wiki.visionduweb.fr
# <VirtualHost 139.99.173.195:443>
# Mesure défensive.
# Il est fortement conseillé de tout interdire par défaut.
# Autoriser ensuite l'accès aux répertoires correspondant aux sites.
# <Directory />
# Require all denied
# </Directory>
# DocumentRoot /var/www/visionduweb.fr
# 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 ^(.*)$ 139.99.173.195$1 [QSA,L,R=301]
# </IfModule>
# </VirtualHost>
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
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 : green-nrj.com, unis-pour-la-planete.com, unis-pour-le-climat.com, www.green-nrj.com, www.unis-pour-la-planete.com, www.unis-pour-le-climat.com Code d’erreur : SSL_ERROR_BAD_CERT_DOMAIN
Voir éventuellement si Iptables permet d'effectuer une redirection de IP:443 vers le domaine principale ?

Recharger la configuration de Apache2

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

green-adn.com

### Ce domaine n'est pas passé en https pour le moment, pour me permettre de continuer mes essais avec DemocracyOS, sans le https qui n'est pas encore mis en place.
# 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.conf
sudo nano green-adn.com.conf
# VirtualHost du domaine green-adn.com
<VirtualHost *:80>
ServerName www.green-adn.com
ServerAlias green-adn.com
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

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

# <Directory /var/www/html/democracyos>
# Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess avec Apache2.
# AllowOverride All
# </Directory>

# <Directory /var/www/html/redmine>
# RailsBaseURI /redmine
# PassengerResolveSymlinksInDocumentRoot on
# </Directory>

# La ligne <Location /redmine> indique le répertoire du site par rapport au documentroot /var/www/html défini dans Apache2.
# La ligne RackBaseURI /redmine indique l’url finale. Par exemple : http://localhost/redmine.
# <Location /redmine>
# RailsEnv production
# RackBaseURI /redmine
# Options -MultiViews
# </Location>
</VirtualHost>

Recharger la configuration de Apache2

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

green-adn.fr

### Ce domaine n'est pas passé en https pour le moment, pour me permettre de continuer mes essais avec DemocracyOS, sans le https qui n'est pas encore mis en place.
# 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
# VirtualHost du domaine green-adn.fr
<VirtualHost *:80>
ServerName www.green-adn.fr
ServerAlias green-adn.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

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

# <Directory /var/www/html/democracyos>
# Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess avec Apache2.
# AllowOverride All
# </Directory>

# <Directory /var/www/html/redmine>
# RailsBaseURI /redmine
# PassengerResolveSymlinksInDocumentRoot on
# </Directory>

# La ligne <Location /redmine> indique le répertoire du site par rapport au documentroot /var/www/html défini dans Apache2.
# La ligne RackBaseURI /redmine indique l’url finale. Par exemple : http://localhost/redmine.
# <Location /redmine>
# RailsEnv production
# RackBaseURI /redmine
# Options -MultiViews
# </Location>
</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.
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
</Directory>

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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 autoriser la consultation de ce message en cas d'erreur 403.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# Require all granted
# </Files>

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

# <Directory /var/www/html/democracyos>
# Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess avec Apache2.
# AllowOverride All
# </Directory>

# <Directory /var/www/html/redmine>
# RailsBaseURI /redmine
# PassengerResolveSymlinksInDocumentRoot on
# </Directory>

# Cette ligne indique le répertoire du site par rapport au documentroot /var/www/html défini dans Apache2.
# Cette ligne indique l’url finale. Par exemple : http://localhost/redmine.
# <Location /redmine>
# RailsEnv production
# RackBaseURI /redmine
# Options -MultiViews
</Location>

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

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

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# 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
</Directory>

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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 autoriser la consultation de ce message en cas d'erreur 403.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# 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
</Directory>

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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 autoriser la consultation de ce message en cas d'erreur 403.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# 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.fr
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
</Directory>

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# 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
</Directory>

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# 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

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

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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 autoriser la consultation de ce message en cas d'erreur 403.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# Require all granted
# </Files>

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

# <Directory /var/www/html/democracyos>
# Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess avec Apache2.
# AllowOverride All
# </Directory>

# <Directory /var/www/html/redmine>
# RailsBaseURI /redmine
# PassengerResolveSymlinksInDocumentRoot on
# </Directory>

# Cette ligne indique le répertoire du site par rapport au documentroot /var/www/html défini dans Apache2.
# Cette ligne indique l’url finale. Par exemple : http://localhost/redmine.
# <Location /redmine>
# RailsEnv production
# RackBaseURI /redmine
# Options -MultiViews
# </Location>

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

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

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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 autoriser la consultation de ce message en cas d'erreur 403.
# Voir a rajouter le fichier dans ce dépôt.
# <Files 403-forbidden.html>
# Require all granted
# </Files>

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

# <Directory /var/www/html/democracyos>
# Options FollowSymLinks
# Le AllowOverride permet la prise en compte du fichier .htaccess avec Apache2.
# AllowOverride All
# </Directory>

# <Directory /var/www/html/redmine>
# RailsBaseURI /redmine
# PassengerResolveSymlinksInDocumentRoot on
# </Directory>

# Cette ligne indique le répertoire du site par rapport au documentroot /var/www/html défini dans Apache2.
# Cette ligne indique l’url finale. Par exemple : http://localhost/redmine.
# <Location /redmine>
# RailsEnv production
# RackBaseURI /redmine
# Options -MultiViews
# </Location>

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

# 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>
ServerName visionduweb.fr
ServerAlias www.visionduweb.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/visionduweb.fr

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

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

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

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

AJOUTER visionduweb.info

# Le site visionduweb.info possède son propre dossier sur le serveur Apache2.
# /var/www/visionduweb.info
# 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

LE DESACTIVER ET LE PASSER EN ALIAS.
# 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.html>
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
ServerAlias www.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

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

# Protéger le fichier .htaccess :
<files .htaccess>
# Apache version 2.4 :
Require all denied
</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 autoriser la consultation de ce message en cas d'erreur 403.
# <Files 403-forbidden.html>
# Require all granted
# </Files>

# Erreur 403 - Forbidden.
ErrorDocument 403 https://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

visionduweb.user.fr

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

visionduweb.user.fr écoute du port HTTP 80

# VirtualHost du domaine visionduweb.user.fr
<VirtualHost *:80>
ServerName www.visionduweb.user.fr
ServerAlias visionduweb.user.fr
ServerAdmin mail@visionduweb.com
DocumentRoot /var/www/html/ftp/www

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

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

# ScriptAlias /cgi/ "/home/ftpuserone/cgi-bin/"

<Directory /var/www/html/ftp/www>
Options -Indexes
</Directory>
# php_admin_value open_basedir "/var/www/html/ftp/www"
</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/visionduweb.user.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.

Recharger la configuration de Apache2

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

Note

L'URL ne recharge pas durant la navigation.
Sûrement un problème du fichier index.php ou alors du à la redirection du sous domaine gratuit.
A suivre : Privilégier un vrai sous domaine : ftp.visionduweb.fr

NAVIGATION

PARTICIPER ET PARTAGER

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

VALORISER LE WIKI

Valoriser le contenu partagé sur le wiki avec un don en monnaie numérique :
AEON - Bitcoins (BTC) - Bitcoins Cash - Bitcoins Gold - Bitcore (BTX) - Blackcoins - Bytecoins - Clams - Dash - Monero - Dogecoins - Ethereum - Ethereum Classique - Litecoins - Potcoins - Solarcoins - Zcash

OBTENIR DE LA MONNAIE NUMERIQUE

Obtenir gratuitement de la monnaie numérique :
Gagner des Altcoins - Miner des Altcoins.
Miroir PlanetHoster du 11 Mars 2019.