Lorsque l’on conçoit un site internet, la question de la sécurité se pose et en premier lieu la mise en place d’un certificat HTTPS. Cependant, il est possible de faire bien plus que de simplement sécuriser la connexion. La configuration du serveur Apache (ou du fichier .htaccess
pour les hébergements mutualisés) permet d’augmenter le niveau de sécurité du site web et d’optimiser sa consultation en optimisant les ressources consommées par l’utilisation de celui-ci.
Cet article condense un ensemble de règles à mettre en place pour sécuriser, mettre en cache et compresser les requêtes d’un site.
Sécurité
Au delà de la mise en place d’un certificat HTTPS, plusieurs règles permettent de vraiment sécuriser un site internet.
# Forcer la redirection vers HTTPS <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] </IfModule> # Protections diverses <ifModule mod_headers.c> # Indiquer aux navigateur que le site doit toujours être contacté en HTTPS # Durée de validité en secondes : # 1 heure : 3600 # 6 heures : 21600 # 12 heures : 43200 # 24 heures : 86400 # 48 heures : 172800 # 1 semaine : 604800 # 1 mois : 2592000 # 6 mois : 15552000 # 1 an : 31536000 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" # Empêcher les attaques cross-site scripting Header set X-XSS-Protection "1; mode=block" # Interdire l'utilisation du site dans des iframes en dehors du domaine courant Header always append X-Frame-Options SAMEORIGIN # Interdire le sniffing du type MIME par les navigateurs Header set X-Content-Type-Options "nosniff" # Politique de sécurité du site # Il s'agit d'indiquer l'origine des ressources qui peuvent être utiliser par le site # Plus d'info ici : # https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Content-Security-Policy # https://content-security-policy.com/ # https://www.magentix.fr/blog/strategie-de-securite-du-contenu-content-security-policy.html Header set Content-Security-Policy " \ upgrade-insecure-requests; \ \ default-src 'self' https://*.arthurbazin.com; \ script-src 'self' https://*.arthurbazin.com; \ style-src 'self' https://*.arthurbazin.com; \ img-src 'self' https://*.arthurbazin.com; \ media-src 'self' https://*.arthurbazin.com; \ font-src 'self' https://*.arthurbazin.com; \ \ child-src 'self' https://*.arthurbazin.com; \ frame-src 'self' https://*.arthurbazin.com; \ \ base-uri 'self' https://*.arthurbazin.com; \ form-action 'self' https://*.arthurbazin.com; \ \ object-src 'self' https://*.arthurbazin.com; \ connect-src 'self' https://*.arthurbazin.com; \ " # Politique d'envoie des referrer Header always set Referrer-Policy "strict-origin-when-cross-origin" </ifModule> # Masquer les informations du serveur ServerSignature Off # Désactiver l'easter egg permettant d'afficher des infos sur PHP (arthurbazin.com/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000) RewriteCond %{QUERY_STRING} PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC] RewriteRule .* - [F] # Désactiver l'affichage du contenu des répertoires Options -Indexes # Activation du suivi des liens symboliques Options +FollowSymLinks # Désactiver l'utilisation des images sur un autre site web # Plus d'info sur l'image utilisée sur https://fakeimg.pl <IfModule mod_rewrite.c> RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(.*\.)?arthurbazin.(com|local) [NC] RewriteRule \.(jpg|jpeg|png|gif)$ "https://fakeimg.pl/800x600/0090ff/ffffff/?text=BazinGa's - https://blog.arthurbazin.com&font_size=50" [NC,R,L] </IfModule>
Mise en cache
Afin de réduire le nombre de requêtes faites entre le navigateur et le serveur, ce dernier peut indiquer aux clients de mettre en cache les ressources du site.
# Excellente aide : https://csswizardry.com/2019/03/cache-control-for-civilians/ <IfModule mod_expires.c> # Définition de l'en-tête "Expires" et de la valeur "max-age" de l'en-tête "Cache-Control" ExpiresActive On ExpiresDefault "access plus 1 week" ExpiresByType text/html "access plus 0 seconds" ExpiresByType application/xhtml+xml "access plus 0 seconds" ExpiresByType text/xml "access plus 0 seconds" ExpiresByType application/xml "access plus 0 seconds" ExpiresByType application/rss+xml "access plus 1 hour" ExpiresByType application/atom+xml "access plus 1 hour" ExpiresByType text/css "access plus 1 week" ExpiresByType text/javascript "access plus 1 week" ExpiresByType application/javascript "access plus 1 week" ExpiresByType application/x-javascript "access plus 1 week" ExpiresByType text/json "access plus 1 week" ExpiresByType application/json "access plus 1 week" ExpiresByType font/ttf "access plus 1 month" ExpiresByType application/x-font-ttf "access plus 1 month" ExpiresByType font/woff "access plus 1 month" ExpiresByType application/x-font-woff "access plus 1 month" ExpiresByType font/woff2 "access plus 1 month" ExpiresByType application/x-font-woff2 "access plus 1 month" ExpiresByType font/opentype "access plus 1 month" ExpiresByType application/vnd.ms-fontobject "access plus 1 month" ExpiresByType image/jpg "access plus 1 month" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/png "access plus 1 month" ExpiresByType image/webp "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" ExpiresByType image/ico "access plus 1 month" ExpiresByType image/icon "access plus 1 month" ExpiresByType application/pdf "access plus 1 month" ExpiresByType video/ogg "access plus 1 month" ExpiresByType video/mp4 "access plus 1 month" ExpiresByType video/webm "access plus 1 month" ExpiresByType audio/ogg "access plus 1 month" ExpiresByType audio/mp3 "access plus 1 month" </IfModule> <ifModule mod_headers.c> # Directive de gestion du cache # On surcharge l'en-tête "Cache-Control" défini précédemment # "private" : les fichiers ne peuvent être mis en cache que par le client # "public" : les fichiers peuvent être mis en cache par les intermédiaires # "no-store" : pas de cache # "no-cache" : mise en cache avec requête de validation à chaque appel # "must-revalidate, max-age=xx" : mise en cache avec requête de validation après xx seconde # "stale-while-revalidate=xx" : si le fichier en cache est périmé, on peut encore l'utiliser pendant xx seconde, le temps de renouveler le cache # "stale-if-error=xx" : si le renouvellement du fichier en cache entraine une erreur 5xx, on peut encore utiliser le fichier en cache pendant xx seconde, le temps de le renouveler. # Durée de cache en secondes : # 1 heure : 3600 # 6 heures : 21600 # 12 heures : 43200 # 24 heures : 86400 # 48 heures : 172800 # 1 semaine : 604800 # 1 mois : 2592000 # 6 mois : 15552000 # 1 an : 31536000 # les fichiers dynamiques ne sont pas mis en cache <FilesMatch "\.(pl|cgi|spl|scgi|fcgi)$"> Header set Cache-Control "private, no-store" </FilesMatch> <filesMatch "\.(xhtml|html|xml|php)$"> Header set Cache-Control "private, no-cache" </filesMatch> <filesMatch "\.(css|js|json)$"> Header set Cache-Control "public, must-revalidate, max-age=604800" </filesMatch> <filesMatch "\.(eot|ttf|woff|woff2)$"> Header set Cache-Control "public, must-revalidate, max-age=2592000" </filesMatch> <filesMatch "\.(jpeg|jpg|gif|png|webp|svg|ico)$"> Header set Cache-Control "public, must-revalidate, max-age=2592000" </filesMatch> <filesMatch "\.(pdf)$"> Header set Cache-Control "public, must-revalidate, max-age=2592000" </filesMatch> <filesMatch "\.(ogg|mp4|webm)$"> Header set Cache-Control "public, must-revalidate, max-age=2592000" </filesMatch> <filesMatch "\.(ogg|mp3)$"> Header set Cache-Control "public, must-revalidate, max-age=2592000" </filesMatch> </ifModule> # Suppression des ETAG # Pour éviter des requêtes de revalidation Header unset ETag FileETag None
Compression
Pour accélérer les échanges client-serveur, il est possible de mettre en place une compression des données.
<IfModule mod_deflate.c> # Création d'un nouveau filtre de sortie Apache FilterDeclare COMPRESS # Ajout des directives au filtre FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/plain'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/html'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/xhtml'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/xml'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/xhtml+xml'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/xml'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/rss+xml'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/atom+xml'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/css'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/javascript'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/javascript'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/x-javascript'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/json'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'text/x-component'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/vnd.ms-fontobject'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'application/x-font-ttf'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'font/opentype'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'image/x-icon'" FilterProvider COMPRESS DEFLATE "%{Content_Type} = 'image/svg+xml'" # Chainage des filtre à la sortie FilterChain +COMPRESS # Validation de la mise à jour des en-têtes HTTP suite à l'utilisation du filtre FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no # N'utiliser que certaines compression pour les navigateurs incompatibles 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 # Nee pas compresser les images SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # Les proxies doivent transmettre le bon contenu <IfModule mod_headers.c> Header append Vary User-Agent env=!dont-vary </IfModule> </IfModule>
Sécurisation dédiées à WordPress
Il est possible d’ajouter quelques règles dédiées à WordPress.
# Protéger le fichier wp-config.php <files wp-config.php> order allow,deny deny from all </files> # Protéger les fichiers .htaccess et .htpasswds <Files ~ "^.*\.([Hh][Tt][AaPp])"> order allow,deny deny from all satisfy all </Files> # Éviter le spam de commentaires <IfModule mod_rewrite.c> RewriteCond %{REQUEST_METHOD} POST RewriteCond %{REQUEST_URI} .wp-comments-post\.php* RewriteCond %{HTTP_REFERER} !.blog.arthurbazin.com.* [OR] RewriteCond %{HTTP_USER_AGENT} ^$ RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L] </IfModule> # Éviter que l'on découvre l'identifiant d'un auteur <IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} ^author=([0-9]*) RewriteRule .* - [F] </IfModule> # Bloquer l'utilisation de certains scripts <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule>
Cet article vous a plu ?
N'hésitez pas à le partager, il interessera surement certains de vos contacts.
Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :
IT apachecachehstshttpsserveur