.htaccess: quelques explications

Appréciation moyenne:  / 23
Très mauvaisTrès bien 

Sécuriser son site avec le fichier .htaccess

Une des premières choses à faire une fois installé son cms favori (moi c'est joomla) est de le sécuriser.
Pour ce faire, on va d'abord s'attaquer au fichier .htaccess qui est lu et dont les instructions sont appliquées à la lettre par le serveur Apache hébergeant le site.

Ce genre de protection est, selon les dires de certains, inviolable. Je dirai donc "presqu'inviolable'.
En effet, si quelqu'un arrive à se connecter au site autrement que via son navigateur (ftp par exemple) c'est foutu, mais bon, cela signifie qu'il y avait une grosse faille de sécu quand-même.

Bref, le plus dur pour moi est de comprendre les règles de rewritecond et rewriterules.

Je vais donc me faire ici-même un petit pense-bête sur certaines d'entre-elles.

On commence par les règles de base.

Les règles de base:

Quelques petites choses que je place en début de fichier:
 

SetEnv REGISTER_GLOBALS 0
SetEnv PHP_VER 5_3
ServerSignature Off
Options All -Indexes
Options +FollowSymLinks
#SetEnv SERVER_ADMIN xxxxxxarobasetranquille-informatique.fr #ne se surcharge pas chez ovh on dirait
SetEnv TZ Europe/Paris
#allow_url_include 0 # déjà présente chez ovh par défaut
AddDefaultCharset UTF-8
AddLanguage fr-FR .html .htm .css .js
<Files .htaccess>
order allow,deny
deny from all
</Files>

Lignes 11, 12, 13 et 14:

interdire l'accès au fichier htaccess à travers le navigateur (mais normalement c'est déjà ainsi avec apache...)

ligne 1:

Définit si oui ou non les variables EGPCS (Environment, GET, POST, Cookie, Server) seront enregistrées comme des variables globales.
Par défaut sur Off normalement, mais il me semble avoir lu que Ovh (mon prestataire) la repassait à On. Donc on la re-désactive.
Pour en savoir plus, allez voir cette page: Utilisation des variables super-globales

Ligne 2:

positionner l'exécution du php v5.3 par défaut (chez ovh)

ligne 3:

Afficher (ou non) les signatures du serveur, lors d'une erreur, d'une page non trouvée ou autre, le serveur peut afficher des infos supplémentaires comme la version apache, le nom et l'adresse mail de l'admin, etc.
Fixée à non ici, car il faut donner un minimum d'informations aux éventuelles tentatives d'attaques.

Ligne 4:

ne pas permettre le listage des fichiers des dossiers, à partir du dossier dans lequel est le fichier htaccess en cours (racine / en général), et pour tous ses sous-dossiers.
Mettre +Indexes au lieu de -Indexes si l'on souhaite que le listage des dossiers soient possibles.
Si l'on souhaite qu'un dossier en particulier puisse être listé, mettre ici -Indexes, et créer un htaccess dans le dossier en question avec:
Options +Indexes

J'ai essayé ceci:

<Directory /dossier>
Options +Indexes
</Directory>

dans le htaccess racine, mais apparemment chez ovh ça ne doit pas être autorisé...

Ligne 5:

suivre les liens symboliques du serveur, comme tout le monde ou presque, je ne vois pas trop, un rapport avec sans doute les liens symboliques unix, mais c'est loin de me concerner du coup...

Ligne 6:

fixer une adresse pour l'administrateur du site, Cette adresse est visible si on a positionné l'affichage des signatures serveurs à On.
comme je ne souhaite pas trop donner d'infos, je mets en commentaire.

Ligne 7:

Je fixe le fuseau horaire de mon site, en gros, ça peut servir sur certains calculs de dates, dans le futur, mais comme ça c'est fait.

Ligne 8:

Autoriser les iclusions de fichiers d'autres serveurs que celui sur lequel on est.
Cette variable positionnée à Off empêche normalement les includes de fichiers qui ne sont pas hébergés sur notre propre site.

Ligne 9:

pas question de sécurité ici, juste de jeux de caractères par défaut...

Ligne 10:

Positionner le language par défaut pour certains types de fichiers (pour voir)

 

Interdire certaines actions


Voyons maintenant comment interdire certaines actions sur certains fichiers avec ces instructions:

### INTERDIRE L'AFFICHAGE DE CERTAINS FORMATS DE FICHIER
### EXÉCUTÉS PAR LE SERVEUR MAIS INTERDIT D'AFFICHAGE PAR LE NAVIGATEUR WEB
<Files ~ "\.(inc|class|sql|ini|conf|exe|dll|bin|tpl|bkp|dat|c|h|py|spd|theme|module)$">
deny from all
</Files>

moi je ne l'utilise pas mais bon

 Ensuite, voici quelques autres instructions générales concernant cette fois la partie la plus importante et difficile pour moi:

Le mode Rewrite

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^mon-site.fr$
RewriteRule ^(.*) http://www.mon-site.fr/$1 [QSA,L,R=301]

Ligne 1:
voilà ce que j'ai trouvé quelque part sur le web:
"cette option n'est pas obligatoire pour les rewriting classiques, c'est utile dans peu de cas, mais tout le monde le met ne sachant pas exactement à quoi ca sert"
Et pour le moment je vais faire comme tout le monde smiley

lignes 2 et 3:
Activer la réécriture d'url, indiquer le point de départ.

