Tutoriel sur la sécurité des services Web (WS) avec un exemple SOAP

Table des matières:

Anonim

Qu'est-ce que WS Security?

WS Security est une norme qui traite de la sécurité lorsque des données sont échangées dans le cadre d'un service Web. C'est une fonctionnalité clé de SOAP qui le rend très populaire pour la création de services Web.

La sécurité est une fonctionnalité importante dans toute application Web. Étant donné que presque toutes les applications Web sont exposées à Internet, il existe toujours un risque de menace de sécurité pour les applications Web. Par conséquent, lors du développement d'applications Web, il est toujours recommandé de s'assurer que l'application est conçue et développée avec la sécurité à l'esprit.

Dans ce didacticiel, vous apprendrez-

  • Menaces de sécurité et contre-mesures
  • Normes de sécurité des services Web
  • Comment créer des services Web sécurisés
  • Meilleures pratiques de sécurité des services Web

Menaces de sécurité et contre-mesures

Pour comprendre les menaces de sécurité qui peuvent être hostiles à une application Web, regardons un scénario simple d'une application Web et voyons comment cela fonctionne en termes de sécurité.

L'une des mesures de sécurité disponibles pour HTTP est le protocole HTTPS. HTTPS est le moyen sécurisé de communication entre le client et le serveur sur le Web. HTTPS utilise la couche Secure Sockets ou SSL pour une communication sécurisée. Le client et le serveur auront tous deux un certificat numérique pour s'identifier comme authentique lorsqu'une communication se produit entre le client et le serveur.

Dans une communication HTTPS standard entre le client et le serveur, les étapes suivantes ont lieu

  1. Le client envoie une requête au serveur via le certificat client. Lorsque le serveur voit le certificat client, il fait une note dans son système de cache afin qu'il sache que la réponse ne doit revenir qu'à ce client.
  2. Le serveur s'authentifie ensuite auprès du client en envoyant son certificat. Cela garantit que le client communique avec le bon serveur.
  3. Toutes les communications par la suite entre le client et le serveur sont cryptées. Cela garantit que si d'autres utilisateurs tentent de briser la sécurité et d'obtenir les données requises, ils ne pourront pas les lire car elles seraient cryptées.

Mais le type de sécurité ci-dessus ne fonctionnera pas dans toutes les situations. Il peut arriver un moment où le client peut parler à plusieurs serveurs. Un exemple donné ci-dessous montre un client qui parle à la fois à une base de données et à un serveur Web. Dans de tels cas, toutes les informations ne peuvent pas passer par le protocole https.

C'est là que SOAP entre en action pour surmonter ces obstacles en mettant en place la spécification WS Security. Avec cette spécification, toutes les données liées à la sécurité sont définies dans l'élément d'en-tête SOAP.

L'élément d'en-tête peut contenir les informations mentionnées ci-dessous

  1. Si le message dans le corps SOAP a été signé avec une clé de sécurité, cette clé peut être définie dans l'élément d'en-tête.
  2. Si un élément du corps SOAP est chiffré, l'en-tête contiendra les clés de chiffrement nécessaires pour que le message puisse être déchiffré lorsqu'il atteint la destination.

Dans un environnement à serveurs multiples, la technique d'authentification SOAP ci-dessus est utile de la manière suivante.

  • Le corps SOAP étant chiffré, il ne pourra être déchiffré que par le serveur Web qui héberge le service Web. Cela est dû à la façon dont le protocole SOAP est conçu.
  • Supposons que si le message est passé au serveur de base de données dans une requête HTTP, il ne peut pas être déchiffré car la base de données ne dispose pas des mécanismes appropriés pour le faire.
  • Ce n'est que lorsque la demande atteint réellement le serveur Web en tant que protocole SOAP qu'elle pourra déchiffrer le message et renvoyer la réponse appropriée au client.

Nous verrons dans les rubriques suivantes comment la norme de sécurité WS peut être utilisée pour SOAP.

Normes de sécurité des services Web

Comme indiqué dans la section précédente, la norme WS-Security tourne autour de l'inclusion de la définition de sécurité dans l'en-tête SOAP.

Les informations d'identification dans l'en-tête SOAP sont gérées de 2 manières.

Tout d'abord, il définit un élément spécial appelé UsernameToken. Ceci est utilisé pour transmettre le nom d'utilisateur et le mot de passe au service Web.

L'autre façon consiste à utiliser un jeton binaire via le BinarySecurityToken. Ceci est utilisé dans les situations dans lesquelles des techniques de chiffrement telles que Kerberos ou X.509 sont utilisées.

Le diagramme ci-dessous montre le déroulement du fonctionnement du modèle de sécurité dans WS Security

