La protection par mot de passe d'un répertoire avec .htaccess est-elle le meilleur moyen d'empêcher ses fichiers d'être vus par des utilisateurs non autorisés? Existe-t-il des alternatives à la protection du contenu d'un annuaire tout en le rendant accessible aux personnes authentifiées pour le consulter?
De plus, quelqu'un ne pourrait-il pas essayer de forcer son chemin, provoquant une tension sur le serveur?
Plusieurs choses à noter:
L'ajout de sécurité dans un .htaccess peut toujours se faire sans le .htaccess, en utilisant <Directory>
instructions dans la configuration principale (ou la configuration de virtualhost). Cela ira plus vite (si vous supprimez complètement le support de .htaccess avec AllowOverride None
) et vous n'aurez pas le risque que quelqu'un modifie votre .htaccess.
Il existe plusieurs façons d'ajouter de la sécurité dans les fichiers .htaccess, l'une de ces méthodes consiste à utiliser l'authentification HTTP de base avec .htpasswd
des dossiers. Ces fichiers .htpasswd ne doivent pas se trouver à la racine du répertoire Web. L'une des autres possibilités consiste à utiliser HTTP Digest Authentification , avec la restriction que les très anciens navigateurs ne le prendront pas en charge (comme IE6).
Nous rencontrons généralement l'authentification HTTP de base. Il s'agit d'une protection très faible, simplement en raison de son fonctionnement. À la première demande, vous êtes rejeté, puis votre navigateur vous demande un mot de passe et une connexion, et mémorise cette association de connexion par mot de passe pour le serveur Web demandé. Ensuite, pour chaque demande envoyée à ce serveur Web jusqu'à la fermeture de votre navigateur , le nom d'utilisateur et le mot de passe seront ajoutés dans l'en-tête de la demande , non crypté . Il y a simplement un encodage base64 appliqué à la chaîne 'Yourlogin: Yourpassword', pour la faire ressembler à une chaîne ASCII7 pure et éviter les problèmes d'encodage.
Ainsi, toute personne qui renifle votre demande (point d'accès wifi, homme au milieu, réseau local, commutateur d'écho, etc.) connaîtra votre mot de passe et votre connexion. Mal. La règle est ":
n'utilisez jamais l'authentification HTTP de base si la connexion n'est pas HTTPS (SSL).
Si votre serveur Web est complètement en HTTPS aucun problème (voir éditer en bas), le texte/mot de passe clair est crypté par SSL.
Pour le problème de force brute (et oui, certaines personnes peuvent essayer de forcer brutalement le login/mot de passe, sauf si vous réglez un module mod_security pour éviter cela) le Considération de sécurité de la page htpasswd est assez clair:
Lorsque vous utilisez l'algorithme crypt (), notez que seuls les 8 premiers caractères du mot de passe sont utilisés pour former le mot de passe. Si le mot de passe fourni est plus long, les caractères supplémentaires seront supprimés en silence
et:
Sur les plates-formes Windows et MPE, les mots de passe chiffrés avec htpasswd sont limités à 255 caractères au maximum. Les mots de passe plus longs seront tronqués à 255 caractères.
Utilisez donc SHA codage hachage des mots de passe (même s'il n'est pas salé).
Une autre façon de permettre à un utilisateur authentifié de parcourir le contenu d'un répertoire est de gérer la liste des répertoires et le téléchargement de fichiers dans votre application (PHP, Tomcat, etc.) et non avec la liste automatique Apache. En termes de sécurité, le module de listage automatique (mod_autoindex) est quelque chose que vous ne devriez même pas avoir sur votre Apache en cours d'exécution.
Modifier
Un serveur HTTPS complet n'est pas requis si vous souhaitez protéger uniquement certaines URL avec l'authentification HTTP. Ce dont vous avez vraiment besoin, c'est que toutes ces URL protégées soient en https , si les URL non protégées sont dans le domaine http, les en-têtes d'authentification ne seront pas utilisé car il s'agit d'un domaine différent (et les en-têtes d'authentification sont envoyés par domaine). Vous pouvez donc ajouter des règles de redirection de base dans le domaine http pour ces URL, peut-être quelque chose comme ça:
RedirectMatch 301 ^/secure/(.*)$ https://www.example.com/secure/$1