Ligne 4 et 5:
je souhaite ici que mon site soit toujours parcouru avec le www devant, donc tout ce qui arrive sans www, ou avec autre chose juste avant le .mon-site.fr est réécrit sous la forme www.mon-site.fr
Remplacer mon-site par le nom de domaine du site.

Passons à la suite maintenant, la réécriture proprement dite, conditions et exécution

le mieux pour le moment est d'aller voir là

là, beaucoup d'explications

et là aussi beaucoup

et au final là, excellent

et le htaccess fourni

 

Mon .htaccess actuel:

J'utilise ce htaccess depuis environ trois ans maintenant, et pour le moment, je touche du bois, aucune attaque n'a réussi.
Pourtant, je vérifie mes logs tous les jours, grâce à ce petit outil spécialement adapté à l'analyse des logs chez OVH, et tous les jours mon site subit des dizaines d'attaques, comme tous les autres sites je suppose.

SetEnv REGISTER_GLOBALS 0
SetEnv PHP_VER 5_3
SetEnv ZEND_OPTIMIZER 1
ServerSignature Off
Options -Indexes
Options +FollowSymLinks
#SetEnv SERVER_ADMIN Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser. #ne se surcharge pas chez ovh on dirait
SetEnv TZ Europe/Paris

#allow_url_include 0 # déjà présente chez ovh par défaut

AddDefaultCharset UTF-8
AddLanguage fr-FR .html .htm .css .js

<Files .htaccess>
order allow,deny
deny from all
</Files>

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^tranquille-informatique.fr$
RewriteRule ^(.*) http://www.tranquille-informatique.fr/$1 [QSA,L,R=301]

###############################################
# redirection des pages supprimees ou deplacees
###############################################
Redirect Gone /virtuemart
RedirectPermanent /aeromodelisme.html http://www.tranquille-informatique.fr/modelisme/
RedirectPermanent /perso/aeromodelisme/divers/mesureur_graduation.jpg http://www.tranquille-informatique.fr/perso/aeromodelisme/divers/regle-graduee-debattements.pdf
###############################################
#
###############################################
# On bloque des ip agressives:
###############################################
deny from 79.142.69.69
###############################################
#
###############################################
# blacklist via http_user_agent:
###############################################
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} bnf.fr_bot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} libwww [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(HTTrack|clshttp|loader|email|nikto|miner|python).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|curl|wget|harvest|scan|grab|extract).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
# On bloque toute une série de failles potentielles
###############################################
#blacklist via query_string:
###############################################
RewriteCond %{QUERY_STRING} \.\.\/ [NC,OR]
RewriteCond %{QUERY_STRING} boot\.ini [NC,OR]
RewriteCond %{QUERY_STRING} tag\= [NC,OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} \=http [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} \=https [NC,OR]
RewriteCond %{QUERY_STRING} mosConfig [NC,OR]
RewriteCond %{QUERY_STRING} proc\/self [NC,OR]
RewriteCond %{QUERY_STRING} _vti_ [NC,OR]
# RewriteCond %{QUERY_STRING} MSOffice [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3C|<)/?script(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)(%3D|=)?javascript(%3A|:)(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)document\.location\.href(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)base64_encode(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(\(|\)|<|>|'|\*).* [NC,OR]
# ;| enlevé pour le googlebot dans perso, à suivre
# |\? # enlevé à cause de fckeditor
RewriteCond %{QUERY_STRING} ^.*(%22|%27|%3C|%3E|%5C|%7B|%7C).* [NC,OR]
#%A|%B|%C|%D|%E|%F| enlevé suite divers problèmes
RewriteCond %{QUERY_STRING} ^.*(%0|127\.0).* [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
# RewriteCond %{QUERY_STRING} ^.*(request|select|insert|union|declare|drop).* [NC] enlevé car certains blocages dans joomla
RewriteCond %{QUERY_STRING} ^.*(insert|union|declare|drop).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via HTTP_cookie
###############################################
# RewriteCond %{HTTP_COOKIE} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC]
# RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via request_method
###############################################
# RewriteCond %{REQUEST_METHOD} ^(delete|trace|track) [NC]
# head| # enlevé pour googlebot
# RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via the_request
###############################################
RewriteCond %{THE_REQUEST} ^.*(\\r|\\n|%0A|%0D).* [NC]
RewriteRule ^(.*)$ - [F,L]
###############################################
#blacklist via REQUEST_URI
###############################################
#RewriteCond %{REQUEST_URI} intitle [NC]
#RewriteRule ^(.*)$ - [F,L]
###############################################
#
###############################################
########## Begin - Joomla! core SEF Section
###############################################
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the request is for something within the component folder,
# or for the site root, or for an extensionless URL, or the
# requested URL ends with one of the listed extensions
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]
#
## End - Joomla! core SEF Section.
###############################################
#
###############################################
#empêcher les liens directs vers mes images à partir d'autres sites
#(enlevé suite prob avec images sur les forums)
###############################################
#RewriteCond %{HTTP_REFERER} !^$
#RewriteCond %{HTTP_REFERER} !^http://(www.)?tranquille-informatique.fr/.*$ [NC]
#ReWriteRule .(gif|png|jpe?g|swf|flv)$ - [F]
###############################################

Attention à bien respecter l'ordre, d'abord le rewriteEngine à On, ensuite les cobtrages de failles, et enfin les règles de réécriture de joomla.

Ce htaccess fonctionne sur un joomla 2.5.X