Wprowadzenie
Bezpieczeństwo jest istotną częścią każdego kazdego oprogramowania a staje się wręcz niezbędną częścią jeśli chodzi o serwisu webowe - które wystawiane na świat i stają się widocznymi celami różnego rodzaju ataków.
WCF posiada dwa podstawowe tryby obsługi bezpieczeństwa:
- bezpieczeństwo
na poziomie transportu (Transport Level Security)
- bezpieczeństwo
na poziomie wiadomości (Message
Level Security)
(istnieje jeszcze jeden tryb który łączy dwa
powyższe - TransportWithMessageCredential)
Bezpieczeństwo wiadomości można zdefiniować za pomocą 3 aspektów, potocznie nazywanych CIA:
- Confidentiality - poufność - oznacza, ze osoba lub podmiot, który powinien widzieć wiadomość w rzeczywistości ta osoba/podmiotem jest
- Integrity - integralność - oznacza, ze wiadomość nie może być w żaden sposób zmieniona lub "zainfekowana" bez wykrycia tego faktu
- Authentication - uwierzytelnianie - potwierdza tożsamość osoby/podmiotu przeglądającego wiadomość
Brzmi dość tragicznie i zniechęcająco? Można to sobie porównać np. do korzystania z konta bankowego. Tylko osoba do której konto należy może przeglądać dane swojego konta i wykonywać w nim odpowiednie operacje (no chyba ze ktoś inny jeszcze zostanie do tego upoważniony). Wpłacając lub wypłacając pieniądze chcemy mieć pewność ze kwota wpłacona/wypłacona będzie miała swoje odzwierciedlenie na naszym koncie (no może nie zawsze zwłaszcza jeśli chodzi o wypłaty ;)). Dodatkowo oczekujemy od banku iż przed dostępem do naszego konta zostaniemy odpowiednio uwierzytelnieni. Logując się online musimy podać np. nr klienta oraz hasło, korzystając z infolinii tez musimy posiadać odpowiednie dane dostępowe. Jak widać wszystkie niuanse prawdziwego życia w tym kontekście mogą być odzwierciedlone w WCF.
Message Level Security
Message Level Security jest pierwszą podstawową kategorią w całej
strukturze bezpieczeństwa Windows Communication Foundation. Jest fizyczną implementacją WS-Security Specification, a jej głównym zadaniem jest rozszerzanie
wiadomości SOAP (Simple Object Access Protocol) w celu zapewnienia poufności, integralności i uwierzytelniania. Oznacza to z wszystkie detale związane z bezpieczeństwem wiadomości przechowywane są w niej samej. Ma to swoje wady i zalety:
Zalety
Wady
Zalety
- End-to-end security. Jak wcześniej zostało napisane, "message level security" rozszerza wiadomość SOAP dodając do niej odpowiednie informacje zabezpieczające. Można powiedzieć, ze w przeciwieństwie do "transport level security" (np. SSL które zabezpiecza wiadomość w przypadku komunikacji punkt-punkt, tzn. ze jeśli istnieją jakieś pośrednie urządzenia to ta informacja jest za każdym razem re-transmitowana), informacje zabezpieczające są z wiadomością przez cały cykl jej życia.
- Increased flexibility - zwiększona elastyczność. Niekoniecznie cała wiadomość lecz część wiadomości może być podpisana lub zaszyfrowana. Dzięki temu pewna część wiadomości może być widoczna dla serwisów pośredniczących a część zaszyfrowana/podpisana co zapewnia jej integralność. Domyślnie, w przypadku stosowanie "message level security", WCF nie szyfruje wiadomości lecz podpisuje ja.
- Support for multiple transports - wsparcie dla wielu typów transportu. Oznacza to, że "message level security" jest niezależne od typu transportu. Zabezpieczoną wiadomość możemy przesłać używając HTTP, TCP czy named pipes.
Za MSDN:
- Wydajność - z racji tego iż wiadomość jest rozszerzona, automatycznie staje się większa
- Nie można używać message stereaming
- Wymaga implementacji mechanizmów bezpieczeństwa na poziomie XML oraz wsparcia dla WS-Security Sepcification co może zmniejszyć interoperacyjność
Kiedy uzywac
Zalety
Wady
Kiedy używać
- w przypadku gdy wiadomość będzie krążyła pomiędzy różnymi serwisami
- w przypadku gdy serwis WCF będzie dostępny poprzez Internet i dostęp do niego będzie wymagał innych serwisów pośredniczących w komunikacji
Transport Message Security
Generalnie, w odróżnieniu od "Message Level Security" tutaj wszystkie dane dotyczące bezpieczeństwa wiadomości przekazywane są za pomocą warstwy transportującej. Oznacza to iż ten typ zabezpieczeń jest zależny od typu wybranego transportu co automatycznie zmniejsza jego możliwości jeśli chodzi o opcje uwierzytelniania. Kazdy z protokolow transportowych (TCP, IPC, MSMQ czy HTTP) implementuje własny mechanizm zabezpieczenia wiadomości. Najpopularniejszym podejściem jest wykorzystanie Secure Socket Layer (SSL) do szyfrowania bądź podpisywania zawartości pakietów wysyłanych przez HTTPS.Zalety
- zapewnia interoperacyjność ponieważ nie musi implementować WS-Security Specification
- większa wydajność
Wady
- zapewnia bezpieczeństwo punkt-punkt
- ograniczona liczba opcji uwierzytelniania w stosunku do message level security
- zależne od protokołu transportującego
Kiedy używać
- gdy wiadomość będzie wysyłana bezpośrednio między dwoma punktami bez angażowania jakichkolwiek pośredników, np. w przypadku bezpośredniej komunikacji klient-serwer
- gdy serwer i klient są w lokalnej sieci intranet
Jest dostępny we wszystkich typach bindingów z wyjątkiem wsDualHttpBinding
Show me the code
Jak właściwie wszystko w WCF, bezpieczeństwo na poziomie wiadomości można zdefiniować używajac kodu deklaratywnego lub imperatywnego. Obie implementacji są banale i wyglądają następująco:
Kod deklaratywny:
Kod deklaratywny:
Kod imperatywny (z wykorzystaniem domyslnego (bezparametrowego kontruktora)):
WSHttpBinding wsHttpSecurity = new WSHttpBinding(); wsHttpSecurity.Security.Mode = SecurityMode.Message;Kod imperatywny (okreslanie security level w konstruktorze):
WSHttpBinding wsHttpSecurity = new WSHttpBinding(SecurityMode.Message);
Brak komentarzy:
Prześlij komentarz