Comment empêcher l'accès au site Web sans connexion SSL?

11

J'ai un site Web sur lequel un certificat SSL est installé, de sorte que si j'accède au site Web en utilisant httpsau lieu de httpje pourrai me connecter en utilisant une connexion sécurisée.

Cependant, j'ai remarqué que je peux toujours accéder au site Web de manière non sécurisée, c'est-à-dire. en utilisant httpau lieu de https.

Comment empêcher les gens d'utiliser le site Web de manière non sécurisée?

Si j'ai un annuaire sur le site Web, par exemple. samples/, puis-je empêcher les connexions non sécurisées à ce répertoire uniquement?

CJ7
la source

Réponses:

12

Malheureusement, la seule solution générale à ce problème est de donner à vos utilisateurs le https://seul et de s'assurer qu'ils s'attendent à ne l'utiliser que. Il est en fin de compte de la responsabilité de l'utilisateur de vérifier qu'il utilise SSL / TLS, comme il s'y attend.

D'autres solutions sont vulnérables aux attaques de l'homme du milieu, même si le site Web n'accepte que les connexions SSL / TLS. Les attaquants pourraient intercepter le trafic vers http://example.com(comme demandé par l'utilisateur, même s'il example.comn'écoute même pas sur ce port) et le remplacer en établissant leur propre connexion https://example.com, en le redirigeant par proxy vers l'utilisateur.

Il y avait une règle OWASP contre les redirections automatiques à cause de cela. Il a été supprimé, probablement parce que les redirections ne sont pas un mauvais moyen d'atténuer le risque (en particulier contre les écoutes clandestines passives), mais ne résolvent pas le problème fondamental.

Il existe différentes techniques que vous pouvez utiliser pour guider l'utilisateur vers le site HTTPS, et ce n'est pas une mauvaise idée de les utiliser (bien que cela ne les protège pas contre les attaquants MITM actifs).

Premièrement, si vous n'avez rien du tout qui devrait être servi en simple HTTP sur le serveur Web, désactivez le port 80 (par exemple, supprimez-le Listen 80dans la configuration d'Apache Httpd). Les utilisateurs devront utiliser https://à tout moment, ce qui peut être gênant.

Deuxièmement, dans votre section de configuration Apache Httpd pour un chemin particulier (soit Locationou Directory), utilisez la SSLRequireSSLdirective : elle nécessitera l'utilisation de SSL / TLS (même si vous l'avez configuré sur un autre port en fait). D'autres serveurs Web ont probablement des directives similaires.

Troisièmement, vous pouvez utiliser une redirection, en utilisant mod_rewriteou dans votre code (s'il s'agit d'une application). Quelque chose comme ça devrait faire, pour un emplacement spécifique ( voir la HTTPSvariable spéciale ; vous pouvez également utiliser 302, mais 301 est mieux si cela doit être plus permanent):

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(samples/.*)$ https://example.com/$1 [R=301,L]

Plus important encore, assurez-vous que tous les liens vers cette section sécurisée sont utilisés https://. Ne comptez jamais sur la redirection automatique pour faire le travail à votre place. Pour cette raison, je recommande de ne pas l'utiliser du tout pendant la phase de développement .

Cependant, j'ai remarqué que je peux toujours accéder au site Web de manière non sécurisée, c'est-à-dire. en utilisant httpau lieu de https.

Cela semble également que vous utilisez la même configuration pour les deux httpet https. Si vous utilisez Apache Httpd, je suggérerais de diviser la configuration en deux VirtualHosts distincts : un pour le port 80 et un pour le port 443. Ils n'ont pas besoin d'avoir exactement la même configuration: ne mettez pas ce qui est uniquement pour HTTPS dans l'hôte virtuel HTTP du tout.


Un moyen d'atténuer les problèmes mentionnés ci-dessus consiste à utiliser HTTP Strict Transport Security , pour les navigateurs qui le prennent en charge (il s'applique à l'ensemble de l'hôte pour autant que je sache). La toute première connexion peut toujours être exposée si elle https://n'est pas utilisée sans la redirection, mais il est possible d'avoir une liste préchargée de sites attendus de https:// toute façon (et activée pour HSTS).

