Webservicebeveiliging (WS) met SOAP-voorbeeld
⚡ Slimme samenvatting
Webservicebeveiliging (WS-Security) is een standaard die de gegevens beschermt die worden uitgewisseld tijdens een SOAP-webserviceaanroep. Deze bron beschrijft beveiligingsrisico's en tegenmaatregelen, WS-Security-standaarden, het bouwen van een veilige webservice met referenties en best practices voor webservicebeveiliging.
Wat is WS-beveiliging?
WS Security is een standaard die de beveiliging regelt bij de uitwisseling van gegevens als onderdeel van een webservice. Dit is een belangrijke eigenschap van SOAP die het zo populair maakt voor het ontwikkelen van webservices.
Beveiliging is een belangrijk aspect van elke webapplicatie. Omdat vrijwel alle webapplicaties toegankelijk zijn via internet, bestaat er altijd een risico op een beveiligingsdreiging. Daarom is het belangrijk om bij de ontwikkeling van webapplicaties rekening te houden met de beveiliging.ping Bij webapplicaties is het altijd aan te raden ervoor te zorgen dat de applicatie bij het ontwerp en de ontwikkeling rekening houdt met de beveiliging.
Beveiligingsbedreigingen en tegenmaatregelen
Om inzicht te krijgen in de beveiligingsrisico's die een webapplicatie kunnen bedreigen, bekijken we een eenvoudig scenario van een webapplicatie en hoe deze qua beveiliging functioneert.
Een van de beschikbare beveiligingsmaatregelen voor HTTP is het HTTPS-protocol. HTTPS is een veilige manier van communicatie tussen de client en de server via het internet. HTTPS maakt gebruik van Secure Sockets Layer, ofwel SSL, voor beveiligde communicatie. Zowel de client als de server beschikken over een digitaal certificaat dat hun authenticiteit bevestigt bij elke communicatie tussen de client en de server.
Bij een standaard HTTPS-communicatie tussen de client en de server vinden de volgende stappen plaats:
- De client stuurt via het clientcertificaat een verzoek naar de server. Wanneer de server het clientcertificaat ziet, maakt hij een notitie in zijn cachesysteem, zodat hij weet dat het antwoord alleen naar deze client terug mag gaan.
- De server authenticeert zichzelf vervolgens bij de client door het certificaat te verzenden. Dit zorgt ervoor dat de client met de juiste server communiceert.
- Alle communicatie tussen de client en de server is daarna versleuteld. Dit zorgt ervoor dat als andere gebruikers proberen de beveiliging te omzeilen en de benodigde gegevens te bemachtigen, ze deze niet kunnen lezen omdat ze versleuteld zijn.
Maar bovenstaande beveiliging werkt niet in alle situaties. Er kan een moment komen waarop een client met meerdere servers communiceert. Een voorbeeld hiervan is een client die tegelijkertijd met een database en een webserver communiceert. In dergelijke gevallen kan niet alle informatie via het HTTPS-protocol worden verzonden.
Hier komt SOAP in beeld om dergelijke obstakels te overwinnen door middel van de WS Security-specificatie. Met deze specificatie worden alle beveiligingsgerelateerde gegevens gedefinieerd in het SOAP-headerelement. Het headerelement kan de volgende informatie bevatten:
- Als het bericht binnen de SOAP-tekst is ondertekend met een beveiligingssleutel, kan die sleutel worden gedefinieerd in het header-element.
- Als een element in de SOAP-body versleuteld is, bevat de header de benodigde versleutelingssleutels zodat het bericht bij aankomst op de bestemming kan worden ontsleuteld.
In een omgeving met meerdere servers biedt de bovenstaande SOAP-authenticatietechniek de volgende voordelen:
- Omdat de SOAP-body gecodeerd is, kan deze alleen worden gedecodeerd door de webserver die de webservice host. Dit komt door de manier waarop het SOAP-protocol is ontworpen.
- Stel dat het bericht via een HTTP-verzoek naar de databaseserver wordt verzonden; het kan niet worden gedecodeerd omdat de database niet over de juiste mechanismen beschikt om dit te doen.
- Pas wanneer het verzoek daadwerkelijk als SOAP-protocol de webserver bereikt, kan deze het bericht ontcijferen en het juiste antwoord terugsturen naar de client.
In de volgende onderwerpen zullen we zien hoe de WS Security-standaard kan worden gebruikt voor SOAP.
Beveiligingsnormen voor webservices
Zoals in het vorige gedeelte is besproken, draait de WS-Security-standaard om het opnemen van de beveiligingsdefinitie in de SOAP-header. De inloggegevens in de SOAP-header worden op twee manieren beheerd.
Ten eerste definieert het een speciaal element genaamd UsernameToken. Dit wordt gebruikt om de gebruikersnaam en het wachtwoord door te geven aan de webservice. De andere manier is om een binair token te gebruiken via de BinarySecurityToken. Dit wordt gebruikt in situaties waarin versleutelingstechnieken zoals Kerberos of X.509 worden toegepast.
Onderstaand diagram laat zien hoe het beveiligingsmodel in WS Security werkt.
Hieronder volgen de stappen die in de bovenstaande workflow plaatsvinden:
- Een verzoek kan vanuit de webserviceclient naar de beveiligingstokenservice worden verzonden. Deze service kan een tussenliggende webservice zijn die specifiek is ontworpen om gebruikersnamen/wachtwoorden of certificaten aan de eigenlijke SOAP-webservice te leveren.
- Het beveiligingstoken wordt vervolgens doorgegeven aan de webserviceclient.
- De webserviceclient roept vervolgens de webservice aan, maar zorgt er ditmaal voor dat het beveiligingstoken in het SOAP-bericht is ingebed.
- De webservice begrijpt vervolgens het SOAP-bericht met het authenticatietoken en kan vervolgens contact opnemen met de Security Token-service om te zien of het beveiligingstoken authentiek is of niet.
Het onderstaande fragment toont de structuur van het authenticatiegedeelte, dat onderdeel uitmaakt van het WSDL-document. Op basis van dit fragment zal het SOAP-bericht twee extra elementen bevatten: de gebruikersnaam en het wachtwoord.
<xs:element name="UsernameToken"> <xs:complexType> <xs:sequence> <xs:element ref="Username"/> <xs:element ref="Password" minOccurs="0"/> </xs:sequence> <xs:attribute name="Id" type="xs:ID"/> </xs:complexType> </xs:element>
Wanneer het SOAP-bericht daadwerkelijk tussen de clients en de server wordt uitgewisseld, kan het gedeelte van het bericht dat de gebruikersgegevens bevat eruitzien zoals hierboven weergegeven. De elementnaam wsse is een speciale elementnaam die is gedefinieerd voor SOAP en betekent dat het beveiligingsgerelateerde informatie bevat.
Hoe veilige webservices te bouwen
Laten we nu een voorbeeld bekijken van de beveiliging van een SOAP-webservice. We bouwen de beveiliging van een webservice verder uit op basis van het voorbeeld dat eerder in het SOAP-hoofdstuk is getoond en voegen er een beveiligingslaag aan toe.
In ons voorbeeld gaan we een eenvoudige webservice maken die een tekenreeks terugstuurt naar de applicatie die de webservice aanroept. Maar deze keer moeten de inloggegevens worden doorgegeven aan de aanroepende service wanneer de webservice wordt aangeroepen. Laten we de onderstaande stappen volgen om onze SOAP-webservice te maken en de beveiligingsdefinitie eraan toe te voegen.
Stap 1) De eerste stap is het maken van een leeg bestand Asp.Net Webapplicatie. Klik in Visual Studio 2013 op de menuoptie Bestand->Nieuw project.
Zodra u op de optie Nieuw project klikt, geeft Visual Studio u een ander dialoogvenster om het type project te kiezen en de benodigde details van het project te geven. Dit wordt in de volgende stap uitgelegd.
Stap 2) In deze stap,
- Zorg ervoor dat u eerst de C# Websjabloon voor ASP.NET-webtoepassingen. Het project moet van dit type zijn om een webserviceproject te kunnen maken. Door deze optie te kiezen, voert Visual Studio de nodige stappen uit om de vereiste bestanden toe te voegen die nodig zijn voor elke webtoepassing.
- Geef een naam voor uw project, die in ons geval is gegeven als “webservice.asmxGeef vervolgens een locatie op waar de projectbestanden worden opgeslagen.
Zodra dit is voltooid, ziet u het aangemaakte projectbestand in de Solution Explorer van Visual Studio 2013.
Stap 3) In deze stap gaan we een webservicebestand aan ons project toevoegen.
- Klik eerst met de rechtermuisknop op het projectbestand, zoals hieronder weergegeven.
- Als je met de rechtermuisknop op het projectbestand klikt, kun je de optie 'Toevoegen -> Webservice (ASMX)' kiezen om een webservicebestand toe te voegen. Geef het webservicebestand de naam 'Tutorial Service'.
De bovenstaande stap zal een dialoogvenster openen waarin u de naam van het webservicebestand kunt invoeren. Voer in het onderstaande dialoogvenster de naam TutorialService in als bestandsnaam.
Stap 4) Voeg de volgende code toe aan uw Tutorial Service asmx-bestand. Het onderstaande codefragment wordt gebruikt om een aangepaste klasse toe te voegen die wordt gebruikt om de SOAP-header te wijzigen wanneer het SOAP-bericht wordt gegenereerd. Omdat we nu beveiligingsreferenties aan de SOAP-header willen toevoegen, is deze stap vereist.
return "This is a Guru99 Web Service"; } public class AuthHeader : SoapHeader { public string UserName; public string Password; } }
Code Uitleg:
- We maken nu een aparte klasse genaamd AuthHeader die van type is SoapHeader-klasseWanneer je wilt wijzigen wat er in de SOAP-header wordt meegegeven, moet je een klasse maken die gebruikmaakt van de ingebouwde SoapHeader-klasse van .NET. Door de SOAP-header aan te passen, kunnen we nu een 'Gebruikersnaam' en een 'Wachtwoord' meesturen wanneer de webservice wordt aangeroepen.
- Vervolgens definiëren we variabelen van 'Gebruikersnaam' en 'Wachtwoord' die van het type string zijn. Ze worden gebruikt om de waarden van de gebruikersnaam en het wachtwoord op te slaan die aan de webservice worden doorgegeven.
Stap 5) Als volgende stap moet de volgende code aan hetzelfde worden toegevoegd TutorialService.asmx-bestandDeze code definieert de functie van onze webservice. Deze functie retourneert de tekenreeks "Dit is een Guru99 Webservice” naar de client. Maar deze keer wordt de tekenreeks alleen teruggestuurd als de clienttoepassing de inloggegevens aan de webservice doorgeeft.
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); } else return "This is a Guru99 Web service"; }
Code Uitleg:
- Hier maken we een object van de klasse AuthHeader dat in de eerdere stap is gemaakt. Dit object wordt doorgegeven aan onze Guru99Webservice waarin de gebruikersnaam en het wachtwoord nauwkeurig kunnen worden onderzocht.
- Het [SoapHeader]-attribuut wordt nu gebruikt om aan te geven dat wanneer de webservice wordt aangeroepen, de gebruikersnaam en het wachtwoord moeten worden doorgegeven.
- In dit codeblok onderzoeken we de gebruikersnaam en het wachtwoord die worden doorgegeven bij het aanroepen van de webservice. Als de gebruikersnaam gelijk is aan "Guru99” en het wachtwoord is gelijk aan “Guru"99Password", waarna het bericht "Dit is een Guru"Webservice 99" wordt naar de client verzonden. Anders wordt er een foutmelding naar de client gestuurd als er een onjuiste gebruikersnaam en wachtwoord worden doorgegeven.
Als de code succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven wanneer u uw code in de browser uitvoert.
Output:
De bovenstaande uitvoer wordt weergegeven wanneer het programma wordt uitgevoerd, wat betekent dat de webservice nu beschikbaar is. Laten we op 'Service' klikken. Descriptionen koppeling.
Uit de servicebeschrijving kunt u nu zien dat de gebruikersnaam en het wachtwoord elementen zijn van de wsdl bestand. Deze parameters moeten worden verzonden wanneer de webservice wordt aangeroepen.
Best practices voor webservicebeveiliging
Hieronder volgen de beveiligingsaspecten waarmee rekening moet worden gehouden bij het werken met webdiensten:
- Audit- en logboekbeheer – Gebruik applicatielogging om alle verzoeken aan de webservices te registreren. Dit levert een gedetailleerd rapport op over wie de webservice heeft aangeroepen en kan helpen bij de impactanalyse in geval van een beveiligingslek.
- Stroom van aanroepen naar de webservice – Probeer de aanroepstroom in webservices te volgen. Standaard kan een applicatie meerdere webserviceverzoeken versturen, waarbij authenticatietokens tussen deze webservices worden uitgewisseld. Alle aanroepen tussen webservices moeten worden gemonitord en gelogd.
- Gevoelige informatie – Voeg geen gevoelige informatie zoals wachtwoorden, creditcardnummers of andere vertrouwelijke gegevens toe aan uw logboekvermeldingen. Als een gebeurtenis dergelijke informatie bevat, moet deze worden verwijderd voordat de gegevens worden vastgelegd.
- Track Business Operaties - Tracbelangrijke bedrijfsactiviteiten. Instrumenteer uw applicatie bijvoorbeeld om toegang tot bijzonder gevoelige methoden en bedrijfslogica vast te leggen. Neem als voorbeeld een webwinkel.ping applicatie. Een typische applicatie bestaat uit meerdere stappen, zoals het kiezen van de te kopen artikelen, het laden van de artikelen in de winkelwagen en vervolgens de uiteindelijke aankoop. Deze gehele bedrijfsworkflow moet worden gestroomlijnd. tracgeked door de webservice.
- Correcte authenticatie Authenticatie is het mechanisme waarmee clients hun identiteit bij de webservice kunnen vaststellen met behulp van een bepaalde set referenties die die identiteit bewijzen. Gebruikersreferenties mogen nooit worden opgeslagen. Daarom moet er, als WS Security wordt gebruikt om de webservice aan te roepen, rekening mee worden gehouden dat de webservice de referenties die in de SOAP-header worden verzonden niet mag opslaan. Deze moeten door de webservice worden verwijderd.














