Exposer les identifiants de base de données - risque de sécurité?

134

J'ai entendu dire que l'exposition des identifiants de base de données (dans les URL, par exemple) est un risque pour la sécurité, mais j'ai du mal à comprendre pourquoi.

Des opinions ou des liens expliquant pourquoi c'est un risque ou pourquoi ce n'est pas le cas?

EDIT: bien sûr, l'accès est limité, par exemple si vous ne pouvez pas voir la ressource, foo?id=123vous obtiendrez une page d'erreur. Sinon, l'URL elle-même doit être secrète.

EDIT: si l'URL est secrète, elle contiendra probablement un token généré qui a une durée de vie limitée, par exemple valable 1 heure et ne peut être utilisé qu'une seule fois.

EDIT (des mois plus tard): ma pratique préférée actuelle pour cela est d'utiliser UUIDS pour les identifiants et de les exposer. Si j'utilise des nombres séquentiels (généralement pour les performances sur certaines bases de données) comme ID, j'aime générer un jeton UUID pour chaque entrée en tant que clé alternative, et l'exposer.

orip
la source

Réponses:

109

Dans les bonnes conditions, exposer des identifiants ne constitue pas un risque pour la sécurité. Et, en pratique, il serait extrêmement lourd de concevoir une application Web sans exposer les identifiants.

Voici quelques bonnes règles à suivre:

  1. Utilisez la sécurité basée sur les rôles pour contrôler l'accès à une opération. La façon dont cela est fait dépend de la plate-forme et du cadre que vous avez choisis, mais beaucoup prennent en charge un modèle de sécurité déclaratif qui redirigera automatiquement les navigateurs vers une étape d'authentification lorsqu'une action nécessite une autorisation.
  2. Utilisez la sécurité par programmation pour contrôler l'accès à un objet. C'est plus difficile à faire au niveau du cadre. Le plus souvent, c'est quelque chose que vous devez écrire dans votre code et qui est donc plus sujet aux erreurs. Cette vérification va au-delà de la vérification basée sur les rôles en s'assurant non seulement que l'utilisateur dispose des droits pour l'opération, mais également des droits nécessaires sur l'objet spécifique en cours de modification. Dans un système basé sur les rôles, il est facile de vérifier que seuls les managers peuvent donner des augmentations, mais au-delà de cela, vous devez vous assurer que l'employé appartient au département du manager particulier.
  3. Pour la plupart des enregistrements de base de données, les conditions 1 et 2 sont suffisantes. Mais l'ajout d'identifiants imprévisibles peut être considéré comme une petite assurance supplémentaire, ou «sécurité en profondeur», si vous adhérez à cette notion. Un endroit où les identifiants imprévisibles est une nécessité, cependant, est dans les ID de session ou d'autres jetons d'authentification, où l'ID lui-même authentifie une demande. Ceux-ci doivent être générés par un RNG cryptographique.
Erickson
la source
27
OMI, l'ajout d'identifiants imprévisibles est une approche de «sécurité par l'obscurité» et peut conduire à un faux sentiment de sécurité. Il est préférable de se concentrer sur (1) et (2) et de vous assurer que votre contrôle d'accès est solide.
stucampbell
4
Utiliser un RNG cryptographique n'est certainement pas «la sécurité par l'obscurité». L'attaquant n'est pas plus près de deviner les identifiants d'objets même s'il sait comment vous les générez. La sécurité par l'obscurité signifie que si l'algorithme que vous utilisez est découvert, il peut être exploité. Il ne fait pas référence à la conservation de secrets, comme les clés ou l'état interne d'un RNG.
erickson
1
@stucampbell Peut-être, mais cela ne veut pas dire que vous ne devriez pas du tout utiliser d'identifiants imprévisibles. Des bugs se produisent, donc les identifiants imprévisibles sont un mécanisme de sécurité supplémentaire. En outre, le contrôle d'accès n'est pas la seule raison de les utiliser: des identifiants prévisibles peuvent révéler des informations sensibles telles que le nombre de nouveaux clients dans un certain délai. Vous ne voulez vraiment pas exposer de telles informations.
user247702
1
@Stijn vous ne pouvez pas vraiment dire que je «ne veux vraiment pas» révéler le nombre de clients que j'ai. Je veux dire que McDonald's a un énorme panneau indiquant qu'ils ont servi 10 milliards de hamburgers. Ce n'est pas du tout un risque pour la sécurité, c'est une préférence. De plus, vous devez vous connecter avant de voir des URL dans la plupart des applications pour lesquelles nous nous en soucierions de toute façon. Par conséquent, nous saurions qui récupérait les données.
Wayne Bloss
1
Une chose que je n'ai pas vue mentionnée dans cette conversation est que du point de vue du dépannage et de la facilité d'utilisation, il peut être très pratique d'exposer les identifiants dans une URL pour aider les utilisateurs à diriger vers une ressource spécifique ou leur permettre pour vous dire exactement quelle ressource ils consultent. Vous pouvez principalement éviter les problèmes de business intelligence en démarrant l'incrémentation automatique à une valeur plus élevée, juste pour proposer une idée.
Chockomonkey
47

