Les URL privées non identifiables sont-elles équivalentes à l'authentification par mot de passe?


128

Je veux exposer une ressource sur le Web. Je veux protéger cette ressource: m'assurer qu'elle n'est accessible qu'à certaines personnes.

Je pourrais mettre en place une sorte d' authentification basée sur un mot de passe . Par exemple, je ne pouvais autoriser l'accès à la ressource que par l'intermédiaire d'un serveur Web vérifiant les informations d'identification des demandes entrantes (par exemple, par rapport à une base de données d'utilisateurs sauvegardée) avant de servir le fichier.

Alternativement, je pourrais simplement utiliser une URL privée . C'est-à-dire que je pourrais simplement héberger la ressource selon un chemin impossible à deviner, par exemple https://example.com/23idcojj20ijf..., ce qui restreindrait l'accès à ceux qui connaissent la chaîne exacte.

Du point de vue d'un malfaiteur qui veut accéder à cette ressource, ces approches sont-elles équivalentes? Si non, qu'est-ce qui les rend différents? Et en ce qui concerne la facilité de maintenance, existe-t-il des avantages et des inconvénients à l'une ou l'autre approche à connaître avant de mettre en œuvre l'une ou l'autre?


45
Cette approche est généralement utilisée uniquement sans authentification pour des opérations telles que la réinitialisation du mot de passe. Le lien impossible à deviner expire généralement dans un court laps de temps et ne peut être utilisé que par une personne déjà semi-authentifiée (le site Web connaît déjà l'adresse de messagerie à laquelle le lien a été envoyé).
Robert Harvey

6
Discussion connexe sur security.SE: security.stackexchange.com/q/58215/37496
Mark

9
@ MonkeyZeus ce n'est pas la sécurité par l'obscurité. Le secret, qui est normalement un mot de passe, est dans ce cas une URL.
Davidmh

16
@MonkeyZeus: La sécurité par l'obscurité consiste à garder secrète l' implémentation du mécanisme, sans utiliser de clés obscures. Si les URL impossibles à deviner sont la sécurité par l'obscurité, les mots de passe forts le sont également.
JacquesB

1
@GladstoneKeep gardez à l'esprit les raccourcisseurs d'URL. Une fois qu'un utilisateur malveillant en utilisera un, le lien sera beaucoup plus facile à deviner / à écrire.
RookieTEC9

Réponses:


203

Une URL privée est un peu plus faible qu'une authentification avec informations d'identification, même si la taille en bits de l'URL est identique à celle des informations d'identification. La raison en est que l'URL peut plus facilement "fuir". Il est mis en cache dans le navigateur, enregistré sur le serveur, etc. Si vous avez des liens sortants, l'URL privée peut apparaître dans l'en-tête du référent sur d'autres sites. (Il peut également être vu par des personnes regardant par-dessus votre épaule.)

En cas de fuite (par accident ou par négligence de la part de l'utilisateur), il pourrait devenir public et même indexé par Google, ce qui permettrait à un attaquant de rechercher facilement toutes les URLs de votre site qui ont été filtrés!

Pour cette raison, les URL privées ne sont généralement utilisées que pour des opérations ponctuelles, telles que la réinitialisation de mots de passe, et ne sont généralement actives que pour une durée limitée.


Il existe un fil conducteur sur le site Sécurité de l'information: les URL aléatoires constituent-elles un moyen sûr de protéger les photos de profil ? - une réponse partage cette histoire: Dropbox désactive les anciens liens partagés une fois que les déclarations de revenus sont terminées sur Google . Ce n'est donc pas simplement un risque théorique.


7
Un petit reproche, mais "typiquement utilisé uniquement pour des opérations ponctuelles" semble une sur-déclaration étant donné que Dropbox (et peut-être d'autres services en nuage) les utilisent pour "protéger" l'accès aux fichiers.
Steve Jessop

4
J'ajouterais que les utilisateurs apprennent, avec un succès limité, à protéger leurs mots de passe, mais pas à protéger leurs URL.
svavil

1
Vous devez ajouter que bon nombre des problèmes techniques peuvent être atténués en utilisant un paramètre dans l'URL privée, ainsi xzy.com/myDoc?auth=8502375, ainsi qu'une redirection automatique vers une URL simple après la vérification de l'authentification. - Mais cela ne résout pas tous les problèmes possibles
Falco

3
TL; DR - Il n’existe pas d’URL secrète. Une attaque en cours expose les URL à un acteur malveillant situé sur des points d'accès Wi-Fi, même si vous envoyez normalement l'URL via HTTPS. L'attaque abuse de la découverte du proxy Web (WPAD), forçant votre navigateur à envoyer toutes vos URL à l'attaquant. Voir (par exemple) arstechnica.com/security/2016/07/…
Harald le

5
@JacquesB Certains des risques que vous avez identifiés ne sont-ils pas atténués en plaçant la partie privée dans la partie fragmentée de l'URL (c'est-à-dire après le "#", comme le fait Stack Exchange pour ses réponses d'authentification Oauth)? Par exemple, l'en-tête du référent n'est pas autorisé à inclure le fragment .
Jason C

48

Remarque:

Beaucoup de gens semblent confondre une URL "privée" avec l'authentification. En outre, il semble y avoir une certaine confusion quant au fait que l’envoi du lien via une entité de confiance est une tentative d’authentification à deux facteurs. Pour être clair, nous parlons d'une ressource accessible au public, même si elle est suffisamment difficile à deviner.

Lorsque vous utilisez une URL privée, vous devez toujours supposer que celle-ci peut être compromise - vous devez concevoir une telle URL de sorte que même si elle est compromise, la ressource ne transmettra pas d'informations à l'attaquant.


Les URL privées / difficiles à deviner ne sont pas équivalentes à l'authentification par mot de passe. Par nature, les URL privées ne sont pas du tout privées - elles sont des ressources accessibles au public. Je pense que le terme URL "privée" est un terme impropre, mais plutôt "obscur".

Dans certains cas, l’utilisation d’une URL "privée" est acceptable, mais elles sont intrinsèquement moins sécurisées que les méthodes d’authentification traditionnelles telles que l’authentification par mot de passe ou l’authentification par clé.

Voici quelques exemples d'URL "privées" couramment utilisées:

  1. Mot de passe réinitialiser les emails
  2. Email de génération de certificat
  3. Email de confirmation de compte / email
  4. Livraison du contenu acheté (ebooks, etc.)
  5. Autres choses diverses comme l'enregistrement de vol, l'impression de la carte d'embarquement, l'utilisation d'URL privées en plus de l'authentification traditionnelle

Le point commun ici est que les URL aléatoires ne conviennent généralement que pour des opérations ponctuelles. En outre, l'authentification traditionnelle et les URL aléatoires ne s'excluent pas mutuellement . En fait, elles peuvent être utilisées conjointement pour renforcer la sécurité lors de la livraison d'une ressource.


Comme Robert Harvey l'a souligné, le seul moyen d'utiliser de manière sécurisée une URL aléatoire / privée est de générer la page de manière dynamique et de soumettre l'URL à l'utilisateur de manière à ce qu'il puisse être considéré comme semi-authentifié. Cela pourrait être un email, SMS, etc.

Une URL privée / générée aléatoirement a généralement quelques propriétés:

  1. Il devrait expirer après un délai raisonnable
  2. Il devrait s'agir d'une URL à usage unique: IE, elle devrait expirer après le premier accès.
  3. Il doit reporter l'authentification de l'utilisateur à une autre entité en laquelle il fait confiance pour l'authentifier de manière sécurisée. (En envoyant le lien par e-mail ou SMS, etc.)
  4. Il devrait être impossible pour un ordinateur moderne de forcer brutalement l'URL dans le délai précédant l'expiration, soit en limitant le débit de l'API qui expose la ressource, soit en créant un point de terminaison url avec une entropie suffisante pour ne pas le deviner.
  5. Il ne devrait pas y avoir de fuites d'informations sur l'utilisateur. IE: si la page doit réinitialiser un mot de passe: la page ne doit pas afficher les informations du compte du demandeur. Si Alice demande un lien de réinitialisation de mot de passe et que Bob devine l’URL, Bob ne devrait avoir aucun moyen de savoir quel mot de passe il réinitialise.
  6. En cas de fuite d'informations sur l'utilisateur, il convient de l'utiliser en plus de l'authentification traditionnelle. Par exemple, une page peut considérer un utilisateur authentifié s'il possède un cookie ou si son identifiant de session est toujours valide.

Différentes ressources nécessitent différents niveaux de sécurité. Si vous souhaitez partager une recette secrète avec des amis, par exemple, il serait acceptable d'utiliser une URL aléatoire / privée pour la partager avec eux. Toutefois, si la ressource pouvait être utilisée pour voler l’identité d’une personne ou compromettre ses comptes avec d’autres fournisseurs de services, il serait probablement plus important de restreindre l’accès à cette ressource.


4
Si je voulais partager la recette secrète du Coca-Cola avec mon équipe de développement de produits, il faudrait quelque chose de différent de celui que je voulais partager avec la recette de la salade de pommes de terre que j'ai servie les voisins lors d'une fête de barbecue dans le quartier. Encore une fois, le contexte. :-)
un CVn

7
@ MichaelKjörling Je ne sais pas comment quelqu'un pourrait déduire différemment de mon message. Très clairement, j’ai déclaré que différentes ressources nécessitaient différents niveaux d’authentification. La recette de coca serait beaucoup plus précieuse que la recette de biscuits de grand-mère.
Charles Addis

9
@CharlesAddis De toute évidence, vous n'avez jamais goûté aux biscuits de ma grand-mère!
Brian

1
Bien que je me trompe peut-être, @ Michael dit que votre description en 5 points des propriétés qu'une URL secrète devrait avoir est déjà excessive pour avoir partagé une recette secrète avec des amis. Rendre chaque utilisation unique (et donc nécessiter une URL distincte par ami qui accède à la recette) en particulier semble poser beaucoup de problèmes pour un bénéfice négligeable, surtout s’il existe également une date de péremption. J'ai lu votre réponse comme signifiant "il est acceptable d'utiliser une URL privée, mais les URL privées doivent avoir ces 5 propriétés", et IMO est légèrement faux.
Steve Jessop

1
@BenjaminHodgson c'est précisément la raison pour l'item # 5 => si le lien / l'URL tombe dans de mauvaises mains, il ne devrait laisser aucune information sur l'utilisateur qui l'a demandé.
Charles Addis

8

Pratiquement tous les schémas d'authentification se résument à prouver que vous connaissez un secret. Vous vous authentifiez auprès de certains services en prouvant que vous connaissez un mot de passe secret, une URL secrète ou ...

Certains protocoles plus avancés (par exemple, OAUTH, Kerberos, ...) vous permettent de prouver que vous connaissez le secret sans le transmettre réellement . Ceci est important car il y a plus de façons d'obtenir un secret "impossible à deviner" en plus de le deviner.

Je pourrais être assis dans le même cybercafé que vous, espionnant votre connexion WiFi lorsque vous saisissez votre URL "indestructible". À ce stade, si vous n’utilisiez pas SSL ou si je pouvais exploiter le dernier bogue de votre implémentation SSL, je connaîtrais également votre secret.


1
Pour être juste, cela vaut également pour l'authentification, ou toute communication.
Andy

"L'écoute sur votre connexion WiFi" fonctionne sur n'importe quoi: les URL, les <form>fichiers cryptés de niveau militaire JavaScript protégés par CSRF , (le cas échéant, un reniflage actif sera nécessaire). C'est simple à résoudre: utilisez HTTPS.
Gustavo Rodrigues

@GustavoRodrigues Tout d'abord, si l'écoute électronique "fonctionnait vraiment sur n'importe quoi ", alors elle fonctionnerait sur HTTPS. Sinon, que veut dire "quelque chose"? Ou, selon vous, quelle magie est dans HTTPS qui le met au dessus de tout le reste?
Salomon Slow

2
... mais il y a une magie qui protège des oreilles indiscrètes: c'est la cryptographie à clé publique. Voici un exemple simple: Un service m'envoie un défi contenant un nombre aléatoire et un horodatage. Je signe le défi avec ma clé privée et le retourne. S'ils peuvent valider ma réponse avec ma clé publique enregistrée, cela prouve que je connais le secret (le secret est ma clé privée), mais je l'ai prouvé sans jamais le révéler à un indiscret potentiel. Cela ne m'aidera pas à rejouer ma réponse, car le service n'enverra jamais le même défi deux fois.
Salomon Slow

HTTPS (c'est-à-dire, HTTP sur SSL) utilise le cryptage à clé publique, mais FYI, les implémentations les plus courantes de SSL ont une histoire de bugs qui ont permis aux oreilles indiscrètes de s'introduire malgré la cryptographie. De nouveaux bogues (ou "exploits") semblent être découverts deux ou trois fois par an, et tous les développeurs de tous les produits utilisant SSL doivent courir avec leurs cheveux en feu jusqu'à ce que le dernier exploit soit corrigé. (Ne me demandez pas comment je sais!)
Solomon Slow

3

Beaucoup de bonnes réponses déjà dans ce fil, mais pour répondre directement à la question:

Du point de vue d'un malfaiteur qui veut accéder à cette ressource, ces approches sont-elles équivalentes? Si non, qu'est-ce qui les rend différents?

Permettez-moi d'établir une définition. "Authentification" est la fourniture d'informations d'identification pour prouver une revendication d'identité. Le contrôle d'accès est généralement basé sur l'identification de l'utilisateur.

Votre URL secrète n'est pas liée à un utilisateur spécifique. Comme d'autres l'ont fait remarquer, cela pourrait se retrouver dans le fichier journal d'un proxy, dans une requête de recherche indexée par Google ou dans de nombreuses autres manières.

D'autre part, un mot de passe est lié à un compte d'utilisateur unique. Vous avez la possibilité de le réinitialiser ou de ne l’autoriser que depuis le domicile de l’utilisateur, son adresse IP connue ou un nombre quelconque de contrôles.

Un nom d'utilisateur / mot de passe vous donne un contrôle beaucoup plus granulaire de l'accès.

Le contrôle d'accès permet à une identité (un sujet) d'accéder à une ressource (un objet). Dans votre exemple d'URL, l'identité est "quiconque obtient l'URL, par quelque moyen que ce soit".

Allez avec le nom d'utilisateur / mot de passe si vous le pouvez. Les URL fuient de toutes sortes de manières inattendues au fil du temps.


1

Une URL secrète est aussi sécurisée qu'un mot de passe secret. Cependant, les mots de passe sont plus faciles à garder secrets que les URL, car tout le monde et ses programmes savent que les mots de passe doivent rester secrets.

Par exemple, votre navigateur n’affiche pas de mot de passe à l’écran, ne stocke que les mots de passe avec votre permission et offre des moyens de protéger le stockage de ce mot de passe (tel que le stockage chiffré déverrouillé par un mot de passe principal). En revanche, il affichera toujours les URL à l’écran, pourrait les fuir par l’en-tête du référent et les stocker automatiquement dans votre historique de navigation, sans aucune protection supplémentaire.

De même, les mandataires HTTP ne consignent généralement pas les mots de passe, alors que les URL sont généralement consignées.

L'utilisation des URL pour l'authentification signifie également que le partage d'URL partage l'authentification, ce qui rend difficile la révocation (ou l'enregistrement) d'accès.

Et bien sûr, les URL secrètes héritent de toutes les faiblesses des mots de passe secrets. En particulier, l'utilisation d'un mot de passe pour l'authentification révélera ce mot de passe au serveur et à toute personne capable de lire votre communication.


3
Cette réponse fait beaucoup d'hypothèses qui sont fausses. Si vous vous connectez à un site avec HTTPS et entrez votre nom d'utilisateur et votre mot de passe, les sauts entre les deux et les mandataires ne connaîtront pas votre mot de passe.
Pieter B

Par "intercepter votre communication", j'entendais la capacité de reconstruire son contenu. Cela peut être évité ou non par HTTPS. En particulier, le fait de faire confiance à un seul certificat incorrect (par exemple, par un proxy d'entreprise HTTPS utilisant la même clé privée pour toutes les installations) permet à un attaquant de gérer le trafic HTTPS au milieu.
Meriton

2
mais en encodant le secret dans l'URL, vous rendez le HTTPS totalement inutilisable. Chaque saut entre le client et le serveur a le secret. Aucun certificat compromis requis.
Pieter B

4
Absurdité; en HTTPS, l'URL n'est transmise que dans le flux crypté. Vous devez le confondre avec le domaine ou l'adresse IP, qui sont respectivement visibles dans les champs de recherche DNS et d'en-tête IP.
Meriton

1

Un autre élément non noté nulle part est la limitation des «suppositions». Pour la plupart des systèmes d'authentification par mot de passe, vous avez peu d'essais de deviner le mot de passe d'un utilisateur avant que d'autres tentatives d'authentification ne soient verrouillées ou limitées.

Bien que vous puissiez faire quelque chose de similaire avec des "suppositions" sur votre schéma d'URL, il serait un peu plus difficile à mettre en œuvre. S'il existe un motif reconnaissable dans votre génération d'URL, il peut s'avérer difficile d'empêcher une personne en train de se préparer pour se frayer un chemin dans votre espace URL "aléatoire".


0

Il y a un autre aspect que je n'ai pas encore vu mentionné - les raccourcisseurs d'URL.

Dans une publication récente (avril 2016), il a été affirmé que les services de raccourcisseur d'URL annulaient complètement la sécurité accrue fournie par les URL "indestructibles" générées aléatoirement. L'espace URL du service shorterner est considérablement plus petit que votre URL générée aléatoirement - ce qui signifie qu'une telle URL "sécurisée" partagée avec un service de raccourcisseur peut être devinée plus facilement que prévu.

Pour illustrer notre propos, supposons que votre URL aléatoire ait une longueur de 128 bits (c’est-à-dire un guid). En outre, supposons que votre générateur de nombres aléatoires soit très puissant et que vous génériez ces bits de manière uniforme. Deviner un numéro 128 bits est très difficile et peut prendre un temps considérable - votre URL est effectivement protégée par une clé 128 bits.

Supposons ensuite que quelqu'un ait partagé cette URL sur le raccourcisseur d'URL de Google. Aujourd'hui, ce service émet un identifiant long de 10 caractères, composé de lettres et de chiffres. (26 + 10) ^ 10 ~ = 3.6 * 10 ^ 15 <2 ^ 52 - nous avons donc réduit de moitié l'intensité de la clé de 128 bits à 52 bits.

Ajoutez à cela le fait que les générateurs n'utilisent pas l'intégralité de l'espace pour d'autres raisons et vous pouvez monter une attaque efficace qui combine la force brute avec des canaux secondaires (le plus souvent des tampons d'URL aléatoires pré-alloués).

L'article original: http://arxiv.org/pdf/1604.02734v1.pdf
Un article de blog résumant l'article (rédigé par l'auteur): https://freedom-to-tinker.com/blog/vitaly/gone-in- urls courts à six caractères considérés comme nuisibles pour les services de cloud computing /


2
Eh bien, oui, mais on souhaiterait que quiconque utilisant de tels services pour des données sensibles sache mieux que d'afficher les URL n'importe où , y compris vers un service de réduction de la taille. Ce n'est pas vraiment différent de dire que les Gah! My password/private key is too long and complex. I know! I'll just write it in a text document and put that in a zip file with an easier password.deux sont des échecs transparents, ce qu'on espère contre tout espoir que les gens ne soient pas assez stupides pour le faire. Mais oui, en réalité, malheureusement, votre avertissement est probablement nécessaire;)
underscore_d

@underscore_d ouais exactement - si vous connaissez ce sujet avec suffisamment de détails pour pouvoir le commenter, alors ce n'est pas un argument digne d'un blog.
Robert Grant
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.