Quelles sont les meilleures pratiques pour sécuriser une API Web?

15

J'ai besoin de créer une API de service Web pour que notre application mobile interagisse avec notre serveur et notre base de données (dans ASP.Net MVC 4, mais ce n'est guère pertinent). Bien que la plupart des actions n'aient pas besoin que les utilisateurs soient enregistrés avec notre service, nous aimerions restreindre l'accès uniquement aux utilisateurs de notre application.

Quelles sont les méthodes pour s'assurer que les appels passés depuis un autre endroit (par exemple, quelqu'un qui veut toutes nos données ou qui crée une application non officielle) sont rejetés?

Mon idée initiale est que l'appareil demande au serveur un jeton, qui est généré au hasard et envoyé tel quel. Toutes les autres méthodes vérifieront que les en-têtes de demande en contiennent un spécifique qui sera le hachage md5 du jeton salé. Le serveur connaît le jeton et le sel et est capable de calculer le hachage et de le comparer avec celui envoyé. De plus, le jeton a une durée de vie limitée et l'appareil doit en obtenir un autre toutes les deux heures.

Cela semble assez facile à mettre en œuvre et bien que ce ne soit probablement pas une preuve à 100%, cela semble être une bonne idée. Qu'est-ce que tu penses?

Antoine
la source

Réponses:

15

Dès que vous relâchez l'application, elle peut être rétroconçue. Cela signifie que vous ne pouvez rien faire pour être protégé à 100% si la même application (mêmes binaires, mêmes paramètres) est distribuée à tous vos utilisateurs.

Si vous pouvez personnaliser l'application pour chaque utilisateur, vous avez peut-être la possibilité d'interdire à une autre application d'utiliser votre API, mais au moins de limiter cette application par le nombre de demandes qu'elle peut faire à l'API.

Imaginez le schéma suivant:

  1. Le client se connecte et envoie son identifiant unique (un identifiant par utilisateur).
  2. Le serveur répond en envoyant un défi chiffré avec une clé publique. Cette clé publique est associée à l'identifiant unique envoyé précédemment.
  3. Le client résout le défi en déchiffrant les données à l'aide d'une clé privée et envoie le secret déchiffré en clair au serveur.
  4. Le serveur vérifie que le secret soumis correspond à celui généré à l'origine.

Le développeur qui piratera votre application et obtiendra avec succès la clé privée pourra utiliser votre API à partir de sa propre application, mais il sera identifiant comme lui-même pour votre serveur.

Si le même utilisateur peut faire 10 000 requêtes par jour à votre API et en moyenne, un utilisateur actif fait 2 000 requêtes par jour, cela signifie que ce développeur pourra utiliser lui-même son application et peut-être la donner à ses amis, mais il ne pourrait pas, par exemple, le vendre à des milliers de personnes, simplement parce que cela ne fonctionnera que quelques minutes le matin.

Bien que cela aide, ce n'est pas non plus une preuve à 100%. Que faire si le pirate trouve un moyen d'extraire la clé privée de votre application lorsque sa propre application est installée sur l'appareil?


Note complémentaire qui ne répond pas à votre question, mais qui pourrait quand même être utile: ne pensez pas à une API comme outil pour votre produit principal (application mobile). Considérez-le comme un produit de première classe lui-même, un produit qui peut être payé. Le même modèle est utilisé depuis des années par Amazon et Google, il commence à être activement utilisé par Microsoft avec Azure, etc.

Dès que vous considérez l'API non pas comme un outil secondaire réduit à l'esclavage pour vos nouvelles applications mobiles brillantes, mais le produit réel, au même niveau que n'importe quelle application que l'utilisateur voit réellement, vous commencez à penser moins à la façon de protéger l'API contre l'utilisation par d'autres applications, et plus sur la monétisation de l'API elle-même. Cette API peut être utilisée par vos applications qui sont ses clients, ou toute autre application, librement développée par n'importe qui. Cela présente plusieurs avantages:

  • Faire une API pour qu'elle ne soit utilisée que par vos applications est difficile et coûteux. Ce temps et cet argent peuvent être utilisés pour quelque chose de plus utile.

  • L'ouverture de votre API au public peut avoir un grand avantage pour vous et pour le monde. Imaginez que vous êtes un grand architecte et un grand développeur, vous avez donc créé une API étonnamment géniale, mais vos compétences de concepteur visuel sont nulles et vous ne comprenez vraiment rien à la conception d'interaction, etc. Si vous cachez votre API, la seule Ce que les gens savent, c'est que vous avez créé une application mobile inutilisable et moche. Si votre API est publique, d'autres développeurs seront attirés par sa qualité et y rédigeront de superbes applications, vous rapportant beaucoup d'argent.

  • Vous n'imaginez jamais comment d'autres personnes peuvent utiliser vos API. C'est ce qui s'est produit avec Kinect. À l'origine, Microsoft a créé Kinect pour les jeux. Lorsque Microsoft a ouvert l'API au public, ils n'ont jamais imaginé qu'elle serait utilisée quelques années plus tard par les applications scientifiques, le secteur de la santé, etc. Il en va de même pour les API Web: plus de développeurs l'utilisent, plus les idées seraient répandues.

Arseni Mourzenko
la source
Réponse très intéressante. Nous devons probablement réfléchir à la manière de rendre l'API publique. Également à titre de référence, le marché cible en France, où la rétro-ingénierie et le démontage sont illégaux, nous devons donc trop nous en préoccuper.
Antoine
2
@Antoine: Revere engineering serait illégal dans n'importe quel pays dès que la licence l'interdit. Mais le fait qu'il soit illégal ne signifie pas que personne ne vénèrera l'ingénierie de votre application.
Arseni Mourzenko