Bien qu'il ne s'agisse pas d'un risque pour la sécurité des données, il s'agit absolument d'un risque de sécurité de l'intelligence d'affaires car il expose à la fois la taille et la vitesse des données. J'ai vu des entreprises en souffrir et j'ai écrit en profondeur sur cet anti-modèle. À moins que vous ne construisiez simplement une expérience et non une entreprise, je vous suggère fortement de garder vos identifiants privés hors de la vue du public. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e

Peter
la source
4
Enfin, réponse saine apportant d'autres aspects que le risque de sécurité.
peceps
2
Cela devrait être la réponse acceptée. Si vous supposez que l'attaquant peut contourner votre sécurité (ce que vous devriez toujours faire), vous ne voulez pas simplement transmettre ce type d'informations.
Kriil
@Kriil Ils n'ont même pas besoin de contourner votre sécurité. Il leur suffit de créer un compte!
Peter
32

Cela dépend de ce que représentent les ID.

Considérons un site qui, pour des raisons de concurrence, ne souhaite pas rendre public le nombre de membres dont il dispose, mais en utilisant des ID séquentiels, il le révèle quand même dans l'URL: http://some.domain.name/user?id=3933

D'autre part, s'ils ont utilisé le nom de connexion de l'utilisateur à la place: http://some.domain.name/user?id=some, ils n'ont rien révélé que l'utilisateur ne savait pas déjà.

certains
la source
2
si vous utilisez des identifiants séquentiels, vous avez raison, mais sinon, cela n'expose rien
orip
@orip: Comme je l'ai dit, cela dépend de ce que quelqu'un peut découvrir en examinant plusieurs identifiants. Y a-t-il un modèle? Peuvent-ils utiliser ces informations pour obtenir des informations qu'ils ne sont pas censés avoir?
certains
@John: Merci pour la modification. L'anglais n'est pas ma langue maternelle :)
certains
6
J'ai fait exactement ceci: utilisé des numéros d'identification séquentiels pour déterminer la taille de la base d'utilisateurs d'un concurrent.
Micah
3
Ils sont partout. De nombreux sites de vente utilisent un numéro séquentiel pour l'ID de commande. Passez une commande à une date et une à une autre date et vous savez combien de commandes ils ont reçues pendant cette période. Même si vous ne savez pas combien d'argent les commandes valent, vous obtenez toujours une indication de la façon dont l'entreprise va bien.
du
25

L'idée générale va dans ce sens: "Ne divulguez que peu d'informations sur le fonctionnement interne de votre application à quiconque."

L'exposition de l'ID de la base de données compte comme la divulgation de certaines informations.

Les raisons en sont que les pirates peuvent utiliser n'importe quelle information sur le fonctionnement interne de vos applications pour vous attaquer, ou qu'un utilisateur peut modifier l'URL pour accéder à une base de données qu'il n'est pas censé voir?

