Les meilleures Pratiques pour sécuriser une API REST / web service
Lors de la conception d'une API REST ou d'un service sont-il des pratiques exemplaires établies pour traiter de la sécurité (Authentification, l'Autorisation, la Gestion de l'Identité) ?
Lors de la construction d'une API SOAP, vous avez WS-Security en tant que guide et beaucoup de littérature existe sur le sujet. J'ai trouvé de moins en moins d'informations sur la sécurisation RESTE des points de terminaison.
Alors que je comprends le REPOS intentionnellement ne pas avoir des caractéristiques analogues à WS-* je suis en espérant que les meilleures pratiques ou les modèles recommandés ont émergé.
Toute discussion ou des liens vers des documents pertinents serait très apprécié.
Si il le faut, nous serions en utilisant WCF avec POX/JSON sérialisé messages pour notre API REST/des Services construit à l'aide de la v3.5 de la .NET Framework.
- connaissez-vous une pleine application réelle à l'aide de bonnes pratiques et modèles avec le RESTE de l'API et webServices sur github?
Vous devez vous connecter pour publier un commentaire.
Comme tweakt dit, Amazon S3 est un bon modèle pour travailler avec. Leur demande de signatures n'ont certaines fonctions (telles que l'intégration d'un timestamp) qui aident à protéger contre accidentelle ou malveillante demande de relecture.
La bonne chose à propos de HTTP de Base est que pratiquement tous HTTP bibliothèques de la soutenir. Vous aurez, bien sûr, besoin de besoin de SSL dans ce cas, car l'envoi de mots de passe en clair sur le net est presque toujours une mauvaise chose. De base est préférable à Digérer lors de l'utilisation de SSL, car même si l'appelant sait déjà que les informations d'identification sont nécessaires, Digérer nécessite un aller-retour supplémentaire pour l'échange de la valeur de nonce. Avec la de Base, les appelants il suffit d'envoyer les informations d'identification de la première fois.
Une fois l'identité du client est établie, l'autorisation est vraiment juste un problème de mise en œuvre. Cependant, vous pourriez déléguer l'autorisation à d'autres composantes à un modèle d'autorisation. De nouveau la bonne chose à propos de Base ici est que votre serveur se termine avec une copie en clair du mot de passe du client que vous pouvez tout simplement passer à un autre composant au sein de votre infrastructure en tant que de besoin.
"sending plaintext passwords over the net is almost universally a bad thing"
- Pouvez-vous élaborer sur le "presque"? Quand est-il pas une mauvaise idée?Il n'existe pas de normes pour le REPOS autres que HTTP. Il y a établi des services RESTE là-bas. Je vous suggère de prendre un coup d'oeil à eux et avoir une idée de comment ils fonctionnent.
Par exemple, nous avons emprunté beaucoup d'idées, d'Amazon S3 RESTE de service lors de l'élaboration de notre propre. Mais nous avons choisi de ne pas utiliser le plus avancé modèle de sécurité basé sur la demande de signatures. L'approche la plus simple est HTTP Basic auth sur SSL. Vous devez décider ce qui fonctionne le mieux dans votre situation.
Aussi, je recommande fortement le livre Les Services Web RESTful de O'reilly. Il explique les concepts de base et de ne fournir certaines des meilleures pratiques. Vous pouvez généralement prendre le modèle qu'ils fournissent et de l'associer à votre propre application.
Vous pouvez également prendre un coup d'oeil à OAuth, un nouveau protocole d'ouverture de la base de jeton d'autorisation ciblant spécifiquement l'api http.
Il est très similaire à l'approche adoptée par flickr et ne pas oublier le lait "reste" api (pas nécessairement de bons exemples de restful api, mais de bons exemples de la base de jeton d'approche).
Il y a une grande liste de vérification trouvé sur Github:
Authentification
Ne pas réinventer la roue pour l'Authentification, la génération du jeton, stockage de mot de passe. L'utilisation des normes.
Utilisation
Max Retry
et de la prison fonctionnalités de Connexion.Utiliser le chiffrement sur toutes les données sensibles.
JWT (JSON Web Jeton)
Utilisation aléatoire de touches complexes (JWT Secret) pour faire de la force brute le jeton très dur.
De ne pas extraire l'algorithme à partir de la charge utile. La Force de l'algorithme dans le backend (HS256 ou RS256).
Faire jeton d'expiration (
TTL
,RTTL
) aussi court que possible.Ne pas stocker de données sensibles dans le
JWT
la charge utile, il peut être décodé facilement.OAuth
Toujours valider
redirect_uri
côté serveur pour autoriser uniquement dans la liste blanche des URLs.Toujours essayer d'échange de code et pas de jetons (ne pas permettre
response_type=token
).Utilisation paramètre d'état avec un nombre aléatoire de hachage pour éviter
CSRF
sur leOAuth
processus d'authentification.Définir l'étendue par défaut et valider les paramètres de portée pour chaque application.
Accès
Limiter les demandes (Throttling) pour éviter /DDoS les attaques en force.
Utilisation de HTTPS sur le serveur, afin d'éviter MITM (Man In The Middle Attack)
Utilisation
HSTS
- tête avec le protocole SSL pour éviter SSL Bande attaque.Entrée
D'utiliser la bonne méthode HTTP en fonction de l'opération:
GET
(lire),POST
(créer),PUT/PATCH
(remplacer/mettre à jour), etDELETE
(pour supprimer un enregistrement), et de répondre avec405 Method Not Allowed
si la méthode n'est pas appropriée pour la ressource demandée.De valider le contenu-type sur demande
Accept
en-tête (Négociation de Contenu) pour permettre votre seul format pris en charge (par exemple,application/xml
,application/json
, etc) et de répondre avec406 Not Acceptable
de réponse si pas de correspondance.Valider
content-type
de données publiées comme vous l'accepter (par exempleapplication/x-www-form-urlencoded
,multipart/form-data
,application/json
, etc).Valider la saisie de l'Utilisateur pour éviter les vulnérabilités (par exemple, XSS, SQL Injection, Exécution de Code à Distance, etc).
N'utilisez pas de données sensibles (informations d'identification, mots de passe, des jetons de sécurité, ou des clés API) dans l'URL, mais l'utilisation de la norme
Authorization
en-tête.Utiliser une API de la Passerelle de service pour activer la mise en cache,
Rate Limit
politiques (par exemple, des Quotas, Spike Arrestation Simultanée de Limite de fréquence) et de déployer des Api ressources de façon dynamique.Traitement
Vérifier si tous les points d'accès sont protégés derrière l'authentification pour éviter de rompre le processus d'authentification.
Utilisateur propre ID de ressource doit être évitée. Utilisation /me/commandes au lieu de /utilisateur/654321/commandes.
Ne pas l'auto-incrémentation de l'IDs. Utiliser l'UUID de la place.
Si vous êtes d'analyser des fichiers XML, assurez-vous que l'entité analyse n'est pas permis d'éviter le XXE (XML entité externe attaque).
Si vous êtes d'analyser des fichiers XML, assurez-vous d'extension d'entité n'est pas permis d'éviter Milliards de Rire/XML bombe par exponentielle entité expansion de l'attaque.
L'utilisation d'un CDN pour les uploads de fichier.
Si vous traitez avec l'énorme quantité de données, le recours à des Travailleurs et des Files d'attente de processus autant que possible en arrière-plan et le retour de la réponse rapide pour éviter de HTTP Blocage.
Ne pas oublier de désactiver le DEBUG mode OFF.
Sortie
Envoyer
X-Content-Type-Options: nosniff
en-tête.Envoyer
X-Frame-Options: deny
en-tête.Envoyer
Content-Security-Policy: default-src 'none'
en-tête.Supprimer les empreintes des en-têtes -
X-Powered-By
,Server
,X-AspNet-Version
etc.Force
content-type
pour votre réponse, si vous retournezapplication/json
alors votre réponse content-type estapplication/json
.Ne renvoie pas les données sensibles comme les informations d'identification, mots de passe, des jetons de sécurité.
Retourner le bon code d'état en fonction de l'opération réalisée. (par exemple,
200 OK
,400 Bad Request
,401 Unauthorized
,405 Method Not Allowed
, etc).Je suis un peu surpris de SSL avec des certificats client n'a pas encore été mentionnés. Accordé, cette approche n'est vraiment utile que si vous pouvez compter sur la communauté des utilisateurs sont identifiés par des certificats. Mais un certain nombre de gouvernements ou de sociétés de faire question à leurs utilisateurs. L'utilisateur n'a pas à se préoccuper de la création pourtant, un autre nom d'utilisateur/mot de passe, et l'identité est établie sur chaque connexion afin que la communication avec le serveur peut être entièrement apatrides, pas de sessions d'utilisateur requis. (Ne signifie pas que l'une ou l'autre des solutions mentionnés ont besoin de séances)
Tout le monde dans ces réponses a négligé vrai contrôle de l'accès ou de l'autorisation.
Si par exemple votre Api REST /services web sont sur l'Affichage /GETing des dossiers médicaux, vous pouvez définir le contrôle d'accès policie sur qui peut accéder aux données et dans quelles circonstances. Par exemple:
Afin de définir et de mettre en œuvre ces fine des autorisations, vous aurez besoin d'utiliser un attribut de contrôle d'accès basé langue appelée XACML, eXtensible Access Control Markup Language.
Les autres normes sont ici pour la suite de:
XACML est la technologie de l'agnostique. Il peut être appliqué à des applications java, .NET, Python, Ruby... services web, Api REST, et plus encore.
Les éléments suivants sont des ressources intéressantes:
J'ai utilisé OAuth à quelques reprises, et a également utilisé d'autres méthodes (de BASE/DIGEST). De tout cœur je vous suggère d'authentification OAuth. Le lien suivant est le meilleur tutoriel que j'ai vu sur l'utilisation de l'authentification OAuth:
http://hueniverse.com/oauth/guide/
L'un des meilleurs postes que j'ai jamais rencontré en matière de Sécurité, en tant qu'elle concerne le REPOS est plus à 1 Goutte de pluie. Le MySpace de l'API utiliser OAuth aussi pour la sécurité et la vous avez un accès complet à leurs chaînes sur mesure dans le RestChess code, j'ai fait beaucoup d'exploration. C'était la démo serais au Mélange et vous pouvez trouver l'affichage ici.
Merci pour les excellents conseils. Nous nous sommes retrouvés à l'aide d'un en-tête HTTP personnalisé pour passer un jeton d'identité du client pour le service, en préparation pour l'intégration de notre API RESTful avec la la prochaine Zermatt Identité framework de Microsoft. J'ai décrit le problème ici et notre solution ici. J'ai également pris tweakt's conseils et acheté Les Services Web RESTful - un très bon livre si vous êtes la construction d'une API RESTful d'aucune sorte.
OWASP(Open Web Application Security Project) a quelques feuilles de triche couvrant tous les aspects du développement de l'Application Web. Ce Projet est très précieuse et fiable source d'information.
En matière de REPOS des services vous pouvez le vérifier: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet
Je recommanderais OAuth 2/3. Vous pouvez trouver plus d'informations à http://oauth.net/2/
J'ai beaucoup cherché sur reposante ws sécurité et nous avons également terminé avec l'aide jeton par l'intermédiaire de cookies du client vers le serveur pour authentifier les demandes . J'ai utilisé le printemps de sécurité pour l'autorisation des demandes de service parce que j'ai eu pour authentifier et autorisé chaque demande basée sur les politiques de sécurité qui a déjà été en DB.
Le fait que le SAVON monde est assez bien couvert avec les normes de sécurité ne signifie pas qu'il est sécurisé par défaut. En premier lieu, les normes sont très complexe. La complexité n'est pas une très bonne amie de la sécurité et de la mise en œuvre des vulnérabilités telles que XML signature d'emballage attaques sont endémiques ici.
Comme pour l' .NET de l'environnement, je n'aidera pas beaucoup, mais “La création de services web avec Java” (une brique avec ~10 auteurs) m'a aidé à beaucoup dans la compréhension de la WS-* architecture de sécurité et, en particulier, ses bizarreries.
RESTE même n'offre pas de normes de sécurité, mais des choses comme OAuth et SAML sont rapidement en train de devenir les normes dans cet espace. Cependant, l'authentification et l'autorisation sont seulement une petite partie de ce que vous devez considérer. De nombreuses vulnérabilités connues concernant les applications web s'appliquent très bien à l'api REST. Vous devez tenir compte de validation de la saisie, de la session de fissuration, inapproprié des messages d'erreur, des employés internes des vulnérabilités et ainsi de suite. C'est un grand sujet.
Je veux ajouter(en ligne avec stinkeymatt), solution la plus simple serait d'ajouter des certificats SSL pour votre site. En d'autres termes, assurez-vous que votre url est: https://. Qui couvrira la sécurité des transports (bang for the buck). RESTful url, l'idée est de rester simple (contrairement à WS* sécurité/SAML), vous pouvez utiliser oAuth2/openID connect ou même l'Authentification Basique (dans les cas simples). Mais vous aurez toujours besoin de SSL/HTTPS. Veuillez vérifier ASP.NET Web API 2 sécurité ici: http://www.asp.net/web-api/overview/security (Articles et Vidéos)
Comme @Nathan fini avec, qui est un simple en-Tête HTTP, et certains ont dit OAuth2 côté client et des certificats SSL. L'essentiel, c'est ce... votre API REST ne devriez pas avoir à gérer la sécurité que devrait vraiment être à l'extérieur de la portée de l'API.
Au lieu d'une couche de sécurité doit être mis sur le dessus de celui-ci, c'est un en-Tête HTTP derrière un proxy web (une approche commune comme SiteMinder, Zermatt ou même d'Apache HTTPd), ou aussi compliqué que OAuth 2.
La clé, c'est la demande devrait fonctionner sans fin-l'interaction de l'utilisateur. Tout ce qui est nécessaire est de s'assurer que la connexion à l'API REST est authentifié. Dans Java EE, nous avons la notion de
userPrincipal
qui peut être obtenu sur unHttpServletRequest
. Il est également géré dans le descripteur de déploiement d'un modèle d'URL peut être sécurisé pour le RESTE code de l'API n'a pas besoin de contrôle plus.Dans la WCF monde, je voudrais utiliser
ServiceSecurityContext.Current
pour obtenir le contexte de sécurité actuel. Vous avez besoin de configurer votre application pour exiger l'authentification.Il existe une exception à la déclaration que j'avais au-dessus et c'est l'utilisation d'un nonce pour prévenir les replays (qui peuvent être des attaques ou quelqu'un vient de soumettre deux fois les mêmes données). Cette partie ne peuvent être traitées que dans la couche application.
Pour la Sécurité des Applications Web, vous devriez jeter un oeil à OWASP (https://www.owasp.org/index.php/Main_Page) qui fournit cheatsheets pour diverses attaques de sécurité. Vous pouvez incorporer de nombreuses mesures possibles pour la sécurité de votre Application.
À l'égard de l'API de sécurité (autorisation, d'authentification, de gestion de l'identité), il existe de multiples façons comme déjà mentionné (Basic,Digest et OAuth). Il y a des trous de boucle dans OAuth1.0, de sorte que vous pouvez utiliser OAuth1.0a (OAuth2.0 n'est pas largement adopté en raison de préoccupations avec la spécification)
Il a été un moment mais la question est toujours d'actualité, même si la réponse peut-être un peu changé.
Une Passerelle API serait un flexible et hautement configurable solution.
J'ai testé et utilisé KONG un peu et vraiment aimé ce que j'ai vu. KONG fournit un admin API REST de son propre que vous pouvez utiliser pour gérer les utilisateurs.
Express-passerelle.io est plus récente et est également une Passerelle API.