Säkerhetsöversikt
Säkerhetsramverket i Windows Web Services API (WWSAPI) tillhandahåller:
- Meddelandeintegritet, konfidentialitet, upprepningsidentifiering och serverautentisering med transportsäkerhet.
- Klientautentisering, till exempel verifiering av säkerhetstoken, certifikatförtroende och återkallningskontroller osv. med hjälp av SOAP-meddelandesäkerhet eller transportsäkerhet.
Säkerhetsprogrammeringsmodellen
Säkerhet är associerad med kommunikationskanaler. Att skydda en kanal består av följande steg.
- Skapa och initiera en eller flera säkerhetsbindningar lämpliga för programmets säkerhetskrav.
- Skapa en säkerhetsbeskrivning som innehåller dessa säkerhetsbindningar.
- Skapa en kanal eller tjänstproxy (på klientsidan) eller skapa en lyssnare eller tjänstvärd (på serversidan) som skickar den säkerhetsbeskrivningen.
- Utför de normala kanalprogrammeringsstegen i Öppna, Acceptera, Skicka, Ta emot, Stäng osv.
Meddelanden som skickas och tas emot på kanalen skyddas av systemet automatiskt enligt den angivna säkerhetsbeskrivningen. Du kan också finjustera de här stegen genom att ange en eller flera kanalomfattande säkerhetsinställningar i säkerhetsbeskrivningen eller bindningsomfattande säkerhetsinställningar i en säkerhetsbindning.
All nödvändig auktorisering av avsändaridentiteter måste utföras av programmet med hjälp av säkerhetsbearbetningsresultat kopplade till varje mottaget meddelande. Auktoriseringssteg anges inte i säkerhetsbeskrivningen och utförs inte heller automatiskt av körmiljön.
Fel i säkerhetsbeskrivningen, såsom bindningar som inte stöds, ej tillämpliga egenskaper/fält, brist på obligatoriska egenskaper/fält eller ogiltiga egenskaps-/fältvärden, kommer att orsaka att kanal- eller lyssnarskapande misslyckas.
Välja säkerhetsbindningar
När du utformar säkerhet för ett program är det primära beslutet valet av de säkerhetsbindningar som ska ingå i säkerhetsbeskrivningen. Följande är några riktlinjer för att välja säkerhetsbindningar som är lämpliga för ett programs säkerhetsscenario. En användbar heuristik är att först förstå vilka typer av säkerhetsautentiseringsuppgifter (till exempel X.509-certifikat, användarnamn/lösenord för Windows-domänen, programdefinierade användarnamn/lösenord) kommer att vara tillgängliga för programmet och sedan välja en säkerhetsbindning som kan använda den typen av autentiseringsuppgifter.
Transportsäkerhet, där säkerhet tillämpas på transportbyteströmnivån (under SOAP-meddelandegränserna), är det första alternativet att överväga.
För Internetscenarier och för de intranätscenarier där ett X.509-certifikat kan distribueras på servern kan programmet använda WS_SSL_TRANSPORT_SECURITY_BINDING. I följande exempel visas det här alternativet. Klient: HttpClientWithSslExample Server: HttpServerWithSslExample.
Om klientautentisering via HTTP-huvudautentisering önskas kan en WS_HTTP_HEADER_AUTH_SECURITY_BINDING läggas till för att tillhandahålla den funktionen.
För intranätsscenarier där Protokoll för windowsintegrerad autentisering, till exempel Kerberos, NTLM och SPNEGO är lämpliga, kan programmet använda WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING. I följande exempel visas det här alternativet: Klient: RequestReplyTcpClientWithWindowsTransportSecurityExample Server: RequestReplyTcpServerWithWindowsTransportSecurityExample.
Klient över namngivna pipes: RequestReplyNamedPipesClientWithWindowsTransportSecurityExample
Server över namngivna pipes: RequestReplyNamedPipesServerWithWindowsTransportSecurityExample
För lokala datorscenarier där Protokoll för windowsintegrerad autentisering, till exempel Kerberos, NTLM och SPNEGO är lämpliga, kan programmet använda WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING eller WS_NAMEDPIPE_SSPI_TRANSPORT_SECURITY_BINDING. DenWS_NAMEDPIPE_CHANNEL_BINDING föredras i sådana scenarier eftersom det garanterar att trafiken inte lämnar datorn (detta är en egenskap hos WS_NAMEDPIPE_CHANNEL_BINDING).
Säkerhet i blandat läge, där transportsäkerhet skyddar anslutningen och en WS-Security rubrik i SOAP-meddelandet ger klientautentisering, är nästa alternativ att överväga. Följande bindningar används tillsammans med en av de transportsäkerhetsbindningar som beskrivs i föregående avsnitt.
När klienten autentiseras av ett användarnamn/lösenordspar på programnivå kan programmet använda en WS_USERNAME_MESSAGE_SECURITY_BINDING för att tillhandahålla autentiseringsdata. Följande exempel illustrerar användningen av den här bindningen tillsammans med en WS_SSL_TRANSPORT_SECURITY_BINDING:
När klienten autentiseras med en Kerberos-biljett kan programmet använda en WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING för att tillhandahålla autentiseringsdata.
När du använder en säkerhetskontextupprättar klienten först en säkerhetskontext med servern och använder sedan kontexten för att autentisera meddelanden. För att aktivera den här funktionen måste säkerhetsbeskrivningen innehålla en WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING. När de har upprättats kan säkerhetskontexter överföras med hjälp av lätta token, vilket undviker att behöva skicka de potentiellt stora och beräkningsmässigt dyra klientautentiseringsuppgifterna med varje meddelande.
I ett federerat säkerhetsscenario hämtar klienten först en säkerhetstoken utfärdad av en säkerhetstokentjänst (STS) och presenterar sedan den utfärdade token för en tjänst. Klientsidan: För att hämta säkerhetstoken från STS kan programmet använda WsRequestSecurityToken. Alternativt kan programmet använda ett bibliotek för säkerhetstoken på klientsidan, till exempel CardSpace eller LiveID, och sedan använda sina utdata för att lokalt skapa en säkerhetstoken med hjälp av WsCreateXmlSecurityToken. Hur som helst, när säkerhetstoken är tillgänglig för klienten, kan den visas för tjänsten med hjälp av en säkerhetsbeskrivning som innehåller en WS_XML_TOKEN_MESSAGE_SECURITY_BINDING. Serversidan: Om säkerhetstoken som utfärdas av STS är en SAML-token kan servern använda en säkerhetsbeskrivning med en WS_SAML_MESSAGE_SECURITY_BINDING.
Notera
Windows 7 och Windows Server 2008 R2: WWSAPI stöder endast Ws-Trust och Ws-SecureConversation enligt definitionen i Lightweight Web Services Security Profile (LWSSP). Mer information om Microsofts implementering finns i avsnittet MESSAGE Syntax i LWSSP.
Det sista alternativet att överväga är att använda autentiseringsbindningar utan att använda en skyddsbindning, till exempel WS_SSL_TRANSPORT_SECURITY_BINDING. Detta resulterar i att autentiseringsuppgifterna överförs i klartext och kan få säkerhetskonsekvenser. Användningen av det här alternativet bör utvärderas noggrant för att säkerställa att det inte finns några sårbarheter som ett resultat. Ett exempel på en potentiell användning är att utbyta meddelanden mellan bakomliggande servrar över ett säkert privat nätverk. Följande konfigurationer stöder det här alternativet.
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING stöder det här alternativet i alla konfigurationer.
- WS_USERNAME_MESSAGE_SECURITY_BINDING stöder det här alternativet på servern när HTTP används som transport.
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING stöder det här alternativet på servern när du använder HTTP som transport.
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING stöder det här alternativet på servern när du använder HTTP som transport.
- WS_SAML_MESSAGE_SECURITY_BINDING stöder det här alternativet på servern när HTTP används som transport.
Om du aktiverar det här alternativet måste du uttryckligen ange WS_PROTECTION_LEVEL till ett annat värde än WS_PROTECTION_LEVEL_SIGN_AND_ENCRYPT.
Kanaler och säkerhet
Som nämnts ovan är säkerheten begränsad till kanaler. Dessutom mappas kanalåtgärder till säkerhetssteg konsekvent i alla säkerhetsbindningar.
- Skapa kanal: Den uppsättning säkerhetsbindningar som anges i säkerhetsbeskrivningen verifieras och förblir fast för kanalen därefter. Formen på kanalstacken, inklusive alla sidokanaler som ska användas för WS-Trust baserade förhandlingar, bestäms också.
- Öppen kanal: Alla autentiseringsuppgifter som anges som en del av säkerhetsinställningar läses in och säkerhetssessioner upprättas. I allmänhet innehåller en öppen kanal ett aktivt säkerhetsstatus. När du öppnar en klientkanal anges också serverns slutpunktadress mot vilken serverautentiseringen kommer att utföras av körningen.
- Mellan kanalen öppen och stäng: Meddelanden kan skickas och tas emot på ett säkert sätt under den här fasen.
- Skicka meddelande: Säkerhetskontexttoken hämtas eller förnyas efter behov och säkerheten tillämpas på varje överfört meddelande enligt säkerhetsbeskrivningen. Fel som påträffas vid tillämpning av säkerhet returneras till programmet som skickfel.
- Ta emot meddelande: Säkerheten verifieras för varje mottaget meddelande enligt säkerhetsbeskrivningen. Eventuella verifieringsfel för meddelandesäkerhet returneras till programmet som mottagna fel. Dessa fel för varje meddelande påverkar inte kanalens tillstånd eller efterföljande mottagningar av meddelanden. Programmet kan ta bort en misslyckad mottagning och starta om en mottagning för ett annat meddelande.
- Avbryt kanal: Kanalen kan avbrytas när som helst för att avbryta all I/O på kanalen. När den avbryts hamnar kanalen i ett felaktigt tillstånd och tillåter inte fler sändningar eller mottagningar. Kanalen kan dock fortfarande behålla vissa aktiva säkerhetstillstånd, så en efterföljande stängning av kanalen kommer att vara nödvändig för att ta bort alla tillstånd ordentligt.
- Stängning av kanal: Det säkerhetstillstånd som skapades vid öppning tas bort och sessioner avslutas. Säkerhetskontexttokens annulleras. Kanalstacken finns kvar, men innehåller inget "aktivt" säkerhetstillstånd eller inlästa inloggningsuppgifter.
- Kanalfri: Kanalstacken som skapas vid skapande, tillsammans med alla säkerhetsresurser, frigörs.
Säkerhets-API:er
API-dokumentationen för säkerhet är grupperad i följande avsnitt.
Säkerhet
När du använder WWSAPI-säkerhets-API:et står program inför flera säkerhetsrisker:
-
oavsiktlig felkonfiguration
-
WWSAPI stöder en rad säkerhetsrelaterade konfigurationsalternativ. Se till exempel WS_SECURITY_BINDING_PROPERTY_ID. Vissa av dessa alternativ, till exempel WS_SECURITY_BINDING_PROPERTY_ALLOW_ANONYMOUS_CLIENTS, tillåter att programmet sänker standardnivån för den säkerhet som de olika säkerhetsbindningarna tillhandahåller. Användningen av sådana alternativ bör noggrant utvärderas för att säkerställa att det inte finns några resulterande attackvektorer.
Enligt beskrivningen ovan tillåter WWSAPI dessutom att ett program avsiktligt inaktiverar vissa steg som krävs för att helt skydda ett meddelandeutbyte, till exempel att tillåta att kryptering inaktiveras trots att säkerhetsautentiseringsuppgifter överförs. Detta är tillåtet att aktivera vissa specifika scenarier och bör inte användas för allmän kommunikation. Den WS_PROTECTION_LEVEL måste sänkas specifikt för att aktivera dessa scenarier, och program bör inte ändra det värdet om det inte är absolut nödvändigt, eftersom det inaktiverar många kontroller som är utformade för att säkerställa en säker konfiguration.
-
lagra konfidentiell information i minnet
-
Konfidentiell information, till exempel lösenord, som lagras i minnet är sårbar för att extraheras av en privilegierad angripare med hjälp av till exempel sidfilen. WWSAPI gör en kopia av angivna autentiseringsuppgifter och krypterar den kopian, vilket lämnar ursprungliga data oskyddade. Det är programmets ansvar att skydda den ursprungliga instansen. Dessutom dekrypteras den krypterade kopian kort när den används, vilket skapar en möjlighet att extrahera den.
-
Överbelastningsattack
-
Säkerhetsbearbetning kan förbruka betydande resurser. Varje ytterligare säkerhetsbindning ökar dessa kostnader. WWSAPI avbryter säkerhetsbearbetningen så snart ett säkerhetsverifieringsfel påträffas, men vissa kontroller, till exempel auktoriseringsbeslut, får inte äga rum förrän betydande arbete har utförts.
När ett meddelande bearbetas på servern lagras säkerhetstillståndet på meddelandehögen. Programmet kan begränsa minnesförbrukningen under säkerhetsbearbetningen genom att minska storleken på heapen via WS_MESSAGE_PROPERTY_HEAP_PROPERTIES. Dessutom kan vissa säkerhetsbindningar som WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING göra så att servern allokerar resurser för klientens räkning. Gränserna för dessa resurser kan konfigureras med hjälp av följande WS_SECURITY_BINDING_PROPERTY_ID värden:
- WS_SÄKERHETSBINDNINGSEGENSKAP_SÄKERHETSKONTEXT_MAX_ANTAL_OAVSLUTADE_KONTEXTS
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_MAX_ACTIVE_CONTEXTS
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_RENEWAL_INTERVAL
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_ROLLOVER_INTERVAL
Om du ställer in dessa gränser på låga värden minskar den maximala minnesförbrukningen, men kan leda till att legitima klienter avvisas när kvoten nås.