Vous trouverez ci-dessous les étapes qui ont lieu dans le flux de travail ci-dessus

  1. Une demande peut être envoyée du client de service Web au service de jeton de sécurité. Ce service peut être un service Web intermédiaire spécialement conçu pour fournir des noms d'utilisateur / mots de passe ou des certificats au service Web SOAP réel.
  2. Le jeton de sécurité est ensuite transmis au client du service Web.
  3. Le client de service Web a ensuite appelé le service Web, mais, cette fois, en s'assurant que le jeton de sécurité est incorporé dans le message SOAP.
  4. Le service Web comprend alors le message SOAP avec le jeton d'authentification et peut ensuite contacter le service de jeton de sécurité pour voir si le jeton de sécurité est authentique ou non.

L'extrait de code ci-dessous montre le format de la partie d'authentification qui fait partie du document WSDL. Maintenant basé sur l'extrait ci-dessous, le message SOAP contiendra 2 éléments supplémentaires, l'un étant le nom d'utilisateur et l'autre le mot de passe.

Lorsque le message SOAP est effectivement passé entre les clients et le serveur, la partie du message qui contient les informations d'identification de l'utilisateur peut ressembler à celle illustrée ci-dessus. Le nom de l'élément wsse est un élément spécial nommé défini pour SOAP et signifie qu'il contient des informations basées sur la sécurité.

Comment créer des services Web sécurisés

Examinons maintenant l'exemple de sécurité du service Web SOAP. Nous allons construire une sécurité de service Web sur l'exemple démontré plus tôt dans le chapitre SOAP et y ajouterons une couche de sécurité.

Dans notre exemple, nous allons créer un service web simple, qui sera utilisé pour renvoyer une chaîne à l'application qui appelle le service web. Mais cette fois, environ, lorsque le service Web est appelé, les informations d'identification doivent être fournies au service appelant. Suivons les étapes ci-dessous pour créer notre service Web SOAP et y ajouter la définition de sécurité.

Étape 1) La première étape consiste à créer une application Web Asp.Net vide. À partir de Visual Studio 2013, cliquez sur l'option de menu Fichier-> Nouveau projet.

Une fois que vous avez cliqué sur l'option Nouveau projet, Visual Studio vous donnera alors une autre boîte de dialogue pour choisir le type de projet et pour donner les détails nécessaires du projet. Ceci est expliqué à l'étape suivante

Étape 2) Dans cette étape,

  1. Assurez-vous de choisir d'abord le modèle Web C # pour l'application Web ASP.NET. Le projet doit être de ce type pour créer un projet de services Web. En choisissant cette option, Visual Studio effectuera ensuite les étapes nécessaires pour ajouter les fichiers requis requis par toute application Web.
  2. Donnez un nom à votre projet qui, dans notre cas, a été donné comme " webservice.asmx " . Ensuite, assurez-vous de donner un emplacement, où les fichiers du projet seront stockés.

Une fois terminé, vous verrez le fichier de projet créé dans votre explorateur de solutions dans Visual Studio 2013.

Étape 3) Dans cette étape,

Nous allons ajouter un fichier de service Web à notre projet

  1. Cliquez d'abord avec le bouton droit sur le fichier de projet comme indiqué ci-dessous
  1. Une fois que vous faites un clic droit sur le fichier de projet, vous avez la possibilité de choisir l'option "Ajouter-> Service Web (ASMX) pour ajouter un fichier de service Web. Il vous suffit de fournir un nom de service de didacticiel pour le fichier de nom de service Web.

L'étape ci-dessus affichera une boîte de dialogue, dans laquelle on peut entrer le nom du fichier de service Web. Donc, dans la boîte de dialogue ci-dessous, entrez le nom de TutorialService comme nom de fichier.

Étape 4) Ajoutez le code suivant à votre fichier asmx Tutorial Service. L'extrait de code ci-dessous est utilisé pour ajouter une classe personnalisée qui sera utilisée pour modifier l'en-tête SOAP lorsque le message SOAP est généré. Puisque nous voulons maintenant ajouter des informations d'identification de sécurité à l'en-tête SOAP, cette étape est requise.

return "This is a Guru99 Web Service";}public class AuthHeader : SoapHeader{public string UserName;public string Password;}}

Explication du code: -

  1. Nous créons maintenant une classe distincte appelée AuthHeader qui est de type classe SoapHeader . Chaque fois que vous voulez changer ce qui est passé dans l'en-tête SOAP, il faut créer une classe qui utilise la classe SoapHeader intégrée de .Net. En personnalisant l'en-tête SOAP, nous avons désormais la possibilité de transmettre un «Nom d'utilisateur» et un «Mot de passe» lorsque le service Web est appelé.
  2. Nous définissons ensuite des variables de 'UserName' et 'Password' qui sont de type string. Ils seront utilisés pour contenir les valeurs du nom d'utilisateur et du mot de passe qui sont transmises au service Web.