Bruno
la source
Bonne information, comment gmail fait-il cela? - de l'apparence des choses, ils forcent https.
toomanyairmiles
3
Ils utilisent une redirection. Cela fonctionne très bien, à condition que vous, comme l'utilisateur s'y attend https://mail.google.com. Si, en tant qu'utilisateur, vous voyez que cela fonctionne http://mail.google.com, il y a probablement un MITM qui procède au proxy des demandes à l'authentique https://mail.google.com. Malheureusement, Gmail ne peut pas faire grand-chose à ce sujet si les utilisateurs eux-mêmes ne vérifient pas. Même principe que dans la vraie vie: si Alice veut parler à Bob, mais parle à Chuck (qui prétend être Bob) à la place sans vérifier l'ID, Bob ne sera pas au courant de cette conversation et ne pourra pas le faire quoi que ce soit à ce sujet. C'est la responsabilité d'Alice.
Bruno
J'ai vu des scripts PHP qui vérifient s'ils sont connectés avec HTTPS et redirigent s'ils n'utilisent pas SSL vers une adresse HTTPS. Bien sûr, ce n'est pas une tâche facile, sauf si vous créez votre site maintenant.
Anonymous Penguin
@AnnonomusPerson, c'est exactement le même principe et c'est ce que fait la règle de réécriture de HTTP à HTTPS. Que vous le fassiez par programme ou par configuration n'a pas d'importance, c'est toujours une redirection avec une demande initiale en HTTP simple, ce qui pose le même problème.
Bruno
3

Il vous suffit de rediriger le trafic http vers https - voir cet article 'Rediriger la connexion sécurisée http vers https Apache - forcer les connexions HTTPS' .

Pour un sous-répertoire, placez-le dans un fichier htaccess dans le répertoire lui-même.

RewriteEngine on
RewriteCondition %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.maindomain.com/directory/$1 [R=301,L] 
toomanyairmiles
la source
Pouvez-vous rendre cela possible uniquement pour certains sous-répertoires?
CJ7
@CraigJ désolé, vous avez manqué la partie du sous-répertoire, réponse mise à jour.
toomanyairmiles
3
Bien que cela réduise légèrement les risques, cela ne fonctionne pas contre les attaquants MITM actifs.
Bruno
0

Forcer l'accès via HTTPS est en fait possible, en plus d'être une étape nécessaire pour rendre votre site MITM, snooper et PEBKAC-proof. Cela ne devrait pas être la responsabilité de l'utilisateur, cela ne fonctionne pas . Encouragez vos utilisateurs à utiliser des navigateurs sécurisés à la place.

Le forçage HTTPS se fait via HSTS ( HTTP Strict-Transport-Security ). HSTS de base est sécurisé après la première fois que l'utilisateur a accédé à votre site via HTTPS (sur tous les navigateurs pris en charge; IE n'a pas la capacité ). Le HSTS préchargé est toujours sécurisé et couvre les navigateurs modernes à libération rapide (Chrome et dérivés, Firefox).

Pour un aperçu plus complet de la sécurité HTTP (adressage des URL, des redirections, des cookies et du contenu mixte), consultez ce guide de migration HTTPS . HSTS est la dernière étape d'une migration progressive. Vous n'avez pas vraiment besoin de suivre la commande si votre site est flambant neuf.

Normes associées: cookies sécurisés (importants si vos cookies vivent plus longtemps que l'en-tête HSTS), cookies HttpOnly (pendant que vous sécurisez vos cookies), HPKP (pour les navigateurs modernes et les attaquants plus ingénieux).

Tobu
la source