Tổng quan
Trước khi chúng ta nói về việc bảo vệ một dịch vụ, thật có ích để biết chính xác các phần nào tạo nên dịch vụ đó để biết những gì đã được thực hiện.
Câu chuyện tiếp tục cho đến nay
Loạt bài hướng dẫn này tiếp tục các hoạt động của các nhân viên của tờ báo Daily Moon (Mặt Trăng hàng ngày). Tờ báo này đã phát hiện ra cách làm việc mới dưới dạng các dịch vụ Web. Tất cả cách làm việc mới này đã bắt đầu trong phòng chuyên mục rao vặt. Phòng này đã quyết định cho phép những người khác truy cập vào hệ thống của mình thông qua việc sử dụng các thông báo SOAP -- các thông báo XML có thể được gửi qua HTTP.
Ví dụ, một yêu cầu cho một số trong các đoạn quảng cáo được phân loại thành thể loại con "để bán" có thể trông giống như Liệt kê 1.
Liệt kê 1. Một thông báo SOAP ví dụ
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/SOAP-envelope">
<env:Header>
</env:Header>
<env:Body>
<cms:getNumberOfArticles xmlns:cms="http://www.daily-moon.com/cms">
<cms:category>classifieds</cms:category>
<cms:subcategory>forsale</cms:subcategory>
</cms:getNumberOfArticles>
</env:Body>
</env:Envelope>
|
Thông báo tổng thể được gọi là Phong bì (Envelope), với các nội dung trong đó bao gồm phần Tiêu đề (Header) và phần Thân (Body). Tiêu đề chứa thông tin về chính thông báo đó, chẳng hạn như thông tin định tuyến, hoặc các thông tin dự kiến do "các phương tiện trung gian SOAP" xử lý hoặc dịch vụ giữa người gửi và người nhận cuối có thể xử lý thông báo. (Trong trường hợp này, hãy xem bất kỳ trong số các tiêu đề đó, nhưng đây là nơi thông tin an ninh của chúng ta sẽ gửi đi). Phần Thân của thông báo bao gồm "tải trọng" có các dữ liệu thực sự được chuyển tới dịch vụ Web.
Trong trường
hợp này, trọng tải là phần tử getNumberOfArticles và nội
dung của nó.
Gene và Frances, từ bộ phận IT của tờ báo này, đã ráp một hệ thống vào với nhau để phục vụ các yêu cầu của các dịch vụ web, cũng như cơ sở hạ tầng để phát hiện và tự động tạo ra các ứng dụng khách cho các dịch vụ. Bây giờ chủ báo, Rudy, đang nhấn mạnh rằng họ tìm thấy cách để ngăn chặn truy cập trái phép vào các hệ thống này.
Đặc tả SOAP cơ bản không lo liệu cho việc bảo vệ các thông báo, mà để lại nhiệm vụ đó cho các đặc tả mở rộng. Vấn đề nằm ở tính chất của một ứng dụng của các dịch vụ Web. Trong hầu hết các trường hợp, chúng ta đang đề cập đến SOAP trên HTTP, có nghĩa là mỗi thông báo phải đi qua một hoặc nhiều nút trung gian, và bất kỳ một trong số các nút đó có thể đọc và/hoặc thay đổi một thông báo. Và điều đó thừa nhận rằng bản thân yêu cầu SOAP đã là một yêu cầu trực tiếp. Trong một số trường hợp, các thông báo SOAP được thiết kế đặc biệt để đi qua nhiều hơn một nút trước khi tới điểm đến cuối cùng của chúng.
Kết quả cuối cùng là chúng ta cần một cách để ngăn chặn một ai đó không phải là người nhận được dự kiến đọc các thông tin nhạy cảm, để ngăn chặn việc nghe trộm. Chúng ta cũng cần một cách để ngăn chặn một ai đó không phải là người gửi được dự kiến gửi đi các thông báo, để ngăn chặn truy cập trái phép.
Đặc tả SOAP cung cấp một phương tiện để bổ sung các thông tin an ninh -- chúng ta thêm thông tin vào một phần tử Tiêu đề của Phong bì -- nhưng không xác định các thông tin nên là gì. Để bảo vệ nó, chúng ta cần Các dịch vụ Web-An ninh (WS-Security).
Các phần về Các dịch vụ Web-An ninh
Có ba vấn đề chủ yếu cần có trong việc đảm bảo an ninh cho các trao đổi thông báo SOAP và Các dịch vụ Web-An ninh cung cấp các câu trả lời cho tất cả các vấn đề đó, nhưng không trực tiếp. Trong thực tế, Các dịch vụ Web-An ninh là một đặc tả không nói về cách bảo vệ thông báo, mà nói về cách giúp cho người nhận biết cách bạn đã bảo vệ thông báo. Để thực hiện việc bảo vệ trên thực tế, Các dịch vụ Web-An ninh tham chiếu các đặc tả bổ sung. Hãy xem Các dịch vụ Web-An ninh hoạt động như thế nào.
Vấn đề đầu tiên là nhận dạng và xác thực ứng dụng khách. Vì có rất nhiều cách khác nhau để tạo ra các thẻ an ninh, nên Các dịch vụ Web-An ninh không xác định bất kỳ phương tiện cụ thể nào, mà định nghĩa cách các thẻ an ninh khác nhau sẽ được chuyển giao trong các thông báo SOAP. Nói cách khác, nó cho phép người nhận biết cách trích xuất các thẻ an ninh khỏi thông báo để xử lý.
Vấn đề thứ hai là đảm bảo tính toàn vẹn của thông báo. Các dịch vụ Web-An ninh sử dụng các chữ ký số cho việc đó, sử dụng đặc tả Chữ ký XML hơn là phát minh ra một vài thứ mới. Chữ ký XML là một khuyến nghị của W3C cung cấp một cơ chế cho việc ký bằng số các tài liệu XML.
Vấn đề thứ ba là giữ cho thông báo khỏi bị nghe trộm trong khi nó chuyển tiếp. Một lần nữa, Các dịch vụ Web-An ninh sử dụng một tiêu chuẩn W3C khác, lần này là Mã hóa XML (XML Encryption), cung cấp một cơ chế để mã hóa các tài liệu XML.
Trong hướng dẫn này, chúng ta sẽ xem việc sử dụng các tiêu chuẩn này ảnh hưởng đến các thông báo SOAP thực tế thường dùng như thế nào, khi Frances và Gene thực hiện bảo vệ dịch vụ của chuyên mục Rao vặt hiện có.
Trước khi chúng ta xem xét thực hiện các thay đổi, thật có ích để xem nơi Gene và Frances sẽ bắt đầu. Dịch vụ của của chuyên mục Rao vặt được triển khai thực hiện bằng cách sử dụng Axis2, có nghĩa là nó có chứa trong một tệp *.aar. Tệp CMSService.aar có ba tệp, như trong Liệt kê 2.
Liệt kê 2. Các nội dung của dịch vụ đầu tiên
CMSService.class
meta-inf/Manifest.MF
meta-inf/services.xml
|
Bản thân lớp này là đơn giản, nó nhận một thông báo SOAP liệt kê một thể loại và trả về một thông báo SOAP bao gồm một số các đoạn quảng cáo cho thể loại đó. Nó thực hiện chức năng này khi được tệp services.xml định nghĩa (xem Liệt kê 3).
Liệt kê 3. Tệp services.xml đầu tiên
<service name="CMSService">
<description>
This is a sample Web Service for the newspaper's
Content Managment System.
</description>
<parameter name="ServiceClass"
locked="false">CMSService</parameter>
<operation name="getNumberOfArticles">
<messageReceiver class=
"org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
</service>
|
Việc bảo vệ dịch vụ đòi hỏi chỉ chạm vào tệp services.xml; Gene và Frances sẽ không hề phải chạm vào lớp Java thực tế.
Bản thân ưng dụng khách là khá đơn giản và chỉ cần tạo và hiển thị yêu cầu, như trong Liệt kê 4:
Liệt kê 4. Lớp ứng dụng khách đầu tiên
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
public class ClassifiedClient {
private static EndpointReference targetEPR =
new EndpointReference(
"http://localhost:8888/axis2/services/CMSService");
public static OMElement getNumOfArticlesOMElement() {
SOAPFactory fac = OMAbstractFactory.getSOAP12Factory();
OMNamespace omNs = fac.createOMNamespace(
"http://daily-moon.com/cms", "cms");
OMElement method = fac.createOMElement("getNumberOfArticles",
omNs);
OMElement value = fac.createOMElement("category", omNs);
value.addChild(fac.createOMText(value, "classifieds"));
method.addChild(value);
return method;
}
public static void main(String[] args) {
try {
OMElement payload =
ClassifiedClient.getNumOfArticlesOMElement();
Options options = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMElement result = sender.sendReceive(payload);
String response = result.getText();
System.out.println("There are "+response+
" classifieds at the moment.");
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
|
Lưu ý rằng Gene đã thay đổi cổng điểm cuối thành 8888, thay cho 8080, cổng mà máy chủ Geronimo đang nghe. Gene làm điều đó để chèn một bước bổ sung sao cho anh ta có thể nhìn thấy các thông báo bay qua bay lại.
Để xem các thông báo SOAP thực tế, hãy tải TCPMon từ http://ws.apache.org/commons/tcpmon/download.cgi. (Đúng, Axis2 đi kèm với SOAPMonitor, nhưng Gene đã phát hiện ra cách phức tạp nằm ngoài những rắc rối trong việc thiết lập những thứ đó, nó cho thấy SOAP nhưng không nhất thiết phải là các thông báo thô, mà chúng ta rõ ràng sẽ muốn xem).
Sau khi tải về, giải
nén ứng dụng đó và chạy tệp tcpmon-1.0-bin\build\tcpmon.bat. Nhấn vào tab Admin và tạo một người nghe
mới, như trong Hình 1.
Hình 1. tab Admin của TCPMon
Chọn 8888 là một cổng nghe và xác định 8080 là cổng đích, để cho TCPMon nằm giữa ứng dụng khách và máy chủ. Nhấn Add và sau đó nhấn vào thẻ Port 8888. Nhấn vào hộp chọn XML Format. Bây giờ khi Frances thực hiện ứng dụng khách, Gene có thể thấy yêu cầu và đáp ứng, như trong Hình 2.
Hình 2. Yêu cầu và đáp ứng đầu tiên
Trước khi đi tiếp, chúng ta hãy xem xét nhanh các thông báo thực tế, để chúng ta có thể biết những gì thay đổi.
Bản thân các thông báo rất đơn giản. Yêu cầu, như đã thấy trong Liệt kê 5, chỉ yêu cầu số lượng các đoạn quảng cáo được phân loại trong hệ thống:
Liệt kê 5. Yêu cầu đầu tiên
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
<soapenv:Body>
<cms:getNumberOfArticles
xmlns:cms="http://daily-moon.com/cms">
<cms:category>classifieds</cms:category>
</cms:getNumberOfArticles>
</soapenv:Body>
</soapenv:Envelope>
|
Đáp ứng cũng không kém phần đơn giản, như bạn có thể thấy trong Liệt kê 6:
Liệt kê 6: Đáp ứng đầu tiên
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv=
"http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header />
<soapenv:Body>
<resp:numberOfArcticles
xmlns:resp="http://daily-moon.com/cms/"
xmlns:tns="http://ws.apache.org/axis2"
>42</resp:numberOfArcticles>
</soapenv:Body>
</soapenv:Envelope>
|
Trong cả hai thông báo này, Frances sẽ đặt thông tin bổ sung trong phần tử Tiêu đề (Header) cho máy chủ (hoặc ứng dụng khách) xử lý.
Vào lúc này, bất cứ ai có thể gửi một yêu cầu đến dịch vụ và nhận được một đáp ứng và đó là điều làm cho Rudy không an tâm. Rudy muốn dịch vụ đó được thiết lập sao cho chỉ có những người dùng được ủy quyền mới có thể nhận được thông tin và sao cho các đối thủ cạnh tranh không thể thu chặn các thông tin. Rudy suy nghĩ rằng đây là một hệ thống bằng chứng-theo- khái niệm tốt. Rudy thực sự càng lo ngại hơn về các hệ thống phức tạp hơn, chẳng hạn như những hệ thống thêm nội dung hoặc truy cập vào hệ thống kế toán. Nhưng các khái niệm cũng như nhau thôi.
Để cung cấp an ninh, Gene và Frances cần sử dụng mã hóa và công nghệ liên quan của nó, các chữ ký.