web-dev-qa-db-fra.com

Sécurité pour REST api (user / pass auth vs hmac vs oauth)

J'ai deux serveurs (un sur Hetzner (je l'appelle H) et l'autre dans mon bureau (l'appelle O)). Je dois exécuter un service Web CRUD de base sur O et le seul consommateur du service est H. Les données sur O sont des données utilisateur sensibles. Il s'agit d'un service temporaire de ruban adhésif qui disparaîtra à l'avenir avec le besoin du serveur O.

Voici ce que j'ai en tête:

  1. Le service fonctionnera sur https
  2. Authentification HTTP de base pour l'authentification des demandes
  3. Ouverture du port sur O uniquement pour l'IP de H via iptables.

Je voudrais savoir si cela semble suffisamment sécurisé ou s'il y a quelque chose que j'aurais pu ignorer? Y a-t-il des avantages que HMAC ou OAuth offrent par rapport à cette approche?

15
Abhinav Kaushik

HMAC est un algorithme cryptographique qui fait sens dans le cadre de protocoles plus importants; vous ne devriez pas jouer avec lui directement. Lorsque vous utilisez HTTPS, la couche SSL comprend en fait certains HMAC (entre autres algorithmes).

OAuth est une norme d'autorisation dont le cas d'utilisation principal est la gestion de l'authentification des utilisateurs sans partager les informations d'identification - l'idée étant qu'un utilisateur pourrait avoir les informations d'identification (un grand mot pour "mot de passe") connu d'un seul serveur, qui peut être utilisé pour obtenir l'accès par plusieurs autres serveurs sans leur faire suffisamment confiance pour leur montrer le mot de passe réel. Dites, serveurs [~ # ~] s [~ # ~] et [~ # ~] t [~ # ~] faites confiance au serveur d'authentification [~ # ~] a [~ # ~], l'utilisateur [~ # ~] u [~ # ~] fait également confiance à [~ # ~] un [~ # ~] assez pour lui montrer son mot de passe (dans une connexion HTTPS), et [~ # ~] s [~ # ~] et [~ # ~] t [~ # ~] parlez à [~ # ~] un [~ # ~] pour vous assurer que l'utilisateur [~ # ~] u [~ # ~] est bien celui qu'il prétend être; la partie agréable est que [~ # ~] s [~ # ~] et [~ # ~] t [~ # ~] ne voit jamais le mot de passe et [~ # ~] u [~ # ~] n'a pas besoin de faire confiance eux.

Dans votre cas, vous avez un seul "utilisateur" (votre serveur [~ # ~] h [~ # ~]) et puisque c'est une machine, il n'a pas besoin d'être pointilleux sur son mot de passe; [~ # ~] h [~ # ~] peut avoir un "mot de passe" (une longue séquence de caractères aléatoires) qui [~ # ~] h [~ # ~] n'utilisera que pour s'authentifier avec [~ # ~] o [~ # ~], il n'y a donc pas besoin de la complexité supplémentaire d'OAuth.

La vulnérabilité inhérente est que le serveur [~ # ~] h [~ # ~] a accès aux éléments sensibles Les données. C'est par conception, mais cela signifie que les données parviennent à un serveur hébergé, ce qui implique que vous faites confiance au service d'hébergement pour ne pas jeter un œil à vos données ou les divulguer par négligence. Vous ne pouvez pas y échapper, selon la définition de votre problème. Vous considérez essentiellement que le serveur [~ # ~] h [~ # ~] est à l'abri, par lui-même, des écoutes et des modifications hostiles. Dans ces conditions, l'authentification "de base" de HTTP s'exécute dans HTTPS ça ira.

Vous voudrez peut-être resserrer un peu l'authentification du serveur: machine [~ # ~] h [~ # ~] devra s'assurer qu'il parle au véritable [~ # ~ ] o [~ # ~] serveur, ce qui implique normalement la validation du certificat. Vous pouvez configurer [~ # ~] h [~ # ~] pour faire une "confiance directe", c'est-à-dire importer dans [~ # ~] h [~ # ~] une copie de [~ # ~] o [~ # ~] le certificat (uniquement le certificat public, pas la clé privée), et indiquant [~ # ~] h [~ # ~] pour faire confiance à ce certificat spécifique et à aucun autre. Cela peut éviter des problèmes avec les autorités de certification et, en particulier, permet une utilisation sûre des certificats auto-signés, qui sont bon marché (car vous n'avez pas à payer une AC pour un tel certificat).

15
Tom Leek