Question

Arrière-plan:

Je conçois le schéma d'authentification d'un service Web REST. Cela ne "vraiment" pas besoin d’être en sécurité (c’est plus un projet personnel) mais je veux le rendre aussi sécurisé que possible comme un exercice / une expérience d’apprentissage. Je ne veux pas utiliser SSL car je ne veux pas de tracas et, surtout, des frais d'installation.

Ces questions SO étaient particulièrement utiles pour me lancer:

Je pense utiliser une version simplifiée de Authentification d'Amazon S3 (j'aime OAuth , mais cela me semble trop compliqué pour mes besoins). J'ajoute un nonce généré au hasard, fourni par le serveur, à la demande, pour empêcher la réexécution. attaques.

Pour en venir à la question:

S3 et OAuth reposent tous deux sur la signature de l'URL de la requête avec quelques en-têtes sélectionnés. Ni l'un ni l'autre n'a signé le corps de la requête pour les requêtes POST ou PUT. Cela n’est-il pas vulnérable à une attaque de type intermédiaire, qui conserve l'URL et les en-têtes et remplace le corps de la demande par les données que l'attaquant souhaite?

Il semble que je puisse me protéger contre cela en incluant un hachage du corps de la demande dans la chaîne à signer. Est-ce sécurisé?

Était-ce utile?

La solution

Une réponse précédente mentionnait uniquement SSL dans le contexte du transfert de données et ne couvrait pas réellement l'authentification.

Vous vous interrogez sur l'authentification sécurisée des clients de l'API REST. Sauf si vous utilisez l'authentification du client TLS, seul SSL n'est pas un mécanisme d'authentification viable pour une API REST. SSL sans autorisation client authentifie uniquement le serveur , ce qui n’est pas pertinent pour la plupart des API REST car vous souhaitez authentifier le client .

Si vous n'utilisez pas l'authentification du client TLS, vous devrez utiliser un schéma d'authentification basé sur un résumé (comme le schéma personnalisé d'Amazon Web Service) ou une authentification OAuth 1.0a ou même HTTP Basic (mais uniquement via SSL). .

Ces schémas authentifient que la demande a été envoyée par une personne attendue. TLS (SSL) (sans authentification du client) garantit que les données envoyées sur le réseau restent non marquées. Ce sont des préoccupations distinctes, mais complémentaires.

Pour les personnes intéressées, j'ai développé une question SO sur Schémas d'authentification HTTP et leur fonctionnement .

Autres conseils

REST signifie travailler avec les normes du Web et les normes "sécurisé". le transfert sur le web est SSL. Tout le reste sera funky et nécessitera un effort de déploiement supplémentaire pour les clients, qui devront disposer de bibliothèques de chiffrement disponibles.

Une fois que vous vous êtes inscrit à SSL, rien n’est en principe requis pour l’authentification en principe. Vous pouvez à nouveau utiliser les normes Web et utiliser l’authentification HTTP de base (nom d’utilisateur et jeton secret envoyés avec chaque demande), ce qui est beaucoup plus simple qu’un protocole de signature élaboré et qui reste efficace dans le contexte d’une connexion sécurisée. Vous devez simplement vous assurer que le mot de passe ne dépasse jamais le texte brut. Par conséquent, si le mot de passe est déjà reçu via une connexion en texte brut, vous pouvez même le désactiver et envoyer un courrier électronique au développeur. Vous devez également vous assurer que les identifiants ne sont enregistrés à aucun endroit lors de la réception, tout comme vous ne consigneriez pas un mot de passe normal.

HTTP Digest est une approche plus sûre car elle empêche la transmission du jeton secret. au lieu de cela, c'est un hachage que le serveur peut vérifier à l'autre bout. Bien que cela puisse être excessif pour des applications moins sensibles si vous avez pris les précautions mentionnées ci-dessus. Après tout, le mot de passe de l'utilisateur est déjà transmis en texte brut lorsqu'il se connecte (sauf si vous utilisez un cryptage JavaScript sophistiqué dans le navigateur), ainsi que ses cookies à chaque demande.

Notez qu'avec les API, il est préférable que le client transmette des jetons (chaînes générées de manière aléatoire) au lieu du mot de passe avec lequel le développeur se connecte au site Web. Le développeur doit donc pouvoir se connecter à votre site et générer de nouveaux jetons pouvant être utilisés pour la vérification de l'API.

La principale raison d'utiliser un jeton est qu'il peut être remplacé s'il est compromis, alors que si le mot de passe est compromis, le propriétaire peut se connecter au compte du développeur et faire tout ce qu'il veut avec. Un autre avantage des jetons est que vous pouvez en envoyer plusieurs aux mêmes développeurs. Peut-être parce qu'ils ont plusieurs applications ou parce qu'ils veulent des jetons avec différents niveaux d'accès.

(Mise à jour pour couvrir les implications de la connexion SSL uniquement.)

Vous pouvez également utiliser la solution connue à ce problème et utiliser SSL. Les certificats auto-signés sont gratuits et c’est un projet personnel, non?

Si vous avez besoin du hachage du corps comme l'un des paramètres de l'URL et que cette URL soit signée via une clé privée, une attaque par un tiers ne pourrait alors que remplacer le corps par un contenu qui: générerait le même hash. Facile à faire avec les valeurs de hachage MD5 maintenant au moins et quand SHA-1 est cassé, eh bien, vous obtenez l'image.

Pour protéger le corps contre toute tentative de falsification, vous devez demander la signature du corps. Une attaque d'infiltration serait moins susceptible de se briser, car ils ne connaissent pas la clé privée génère la signature.

En fait, l’autorisation S3 originale autorise à permettre la signature du contenu, bien qu’elle porte une signature MD5 faible. Vous pouvez simplement appliquer leur pratique facultative consistant à inclure un en-tête Content-MD5 dans HMAC (chaîne à signer).

http://s3.amazonaws.com/doc/s3- Guide du développeur / RESTAuthentication.html

Leur nouveau schéma d'authentification v4 est plus sécurisé.

http: //docs.aws.amazon. com / general / latest / gr / signature-version-4.html

N'oubliez pas que vos suggestions empêchent les clients de communiquer avec le serveur. Ils ont besoin de comprendre votre solution innovante et de chiffrer les données en conséquence, ce modèle n’est pas si bon pour les API publiques (à moins que vous ne soyez amazon \ yahoo \ google ..).

Quoi qu'il en soit, si vous devez chiffrer le contenu du corps, je vous suggère de vérifier les normes et solutions existantes, telles que:

Cryptage XML (norme W3C)

Sécurité XML

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top