1
votes

Comment empêcher l'authentification du service Web Rest avec un jeton volé

Comme nous le savons, les services Rest sont sans état, les stratégies générales d'authentification utilisent une authentification basée sur des jetons.

Dans le service de connexion, il faut des informations d'identification qui renvoient un jeton.

Ce jeton peut être défini dans les cookies du client, et toutes les demandes ultérieures utilisent ce jeton pour être validées et traiter une nouvelle demande si le jeton est valide.

Ma question est maintenant de savoir comment valider le jeton? Si quelqu'un a volé le jeton et tente d'accéder aux services de repos avec un jeton volé en modifiant simplement les cookies, comment peut-il être identifié et restreint?

Nous ne pouvons jamais savoir si le jeton est récupéré par un utilisateur valide et le même utilisateur essaie d'accéder à la demande suivante. mais quels sont les moyens possibles de rendre les choses plus difficiles, comme vérifier si la demande provient de la même source?

Une suggestion générale est de définir le vieillissement pour les jetons / cookies, mais cela n'est toujours pas utile jusqu'à l'âge de ces jetons / cookies.

Toutes les suggestions seraient appréciées.


3 commentaires

Quel est le modèle de menace ici? Comment un jeton serait-il volé puis abusé?


@root Token est stocké dans les cookies côté client, il est possible que certains autres sites Web utilisés via le navigateur puissent récupérer ces cookies.


Le navigateur n'autorise pas n'importe quel site à accéder aux cookies de tout autre site. Pour voler des cookies, vous avez besoin de quelque chose de plus important, par exemple. XSS persistant.


5 Réponses :


6
votes

Je ne pense pas qu'il existe des méthodes à 100% infaillibles pour empêcher l'accès avec des jetons d'utilisateurs volés. Comment savez-vous que le jeton est volé en premier lieu? Mais du haut de ma tête, vous voudrez peut-être envisager de suivre:

  1. L'accès à un service REST avec le même jeton mais avec un agent utilisateur différent est suspect. Cela peut être reconnu avec la valeur de l'en-tête User-Agent. Vous voudrez peut-être envisager de supprimer ces demandes.
  2. Que faire si l'adresse IP change mais que le jeton est toujours le même? Eh bien, peut-être que quelqu'un utilise un équilibreur de charge et accède au réseau via différentes adresses IP? Ou il a accédé à un VPN avec le même jeton / cookie qu'avant? Si vous n'avez aucun scrupule à abandonner ces demandes, vous pouvez augmenter la sécurité en vérifiant également l'adresse IP source.
  3. Dans le cas, par exemple, de jetons JWT, vous aurez besoin d'un peu d'infrastructure pour gérer la liste noire. Suivez ceci .

2 commentaires

Au Royaume-Uni, les FAI bien connus changent fréquemment les adresses IP des utilisateurs - équilibre la sécurité avec l'expérience utilisateur


attribuer la prime car elle expirait, et cette réponse était plus pertinente, mais nous avons mis en œuvre une solution appropriée. J'ai expliqué la même chose dans ma réponse.



2
votes

Ma compréhension actuelle de l'approche "la plus sécurisée" pour autoriser les requêtes dans le navigateur est d'exiger la validation d'un cookie HttpOnly SameSite ET d'un en-tête HTTP (par exemple, Authorization ou X-CSRF-Token ) en combinaison.

Par exemple, lors de l'émission du JWT vers un navigateur, envoyez la signature JWT dans un cookie HttpOnly SameSite , et envoyez le corps (sans signature) au client pour le stocker dans localStorage < / code> et soumettez-le dans l'en-tête Authorization . Lorsque vous autorisez une requête, combinez les deux dans le JWT complet et validez-le comme d'habitude par la suite.

Alternativement, vous pouvez générer deux JWT avec un champ pour les distinguer (par exemple, le client contient "browser" , le cookie contient "cookie" ) et exigent que les deux soient valides et que les deux identifient le même utilisateur. L'un est envoyé dans l'en-tête Authorization et stocké dans localStorage et l'autre utilise le cookie SameSite HttpOnly .

