Omówienie zabezpieczeń
Struktura zabezpieczeń w interfejsie API usług sieci Web systemu Windows (WWSAPI) zapewnia:
- Integralność komunikatów, poufność, wykrywanie odtwarzania i uwierzytelnianie serwera z użyciem zabezpieczeń transmisji.
- Uwierzytelnianie klienta, takie jak weryfikacja tokenu zabezpieczającego, sprawdzanie zaufania certyfikatu i odwołania itp. przy użyciu zabezpieczeń komunikatów protokołu SOAP lub zabezpieczeń transportu.
Model programowania zabezpieczeń
Zabezpieczenia są skojarzone z kanałami komunikacyjnymi . Zabezpieczanie kanału składa się z poniższych kroków.
- Utwórz i zainicjuj co najmniej jedno powiązanie zabezpieczeń odpowiednie dla wymagań dotyczących zabezpieczeń aplikacji.
- Utwórz opis zabezpieczeń zawierający te powiązania zabezpieczeń.
- Utwórz kanał lub serwer proxy usługi (po stronie klienta) albo utwórz odbiornik lub hosta usługi (po stronie serwera), przekazując ten opis zabezpieczeń.
- Wykonaj normalne kroki programowania kanałów takie jak Open, Accept, Send, Receive, Close.
Komunikaty wysyłane i odbierane w kanale są automatycznie zabezpieczane przez środowisko uruchomieniowe zgodnie z podanym opisem zabezpieczeń. Opcjonalnie te kroki można dostosować, określając co najmniej jedno ustawienia zabezpieczeń dla całego kanału w opisie zabezpieczeń lub ustawienia zabezpieczeń dla całego powiązania w powiązaniu zabezpieczeń.
Każda wymagana autoryzacja tożsamości nadawcy musi być wykonywana przez aplikację przy użyciu wyników przetwarzania zabezpieczeń dołączonych do każdego odebranego komunikatu. Kroki autoryzacji nie są określone w opisie zabezpieczeń ani nie są wykonywane automatycznie przez środowisko uruchomieniowe.
Błędy w opisie zabezpieczeń, takie jak nieobsługiwane powiązania, niestosowalne właściwości/pola, brak wymaganych właściwości/pól lub nieprawidłowe wartości właściwości/pola, spowodują niepowodzenie tworzenia kanału lub odbiornika.
Wybieranie powiązań zabezpieczeń
Podczas projektowania zabezpieczeń dla aplikacji podstawową decyzją jest wybór powiązań zabezpieczeń, które mają zostać uwzględnione w opisie zabezpieczeń. Poniżej przedstawiono kilka wskazówek dotyczących wybierania powiązań zabezpieczeń odpowiednich dla scenariusza zabezpieczeń aplikacji. Przydatną metodą heurystyczną jest zrozumienie, jakie typy poświadczeń zabezpieczeń (takie jak certyfikaty X.509 X.509, nazwa użytkownika/hasła domeny systemu Windows, nazwa użytkownika/hasła zdefiniowaneprzez aplikację będą dostępne dla aplikacji, a następnie wybrać powiązanie zabezpieczeń, które może używać tego typu poświadczeń.
Bezpieczeństwo transportu, gdzie zabezpieczenia są stosowane na poziomie strumienia bajtów w transporcie (poniżej granic komunikatów protokołu SOAP), jest pierwszą opcją do rozważenia.
W przypadku scenariuszy internetowych i w tych scenariuszach intranetowych, w których można wdrożyć certyfikat X.509 na serwerze, aplikacja może używać WS_SSL_TRANSPORT_SECURITY_BINDING. Poniższy przykład ilustruje tę opcję. Klient: HttpClientWithSslExample Server: HttpServerWithSslExample.
Jeśli wymagane jest uwierzytelnianie klienta przy użyciu nagłówka HTTP, można dodać WS_HTTP_HEADER_AUTH_SECURITY_BINDING, aby zapewnić tę funkcjonalność.
W przypadku scenariuszy intranetowych, w których odpowiednie są protokoły zintegrowanego uwierzytelniania systemu Windows, takie jak Kerberos, NTLM i SPNEGO, aplikacja może używać WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING. Poniższy przykład ilustruje tę opcję: Klient: - RequestReplyTcpClientWithWindowsTransportSecurityExample Serwer: - RequestReplyTcpServerWithWindowsTransportSecurityExample.
Klient przez nazwane potoki: RequestReplyNamedPipesClientWithWindowsTransportSecurityExample
Serwer na nazwanych potokach: RequestReplyNamedPipesServerWithWindowsTransportSecurityExample
W przypadku scenariuszy maszyn lokalnych, w których są odpowiednie protokoły zintegrowanego uwierzytelniania systemu Windows, takie jak Kerberos, NTLM i SPNEGO, aplikacja może używać WS_TCP_SSPI_TRANSPORT_SECURITY_BINDING lub WS_NAMEDPIPE_SSPI_TRANSPORT_SECURITY_BINDING. W takich scenariuszach preferowane jestWS_NAMEDPIPE_CHANNEL_BINDING, ponieważ gwarantuje, że ruch nie opuści maszyny (jest to właściwość WS_NAMEDPIPE_CHANNEL_BINDING).
Zabezpieczenia w trybie mieszanym, w których zabezpieczenia transportu chronią połączenie, a nagłówek WS-Security w komunikacie PROTOKOŁU SOAP zapewnia uwierzytelnianie klienta, jest kolejną opcją do rozważenia. Poniższe powiązania są używane w połączeniu z jednym z powiązań zabezpieczeń transportu opisanych w poprzedniej sekcji.
Gdy klient jest uwierzytelniany przez parę nazwy użytkownika/hasła na poziomie aplikacji, aplikacja może użyć WS_USERNAME_MESSAGE_SECURITY_BINDING w celu dostarczenia danych uwierzytelniania. W poniższych przykładach pokazano użycie tego powiązania w połączeniu z WS_SSL_TRANSPORT_SECURITY_BINDING:
Gdy klient jest uwierzytelniany przez bilet Kerberos, aplikacja może użyć WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING w celu dostarczenia danych uwierzytelniania.
W przypadku korzystania z kontekstu zabezpieczeń klient najpierw ustanawia kontekst zabezpieczeń z serwerem, a następnie używa tego kontekstu do uwierzytelniania komunikatów. Aby włączyć tę funkcję, opis zabezpieczeń musi zawierać WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING. Po ustanowieniu konteksty zabezpieczeń można przesyłać za pomocą lekkich tokenów, co pozwala uniknąć konieczności wysyłania potencjalnie dużych i obliczeniowo kosztownych poświadczeń klienta przy użyciu każdego komunikatu.
W scenariuszu zabezpieczeń federacyjnych klient najpierw uzyskuje token zabezpieczający wystawiony przez usługę tokenu zabezpieczającego (STS), a następnie przedstawia wystawiony token do usługi. Po stronie klienta: aby uzyskać token zabezpieczający z usługi STS, aplikacja może użyć WsRequestSecurityToken. Alternatywnie aplikacja może używać biblioteki dostawcy tokenów zabezpieczających po stronie klienta, takiej jak CardSpace lub LiveID, a następnie użyć ich danych wyjściowych do lokalnego utworzenia tokenu zabezpieczającego przy użyciu WsCreateXmlSecurityToken. Tak czy inaczej, gdy token zabezpieczający jest dostępny dla klienta, może być przedstawiony usłudze przy użyciu opisu zabezpieczeń zawierającego WS_XML_TOKEN_MESSAGE_SECURITY_BINDING. Po stronie serwera: jeśli token zabezpieczający wystawiony przez usługę STS jest tokenem SAML, serwer może użyć opisu zabezpieczeń z WS_SAML_MESSAGE_SECURITY_BINDING.
Notatka
Windows 7 i Windows Server 2008 R2: WWSAPI obsługuje tylko Ws-Trust i Ws-SecureConversation zgodnie z definicją lightweight Web Services Security Profile (LWSSP). Aby uzyskać szczegółowe informacje dotyczące implementacji firmy Microsoft, zobacz sekcję MESSAGE Syntax w LWSSP.
Ostateczną opcją do rozważenia jest użycie powiązań uwierzytelniania bez użycia powiązania ochrony, takiego jak WS_SSL_TRANSPORT_SECURITY_BINDING. Spowoduje to przesyłanie poświadczeń w postaci zwykłego tekstu i może mieć wpływ na bezpieczeństwo. Użycie tej opcji należy dokładnie ocenić, aby upewnić się, że w rezultacie nie ma żadnych luk w zabezpieczeniach. Przykładem potencjalnego użycia jest wymiana komunikatów między serwerami zaplecza za pośrednictwem bezpiecznej sieci prywatnej. Poniższe konfiguracje obsługują tę opcję.
- WS_HTTP_HEADER_AUTH_SECURITY_BINDING obsługuje tę opcję we wszystkich konfiguracjach.
- WS_USERNAME_MESSAGE_SECURITY_BINDING obsługuje tę opcję na serwerze podczas korzystania z protokołu HTTP jako transportu.
- WS_KERBEROS_APREQ_MESSAGE_SECURITY_BINDING obsługuje tę opcję na serwerze podczas korzystania z protokołu HTTP jako transportu.
- WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING obsługuje tę opcję na serwerze podczas korzystania z protokołu HTTP jako transportu.
- WS_SAML_MESSAGE_SECURITY_BINDING obsługuje tę opcję na serwerze podczas korzystania z protokołu HTTP jako transportu.
Ustawienie tej opcji wymaga jawnego nadania WS_PROTECTION_LEVEL wartości innej niż WS_PROTECTION_LEVEL_SIGN_AND_ENCRYPT.
Kanały i zabezpieczenia
Jak wspomniano powyżej, zabezpieczenia są ograniczone do kanałów. Ponadto operacje kanału są przyporządkowane do kroków zabezpieczeń, co jest spójne we wszystkich połączeniach zabezpieczeń.
- Tworzenie kanału: zestaw powiązań zabezpieczeń określonych w opisie zabezpieczeń jest weryfikowany i pozostaje stały dla kanału później. Określa się również strukturę kanału, w tym wszelkie kanały boczne, które mają być używane do negocjacji związanych z WS-Trust.
- Kanał otwarty: wszelkie poświadczenia dostarczane w ramach zabezpieczeń są ładowane, a sesje zabezpieczeń są nawiązywane. Ogólnie rzecz biorąc, otwarty kanał zawiera aktywny stan zabezpieczeń. Otwarcie kanału klienta określa również adres punktu końcowego serwera, względem którego zostanie wykonane uwierzytelnianie serwera przez środowisko uruchomieniowe.
- Między otwarciem i zamknięciem kanału: Komunikaty mogą być bezpiecznie wysyłane i odbierane w tej fazie.
- Wysyłanie komunikatów: tokeny kontekstu zabezpieczeń są uzyskiwane lub odnawiane zgodnie z potrzebami, a zabezpieczenia są stosowane do każdego przesyłanego komunikatu zgodnie z opisem zabezpieczeń. Błędy występujące podczas stosowania zabezpieczeń są zwracane do aplikacji jako błędy wysyłania.
- Odbieranie komunikatów: zabezpieczenia są weryfikowane dla każdego odebranego komunikatu zgodnie z opisem zabezpieczeń. Wszelkie błędy weryfikacji zabezpieczeń komunikatów są zwracane do aplikacji jako błędy odbierane. Błędy dotyczące poszczególnych komunikatów nie wpływają na stan kanału ani kolejne odbiory. Aplikacja może odrzucić komunikat, który zakończył się niepowodzeniem i ponownie uruchomić odbieranie dla innego komunikatu.
- Przerwanie kanału: kanał może zostać przerwany w dowolnym momencie, aby wstrzymać wszystkie operacje I/O na kanale. Po przerwaniu kanał przejdzie do stanu błędu i nie zezwoli na więcej wysyłania ani odbierania. Jednak kanał może nadal zachować pewien aktywny stan zabezpieczeń, więc konieczne będzie kolejne zamknięcie kanału, aby dokładnie usunąć cały stan.
- Zamknięcie kanału: stan zabezpieczeń utworzony podczas otwierania jest usuwany, a sesje są usuwane. Tokeny kontekstu zabezpieczeń są anulowane. Stos kanału pozostaje, ale nie zawiera aktywnego stanu zabezpieczeń ani załadowanych poświadczeń.
- Bezpłatna kanał: stos kanału utworzony podczas tworzenia wraz ze wszystkimi zasobami zabezpieczeń jest bezpłatny.
API zabezpieczeń
Dokumentacja interfejsu API dotycząca zabezpieczeń jest pogrupowana w następujące tematy.
- opis zabezpieczeń
- Federacja
- kontekst zabezpieczeń
- tożsamości punktu końcowego
- Wyniki przetwarzania zabezpieczeń
Bezpieczeństwo
W przypadku korzystania z interfejsu API zabezpieczeń WWSAPI aplikacje napotykają kilka zagrożeń bezpieczeństwa:
-
przypadkowa błędna konfiguracja
-
Interfejs WWSAPI obsługuje szereg opcji konfiguracji związanych z zabezpieczeniami. Na przykład, zobacz WS_SECURITY_BINDING_PROPERTY_ID. Niektóre z tych opcji, takie jak WS_SECURITY_BINDING_PROPERTY_ALLOW_ANONYMOUS_CLIENTS umożliwiają aplikacji obniżenie domyślnego poziomu zabezpieczeń zapewnianego przez różne powiązania zabezpieczeń. Użycie takich opcji należy dokładnie ocenić, aby upewnić się, że nie ma żadnych wynikowych wektorów ataku.
Ponadto, zgodnie z powyższym opisem, interfejs WWSAPI umożliwia aplikacji celowe wyłączenie niektórych kroków wymaganych do pełnego zabezpieczenia wymiany komunikatów, takich jak zezwolenie na wyłączenie szyfrowania, nawet jeśli poświadczenia zabezpieczeń są przesyłane. Umożliwia to włączenie określonych scenariuszy i nie powinno być używane do komunikacji ogólnej. WS_PROTECTION_LEVEL należy specjalnie obniżyć, aby umożliwić korzystanie z tych scenariuszy, a aplikacje nie powinny zmieniać tej wartości, chyba że jest to absolutnie konieczne, ponieważ spowoduje to wyłączenie wielu kontroli zaprojektowanych w celu zapewnienia bezpiecznej konfiguracji.
-
Przechowywanie poufnych informacji w pamięci
-
Poufne informacje, takie jak hasła, przechowywane w pamięci, są narażone na wyodrębnienie przez uprzywilejowanego atakującego za pomocą na przykład pliku strony. WWSAPI tworzy kopię podanych poświadczeń i szyfruje ją, pozostawiając oryginalne dane niechronione. Aplikacja jest odpowiedzialna za ochronę oryginalnego wystąpienia. Ponadto zaszyfrowana kopia jest krótko odszyfrowywana podczas użycia, otwierając możliwość jej wyodrębnienia.
-
odmowa usługi
-
Przetwarzanie zabezpieczeń może zużywać znaczne zasoby. Każde dodatkowe powiązanie zabezpieczeń zwiększa te koszty. WWSAPI przerywa przetwarzanie zabezpieczeń, gdy tylko napotka błąd weryfikacji zabezpieczeń, ale niektóre kontrole, takie jak decyzje autoryzacyjne, mogą nie nastąpić aż do momentu, gdy została wykonana znacząca część pracy.
Podczas przetwarzania komunikatu na serwerze stan zabezpieczeń jest przechowywany na stercie komunikatów. Aplikacja może ograniczyć zużycie pamięci podczas przetwarzania zabezpieczeń, zmniejszając rozmiar sterty pamięci za pomocą WS_MESSAGE_PROPERTY_HEAP_PROPERTIES. Ponadto niektóre powiązania zabezpieczeń, takie jak WS_SECURITY_CONTEXT_MESSAGE_SECURITY_BINDING, mogą spowodować, że serwer przydziela zasoby w imieniu klienta. Limity dla tych zasobów można skonfigurować za pomocą następujących wartości WS_SECURITY_BINDING_PROPERTY_ID:
- WŁAŚCIWOŚĆ_WIĄZANIA_BEZPIECZEŃSTWA_MAX_OCZEKUJĄCYCH_KONTEKSTÓW_SECURITY_CONTEXT
- WŁAŚCIWOŚĆ_WIĄZANIA_BEZPIECZEŃSTWA_MAKSYMALNA_LICZBA_AKTYWNYCH_KONTEXTÓW_BEZPIECZEŃSTWA
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_RENEWAL_INTERVAL
- WS_SECURITY_BINDING_PROPERTY_SECURITY_CONTEXT_ROLLOVER_INTERVAL
Ustawienie tych limitów na niskie wartości zmniejsza maksymalne zużycie pamięci, ale może prowadzić do odrzucenia uzasadnionych klientów po osiągnięciu limitu przydziału.