Étape 5) À l'étape suivante, le code suivant doit être ajouté au même fichier TutorialService.asmx . Ce code définit en fait la fonction de notre service Web. Cette fonction renvoie une chaîne "Ceci est un service Web Guru99" au client. Mais cette fois, la chaîne ne sera renvoyée que si l'application cliente transmet les informations d'identification au service Web.

public class TutorialService : System.Web.Services.WebService{public AuthHeader Credentials;[SoapHeader("Credentials")][WebMethod]public string Guru99WebService(){if (Credentials.UserName.ToLower() != "Guru99" ||Credentials.Password.ToLower() != "Guru99Password"){throw new SoapException("Unauthorized",SoapException.ClientFaultCode);}eisereturn "This is a Guru99 Web service";}

Explication du code: -

  1. Ici, nous créons un objet de la classe AuthHeader qui a été créée à l'étape précédente. Cet objet sera transmis à notre Guru99Webservice dans lequel le nom d'utilisateur et le mot de passe peuvent être examinés de près.
  2. L'attribut [SoapHeader] est maintenant utilisé pour spécifier que lorsque le service Web est appelé, il doit avoir le nom d'utilisateur et le mot de passe transmis.
  3. Dans ce bloc de code, nous examinons en fait le nom d'utilisateur et le mot de passe transmis lors de l'appel du service Web. Si le nom d'utilisateur est égal à "Guru99" et le mot de passe est égal à "Guru99Password", le message "Ceci est un service Web Guru99" est transmis au client. Sinon, une erreur sera envoyée au client si l'ID utilisateur et le mot de passe incorrects sont passés.

Si le code est exécuté avec succès, la sortie suivante s'affiche lorsque vous exécutez votre code dans le navigateur.

Production:

La sortie ci-dessus s'affiche lorsque le programme est exécuté, ce qui signifie que le service Web est désormais disponible. Cliquons sur le lien Description du service.

À partir de la description du service, vous pourrez maintenant voir que le nom d'utilisateur et le mot de passe sont des éléments du fichier WSDL. Ces paramètres doivent être envoyés lorsque le service Web est appelé.

Meilleures pratiques de sécurité des services Web

Voici les considérations de sécurité à prendre en compte lors de l'utilisation des services Web

  1. Audit et gestion des journaux - Utilisez la journalisation des applications pour consigner toutes les demandes envoyées aux services Web. Cela donne un rapport détaillé sur qui a appelé le service Web et peut aider dans l'analyse d'impact en cas de faille de sécurité.

  2. Flux d'appels vers le service Web - Essayez de noter le flux des appels dans les services Web. Par défaut, une application peut appeler plusieurs demandes de services Web avec des jetons d'authentification transmis entre ces services Web. Tous les appels entre les services Web doivent être surveillés et enregistrés.

  3. Informations sensibles - N'incluez pas d'informations sensibles dans vos entrées de journal telles que les mots de passe ou les numéros de carte de crédit ou toute autre information confidentielle. Si un événement contient l'une de ces informations, il doit être ignoré avant la journalisation.

  4. Suivi des opérations commerciales - Suivez les opérations commerciales importantes. Par exemple, instrumentez votre application pour enregistrer l'accès aux méthodes et à la logique métier particulièrement sensibles. Prenons un exemple d'application d'achat en ligne. Une application typique comporte plusieurs étapes telles que le choix des articles à acheter, les articles chargés dans le panier, puis l'achat final. L'ensemble de ce flux de travail doit être suivi par le service Web.

  5. Authentification appropriée - L'authentification est le mécanisme par lequel les clients peuvent établir leur identité avec le service Web à l'aide d'un certain ensemble d'informations d'identification qui peuvent prouver cette identité. Il ne faut jamais stocker les informations d'identification de l'utilisateur, et par conséquent, si WS Security est utilisé pour appeler le service Web, il faut noter que le service Web ne doit pas stocker les informations d'identification qui sont envoyées dans l'en-tête SOAP. Ceux-ci doivent être supprimés par le service Web.

Résumé

  • SOAP fournit une couche supplémentaire appelée WS Security pour fournir une sécurité supplémentaire lorsque des appels sont effectués vers des services Web.
  • Le WS Security peut être appelé avec un simple nom d'utilisateur ou mot de passe ou peut être utilisé avec des certificats binaires pour l'authentification
  • Nous avons vu que dans .Net, nous pouvons personnaliser le service Web pour faire passer un nom d'utilisateur et un mot de passe dans le cadre de l'élément d'en-tête SOAP.