Une autre approche populaire consiste à stocker un jeton CSRF dans un champ du JWT, à placer le JWT dans un cookie et à demander au client d'envoyer un jeton correspondant dans un en-tête (par exemple X-CSRF-Token ).

Toutes les solutions empêchent efficacement les attaques XSS et CSRF: XSS ne peut pas récupérer le cookie HttpOnly, et CSRF n'inclut pas l'en-tête HTTP, donc cela bloque les deux attaques.

Notez que vous ne souhaitez probablement appliquer cette règle qu'aux requêtes des navigateurs Web. Pour la communication de serveur à serveur, les demandes ne sont pas soumises aux attaques CSRF et XSS.


0 commentaires

1
votes

Vous pouvez utiliser jwt est une norme Internet pour créer des jetons d'accès basés sur JSON qui revendiquent un certain nombre de revendications. Par exemple, un serveur peut générer un jeton avec la revendication «connecté en tant qu'administrateur» et le fournir à un client. Le client peut ensuite utiliser ce jeton pour prouver qu'il est connecté en tant qu'administrateur.

Comment ça marche?

D'abord, il contient la clé privée générée par le développeur:

laissez-nous cette clé: sfcqw @ sav% $ # fvcxv * s_s515 et celle-ci appelée privée key, et nous avons également une clé publique, la clé publique générée dépendait des données utilisateur et de la clé privée et il est impossible de savoir ce qu'il contient si vous ne connaissez pas la clé privée.

pour plus d'explications:

clé publique:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.plpJkAcgrgCIsoRyV2kjGsvWF6OsXU1mD785OSWTH4o

nous avons la clé ci-dessus générée par notre clé privée: sfcqw @ sav% $ # fvcxv * s_s515 entrez la description de l'image ici Pour être plus clair sur ce site Web: https://jwt.io/ et essayez de passer la clé publique sans mettez la clé de secrite comme l'image et vous comprendrez tout.


0 commentaires

0
votes

Pour moi, il n'y avait aucun moyen d'empêcher l'accès au jeton JWT volé sauf

  • définition d'un court délai d'expiration pour le jeton
  • plus sécurisé au niveau de la requête HTTP en n'autorisant que des `User-Agent. En savoir plus
  • plus sécurisé au niveau de la requête HTTP en personnalisant la clé d'en-tête pour l'organisation, par exemple My-X-Auth = Bearer au lieu de Authorization = Bearer
  • plus sécurisé au niveau des requêtes HTTP en limitant les URL / domaines de confiance, par exemple X-Content-Security-Policy . En savoir plus

0 commentaires

1
votes

Après avoir lutté avec diverses approches, nous avons trouvé une solution expliquée ci-dessous:

  1. Nous stockons des jetons (cryptés) dans les cookies lors de la demande de connexion et pour chaque demande ultérieure, ce cookie est validé.
  2. Le problème était si quelqu'un remplaçait le jeton dans le cookie par un autre jeton valide, car les cookies sont conservés par le navigateur client.

Solution: -> Bien que les valeurs de jeton aient été cryptées, elles ne représentaient qu'une seule valeur, donc si on remplace la valeur cryptée entière par une autre valeur cryptée valide, elle peut être piratée.

Pour résoudre ce problème, nous avons ajouté un autre cookie qui était une combinaison de plusieurs valeurs.

Par exemple

Cookie 1 -> jeton chiffré

Cookie 2 -> Un objet crypté contenant des informations comme le nom d'utilisateur + quelques autres détails du contexte utilisateur + un jeton

Donc, dans le cas du cookie 1, il était facile de le remplacer par une autre valeur chiffrée car elle ne représentait qu'un seul jeton bien qu'il soit chiffré.

Mais dans le cas du cookie 2, il contenait un objet avec plusieurs valeurs, donc seule la valeur du jeton ne peut pas être modifiée, chiffrée et replacée dans le même cookie.

Avant l'authentification Nous sommes en train de déchiffrer tout le cookie 2, d'extraire une partie du jeton et de valider la partie de jeton contre le cookie 1.

Cela a résolu notre problème !!

Merci à tous pour votre temps et vos conseils.


0 commentaires