Arjan Einbu
la source
1
Accéder à des ressources qu'ils ne sont pas censés voir - uniquement si je ne vérifie pas les autorisations (ce que je fais, sinon j'ai un problème de sécurité différent). Divulguer des informations sur le «fonctionnement interne» - c'est exactement ma question. Pourquoi est-ce un problème?
orip
8
@orip: Il s'agit d'être aussi sûr que possible. Si vous êtes le genre de programmeur qui ne fait pas d'erreur, alors ce n'est pas un problème. Sinon, exposer moins de détails rend plus difficile l'exploitation de votre code si (quand) vous faites des erreurs. En soi, vous avez raison, cela n'ajoute pas de sécurité.
Adam Bellaire
@Adam: la sécurité superficielle peut être pire que l'absence de sécurité. Sans sécurité, vous êtes explicite, avec une sécurité superficielle, vous pourriez penser que cela ajoute quelque chose de non négligeable.
orip
16

Nous utilisons des GUID pour les identifiants de base de données. Leur fuite est beaucoup moins dangereuse.

Joshua
la source
C'est ce que je suggérerais. Beaucoup moins susceptible de deviner les GUID de votre base de données.
Jon Erickson
6
Cela entraîne une pénalité de performance. Voir ici
Jeshurun
2
La chose intéressante 1 à propos de l'utilisation des guids est que vous pouvez laisser les clients générer des identifiants de base de données. La chose intéressante 2 est qu'ils n'ont aucun problème avec les bases de données partitionnées comme le font les identifiants à incrémentation automatique.
Brian White
Utilisez-vous ces GUID également dans le code html comme attributs d'identifiant pour identifier les utilisateurs, les commentaires, les publications? Pour indiquer sur quel lien un utilisateur a cliqué ou sur quel message il souhaite commenter?
trzczy
7

Si vous utilisez des ID entiers dans votre base de données, vous pouvez permettre aux utilisateurs de voir facilement les données qu'ils ne devraient pas en modifiant les variables qs.

Par exemple, un utilisateur pourrait facilement changer le paramètre id dans ce qs et voir / modifier les données qu'il ne devrait pas http: // someurl? Id = 1

Jason
la source
7
Si je ne vérifie pas les autorisations, j'ai un problème de sécurité différent.
orip
mais la réponse est exacte: "peut"
Seun Osewa
1
La question n'est pas de savoir si vous allez vérifier les autorisations. C'est si le nouvel employé que vous ne connaissez pas vérifie les autorisations.
Brian White
@BrianWhite - c'est pourquoi vous voulez qu'un processus de révision du code soit en place, afin de pouvoir les éduquer avant qu'il n'entre en production.
candu
2
Ce que nous faisons, c'est crypter les identifiants entiers lorsqu'ils sont utilisés dans l'URL ou les variables de formulaire.
Brian White
6

Lorsque vous envoyez des identifiants de base de données à votre client, vous êtes obligé de vérifier la sécurité dans les deux cas. Si vous conservez les identifiants dans votre session Web, vous pouvez choisir si vous voulez / devez le faire, ce qui signifie potentiellement moins de traitement.

Vous essayez constamment de déléguer des choses à votre contrôle d'accès;) Cela peut être le cas dans votre application mais je n'ai jamais vu un système back-end aussi cohérent de toute ma carrière. La plupart d'entre eux ont des modèles de sécurité conçus pour une utilisation non Web et certains ont eu des rôles supplémentaires ajoutés à titre posthume, et certains d'entre eux ont été boulonnés en dehors du modèle de sécurité de base (parce que le rôle a été ajouté dans un contexte opérationnel différent, par exemple avant le web).

Nous utilisons donc des identifiants locaux de session synthétiques car ils cachent autant que nous pouvons nous en sortir.

Il y a aussi le problème des champs de clé non entiers, ce qui peut être le cas pour les valeurs énumérées et similaires. Vous pouvez essayer de nettoyer ces données, mais il y a de fortes chances que vous finissiez par devenir de petites tables de dépôt .

Krosenvold
la source
4
Intéressant, même si je pense que la vérification de toutes les entrées (y compris les paramètres d'URL) pour chaque demande est très appropriée pour le Web.
orip