Integracja aplikacji Wykład 4 Piotr Czapiewski Wydział Informatyki ZUT Integracja aplikacji Wykład 4
Bezpieczeństwo usług sieciowych
Cele zabezpieczeń Wzajemne uwierzytelnienie Autoryzacja użytkowników Poufność komunikatów Nienaruszalność komunikatów
Trzy poziomy zabezpieczania Web Services Bezpieczna warstwa transportowa Autoryzacja użytkowników WS-Security
Bezpieczna warstwa transportowa Włączenie obsługi protokołu HTTPS Wymuszenie dostępu do usługi sieciowej przez HTTPS Wygenerowanie certyfikatu serwera Konfiguracja serwera aplikacji Połączenie z usługą przez HTTPS W razie potrzeby: dodanie certyfikatu serwera do zaufanych wystawców Konfiguracja klienta Certyfikaty X.509 Zapewnienie poufności Zapewnienie integralności (nienaruszalności komunikatów) Uwierzytelnienie serwera Opcjonalnie: uwierzytelnienie klienta Protokół HTTPS (SSL)
Autoryzacja użytkowników Miejsce przeprowadzenia autoryzacji Wskazane oddzielenie kodu usługi od mechanizmu autoryzacji Autoryzacja przez klasę publikującą – Endpoint Autoryzacja przez serwer aplikacji (np. Tomcat, Glassfish) HTTP-based authentication Dane logowania przesyłane w nagłówku żądania HTTP Role-based authorization Serwer aplikacji zarządza rolami użytkowników i dostępem do usług
Przykład Autoryzacja przez HTTP dla usługi publikowanej przez klasę Endpoint
HTTP Basic Authentication Serwer usługi – Java, JAX-WS, publikacja przez Endpoint InetSocketAddress addr = new InetSocketAddress("localhost", 666); HttpServer server = HttpServer.create(addr, 5); server.start(); HttpContext context = server.createContext("/zegarynka"); context.setAuthenticator(new BasicAuthenticator("test") { public boolean checkCredentials(String user, String pass) { return "student".equals(user) && "pandatrzy".equals(pass); } }); Zegarynka z = new Zegarynka(); Endpoint endpoint = Endpoint.create(z); endpoint.publish(context);
HTTP Basic Authentication Klient usługi – C# BasicHttpBinding binding = new BasicHttpBinding(); binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic; EndpointAddress remoteAddr = new EndpointAddress("http://localhost:666/zegarynka"); ZegarynkaClient zc = new ZegarynkaClient(binding, remoteAddr); zc.ClientCredentials.UserName.UserName = "student"; zc.ClientCredentials.UserName.Password = "pandatrzy"; string s = zc.ktoraGodzina();
HTTP Basic Authentication Konwersacja HTTP POST /zegarynka HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "" Authorization: Basic c3R1ZGVudDpwYW5kYXRyenk= Host: 192.168.2.104:666 Content-Length: 142 <s:Envelope xmlns:s=http://schemas.xmlsoap.org/soap/envelope/><s:Body><ktoraGodzina xmlns="http://javaapplication2/"/></s:Body></s:Envelope> HTTP/1.1 200 OK Transfer-encoding: chunked Content-type: text/xml;charset="utf-8" <?xml version="1.0" ?><S:Envelope mlns:S=http://schemas.xmlsoap.org/soap/envelope/><S:Body><ns2:ktoraGodzinaResponse xmlns:ns2=http://javaapplication2/><return>Tue Mar 23 21:19:09 CET 2010</return></ns2:ktoraGodzinaResponse></S:Body></S:Envelope>
HTTP Basic Authentication Konwersacja HTTP – błąd autoryzacji POST /zegarynka HTTP/1.1 Content-Type: text/xml; charset=utf-8 SOAPAction: "" Authorization: Basic c3R1ZGVudDpkc2Zhc2Rm Host: 192.168.2.104:666 Content-Length: 142 <s:Envelope xmlns:s=http://schemas.xmlsoap.org/soap/envelope/><s:Body><ktoraGodzina xmlns="http://javaapplication2/"/></s:Body></s:Envelope> HTTP/1.1 401 Unauthorized Content-length: 0 Www-authenticate: Basic realm="test"
Przykład Publikowanie usługi na serwerze Tomcat Zabezpieczenie usługi (HTTPS, autoryzacja)
Instalacja usługi na serwerze Tomcat package pc.ws; import ...; @WebService() public class Zegarynka { @WebMethod public String ktoraGodzina() { return Calendar.getInstance().getTime().toString(); } @WebMethod public String zakukaj(int ileRazy) { String s = ""; for(int i=0; i<ileRazy; i++) s += "ku ku "; return s; } } Kod usługi Niezależny od sposobu publikacji Taki sam jak w przykładzie publikowanym przez Endpoint
Instalacja usługi na serwerze Tomcat Plik web Instalacja usługi na serwerze Tomcat Plik web.xml – deskryptor aplikacji webowej ... <listener> <listener-class> com.sun.xml.ws.transport.http.servlet.WSServletContextListener </listener-class> </listener> <servlet> <servlet-name>Zegarynka</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Zegarynka</servlet-name> <url-pattern>/Zegarynka</url-pattern> </servlet-mapping>
Instalacja usługi na serwerze Tomcat Plik sun-jaxws.xml <?xml version="1.0" encoding="UTF-8"?> <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"> <endpoint implementation="pc.ws.Zegarynka" name="Zegarynka" url-pattern="/Zegarynka" /> </endpoints>
Włączenie protokołu HTTPS Wygenerowanie klucza – narzędzie keytool Konfiguracja serwera – plik server.xml keytool -genkey -alias tomcat –keyalg RSA ... <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />
Wymuszenie protokołu HTTPS Konfiguracja usługi – plik web.xml ... <security-constraint> <display-name>Zabezpieczenie usług</display-name> <web-resource-collection> <web-resource-name>ZegarynkaService</web-resource-name> <description>Usługa Zegarynka</description> <url-pattern>/Zegarynka</url-pattern> </web-resource-collection> <user-data-constraint> <description>Wymuś HTTPS</description> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> ...
Autoryzacja – definicja użytkowników Plik tomcat-users.xml ... <tomcat-users> ... <role rolename="zegarmistrz"/> <user username="student" password="pandatrzy" roles="zegarmistrz"/> </tomcat-users>
Autoryzacja – zabezpieczenie usługi Konfiguracja usługi – plik web.xml <security-role> <description/> <role-name>zegarmistrz</role-name> </security-role> ... <security-role> <description/> <role-name>zegarmistrz</role-name> </security-role> <security-constraint> <display-name>TylkoHTTPS</display-name> <web-resource-collection> <web-resource-name>ZegarynkaService</web-resource-name> <description>Usługa Zegarynka</description> <url-pattern>/Zegarynka</url-pattern> </web-resource-collection> <auth-constraint> <description>Tylko dla zegarmistrzów</description> <role-name>zegarmistrz</role-name> </auth-constraint> <user-data-constraint> <description>Poufne</description> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>uslugi</realm-name> </login-config> <auth-constraint> <description>...</description> <role-name>zegarmistrz</role-name> </auth-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>uslugi</realm-name> </login-config>
Klient usługi Generowanie klas pośredniczących Netbeans New project -> Java Application New file -> Web Service Client Z linii poleceń – narzędzie wsimport wsimport -keep -p nazwa.pakietu http://adres.usługi?wsdl
Klient usługi Kod wersji bez autoryzacji ZegarynkaService zs = new ZegarynkaService(); Zegarynka zp = zs.getZegarynkaPort(); String s = zp.ktoraGodzina(); System.out.println(s);
Klient usługi Kod wersji z autoryzacją HTTP ZegarynkaService zs = new ZegarynkaService(); Zegarynka zp = zs.getZegarynkaPort(); BindingProvider prov = (BindingProvider)zp; prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "student"); prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pandatrzy"); String s = zp.ktoraGodzina(); System.out.println(s);
WS-Security
WS-Security i powiązane protokoły WS-Policy WS-Secure Conversation WS-Trust WS-Federation WS-Privacy WS-Authorization
WS-Security Rozszerzenie protokołu SOAP Protokół komunikacyjny określający sposób zabezpieczania usług sieciowych Zapewnienie integralności i poufności SAML (Security Assertion Markup Language), Kerberos, certyfikaty X.509 XML Encryption, XML Signature Protokół określa: sposób dołączania podpisów do komunikatów SOAP sposób szyfrowania komunikatów SOAP sposób dołączania tokenów (także binarnych; Kerberos tickets, certfykaty X.509)
WS-Security Uwierzytelnienie UsernameToken Profile X.509 Certificate Token Profile SAML (Security Assertion Markup Language) Token Profile <wsse:UsernameToken wsu:Id="Example"> <wsse:Username> ... </wsse:Username> <wsse:Password Type="..."> ... </wsse:Password> <wsse:Nonce EncodingType="..."> ... </wsse:Nonce> <wsu:Created> ... </wsu:Created> </wsse:UsernameToken>
WS-Security: SOAP header <?xml version="1.0" encoding="utf-8"?> <S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu="..." xmlns:ds="..."> <S11:Header> <wsse:Security xmlns:wsse="..."> <wsse:UsernameToken wsu:Id="Example"> <wsse:Username> ... </wsse:Username> <wsse:Password Type="..."> ... </wsse:Password> <wsse:Nonce EncodingType="..."> ... </wsse:Nonce> <wsu:Created> ... </wsu:Created> </wsse:UsernameToken> </wsse:Security> </S11:Header> <S11:Body wsu:Id="MsgBody"> <tru:getBalance xmlns:tru="http://samplebank.com/ws"> 65712356 </tru:getBalance> </S11:Body> </S11:Envelope>
XML Signature <Signature Id="MyFirstSignature" xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11"/> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/> <Reference URI="http://www.w3.org/TR/2000/REC-xhtml1-20000126/"> <Transforms> <Transform Algorithm="http://www.w3.org/2006/12/xml-c14n11"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <DigestValue>dGhpcyBpcyBub3QgYSBzaWduYXR1cmUK.../DigestValue> </Reference> </SignedInfo> <SignatureValue>...</SignatureValue> <KeyInfo> <KeyValue> <DSAKeyValue> <P>...</P><Q>...</Q><G>...</G><Y>...</Y> </DSAKeyValue> </KeyValue> </KeyInfo> </Signature>
XML Encryption <?xml version='1.0'?> <EncryptedData xmlns='http://www.w3.org/2001/04/xmlenc#' MimeType='text/xml'> <CipherData> <CipherValue>A23B45C56</CipherValue> </CipherData> </EncryptedData>
WS-Security – powiązane specyfikacje Specyfikowanie i komunikowanie polityki zabezpieczeń WS-Policy Wydawanie, odnawianie i walidacja tokenów zabezpieczających Sposoby ustanawiania zaufania pomiędzy stronami WS-Trust Współdzielenie kontekstu zabezpieczeń Bezpieczne konwersacje pomiędzy witrynami z użyciem Web Services WS-SecureConversation Mechanizmy współdzielenia informacji o autentykacji WS-Federation Określenie mechanizmów i polityki autoryzacji klientów usługi WS-Authorization
Rodzina protokołów WS-*
Rodzina protokołów WS-* Specyfikacje rozszerzające możliwości Web Services WS-Security, WS-Policy, WS-Authorization, WS-Trust, WS- Federation, WS-Secure Conversation, WS-Privacy… WS-Reliability WS-Transaction WS-Addressing, WS-Transfer, WS-Eventing, WS-Notification, WS- Discovery, WS-MetadataExchange, …
WS-Reliability Protokół wiarygodnej wymiany komunikatów pomiędzy usługami sieciowymi Reliable Messaging Reliable Messaging (RM) is the execution of a transport-agnostic, SOAP-based protocol providing quality of service in the reliable delivery of messages
WS-Reliability Specyfikacja definiuje następujące mechanizmy: Guaranteed message delivery, or At-Least-Once delivery semantics. Guaranteed message duplicate elimination, or At-Most-Once delivery semantics. Guaranteed message delivery and duplicate elimination, or Exactly- Once delivery semantics. Guaranteed message ordering for delivery within a group of messages.
WS-Transaction Specyfikacja określająca sposób obsługi transakcji w usługach sieciowych Określa dwa rodzaje koordynacji działań w usługach sieciowych: Atomic Transaction (AT) – dla pojedynczych operacji Business Activity (BA) – dla transakcji długoterminowych Powiązane specyfikacje: WS-Coordination WS-AtomicTransaction WS-BusinessActivity