Oracle WebLogic Server 9.2によるWebサービスの保護

著者:Gary Ng、Matt Silver
06/05/2007

概要

Webサービスは、サービス指向アーキテクチャ(SOA)の急速な進化と普及にともない、現在ではITランドス ケープになくてはならない重要な存在となってきています。Webサービスの呼出し(リクエストおよびレスポンス)は、デフォルトでは、HTTPなどのプロ トコルを介してプレーン・テキストの形で送信されるようになっています。これにより、クライアントの相互運用性については幅広く確保することができます が、プレーン・テキストの送信には常にセキュリティ・リスクがつきまといます。ここでは、こうしたセキュリティ・リスクのいくつかを取り上げるとともに、 Oracle WebLogic Server(BEA WebLogic Server)のWebサービス・セキュリティを実装することでそれらのリスクを回避する方法について説明していきます。

この記事では、大きく2つのセクションに分けて説明を進めます。最初のセクションでは、メッセージの整合性、メッセージの機密保護、そして認証に関する概要を示し、 ポリシー・アノテーションを 使用してこの3つを実現する方法について簡単に説明します。2番目のセクションでは、基本的なサービスの構築について、例をあげながらチュートリアル形式 で解説します。また、メッセージの整合性、メッセージの機密保護、そして認証についても段階を追って説明していきます。

この文書は、Oracle WebLogic Server(BEA WebLogic Server)9.2での基本的なWebサービスの開発と、デジタル署名および暗号化などのセキュリティの基本概念について精通しているユーザーを対象としています。

Webサービスおよびセキュリティの概要

この項では、メッセージの整合性、機密保護、および認証をはじめとする、Webサービスのセキュリティに関するさまざまな側面の概要について説明していきます。ここで取り上げる内容について、すでに十分な知識をお持ちの場合は、 チュートリアルにジャンプしてください。

Webサービスの基本

基本的なWebサービスは、次の2つの要素で構成されています。

  • サービス・プロバイダ — サービス・コンテナによって提供される実際のサービス
  • サービス・コンシューマ — ローカルまたはリモートで、サービスを呼び出すクライアント

この記事では、サービス・プロバイダとは、WebLogic Server 9インスタンス上でデプロイ(および実行)されているJavaベースのWebサービスを指すものとします。また、サービス・コンシューマは、ローカルまた はリモートのコンピュータ上で、それぞれのJava Virtual Machine(JVM)で実行されているJavaクライアントを指します。

Webサービスのやりとりは、クライアントがサービス・プロバイダからWSDLファイルを取得することで開始さ れます。WSDLファイルにはサービスと呼出しに関する情報が含まれており、この情報を使用することで、クライアントからのサービスの呼出しが可能となり ます。WSDLファイルを取得すると、クライアントでは、プレーン・テキストによるSOAP リクエスト・メッセージ(呼び出すサービスやパラメータなどの情報を含む)をプロバイダに送信し、Webサービスを呼び出すことができます。プロバイダ側では、メッセージを受信すると、それを解析してから処理をおこないます。処理が完了すると、プロバイダはプレーン・テキストによるSOAP レスポンス・メッセージ(あらゆる結果データを含む)をクライアントに返します。

こうした点からわかるように、デフォルトの送信プロトコルにはプレーン・テキストのSOAPが使用されていま す。ただし、このプロトコルはセキュリティ上のあらゆる形の攻撃に対してきわめて脆弱です。この問題を解決するには、WS-Securityを取り入れる 必要があります。

WS-Security

WS-Securityは、OASIS(Organization for the Advancement of Structured Information Standards)によって定義および管理されているセキュリティの標準で、Webサービスで対応する必要があるセキュリティの3つの領域についてまと めたものです。とくに、リクエスト・メッセージとレスポンス・メッセージの交換の際には、以下の点について考慮することが求められています。

  1. メッセージの整合性
  2. メッセージの機密保護
  3. 認証

メッセージの整合性とは、メッセージが一意の送信元から送られてきたものであること、メッセージが送信中に改ざんされていないことの2点が確認されている状態を指します。これは、送信SOAPメッセージに 署名す ることで可能となります。通常、署名には、メッセージの一意のハッシュであるデジタル証明書(暗号化された一連のプレーン・テキスト)を添付するという方 法をとります。受信サイドでは、受信したメッセージの内容をハッシュと比較し、両者が一致していれば、送信中に改ざんされていないことになります。

メッセージの機密保護とは、送信されたメッセージを該当の受信者だけが理解できるようにすることです。これを実現するには、送信SOAPメッセージの暗号化をおこないます。

認証は、Webサービスの呼出しを、認証を受けたクライアントだけがおこなえるようにすることです。これを実現するには、クライアントに対して、WS-Securityの トークン(ユー ザー名/パスワード、X.509証明書、Kerberosチケット認証など)をサービスの呼出しに追加するように求めます。呼出しに組み込まれたトークン は、リクエストの際にサーバーのセキュリティ・システムによって認証され、認証が有効な場合のみ、そのサービスに対するリクエストの処理が進められます。

デフォルトのSOAP仕様は、単独ではこれらの機能に対応することはできません。各機能に対するサポートを手作 業で(プログラミングにより)追加することはできますが、作業に長い時間がかかるうえ、エラーも発生しやすくなります。しかし、WS-Securityの 仕様には、SOAPヘッダーのもつ拡張性を利用して、これらの機能を実装する方法が示されています。ほんの少しコーディングをおこなえば、Webサービス のメッセージ交換における整合性、機密保護、および認証の機能を追加することができるのです。

WebLogic Server 9.2におけるセキュリティの概要

WebLogic Server 9.2は、WS-Security標準を完全にサポートしています。つまり、Webサービス・プロバイダとクライアント・コードの記述方法に若干の変更を加えることで、メッセージの整合性、機密保護、および認証の実現が可能となります。

WebLogic ServerのAPIを使用すると、セキュリティを簡単に確保することができます。セキュリティの3つの側面すべてを実現するための基本的な手順は、以下のようになります。

  1. サービスをセキュリティなしでコーディングし、テストする
  2. 整合性と機密性を確保するため、クライアントおよびサーバーの キーストアを設定する
  3. サービスのソース・コードにアノテーションをつけて、サービスにセキュリティを追加する
  4. セキュリティつきのサービスを構築してデプロイする

キーストアは、本質的には証明書をまとめたもので、これにより、安全性を確保しながらサーバーを一意に特定することができます。キーストアの作成には、JDKに同梱されている keystoreコマンドライン・ツールを使用します。また、WebLogic Serverの管理コンソールを使用すると、キーストアをWebLogic Serverにインポートできます。

セキュリティの3つの側面については、任意に組み合わせて使用することができます。たとえば、整合性のみを実現することも、整合性と機密性の2つ、または3つすべてを実現することもできます。この記事では、各側面の実現方法について説明します。

ポリシーとセキュリティの概要

WebLogic Server 9.2では、Webサービスのセキュリティ管理にポリシー・ファイルを使用します。ポリシー・ファイルとは、WebLogic Serverでセキュリティに関する各種の側面を実現する方法が記述されたXMLファイルです。Webサービスはポリシー・ファイルとあわせてパッケージ 化され、そのポリシー・ファイルはデプロイの際に該当サービスの生成済みWSDLファイル内に組み込まれます。クライアントがサービスを呼び出す場合は、 まず、そのサービスのWSDLファイルをポリシー情報とあわせて取得する必要があります。

BEAポリシー・ファイル

WebLogic Serverのセキュリティ機能では、次の3つのポリシー・ファイルを使用します。

  1. Sign.xml - メッセージの整合性を確保する場合に必要なファイルで、クライアントとサーバーの間でおこなわれるメッセージへの署名方法を決定するための設定情報が含まれます。
  2. Encrypt.xml - メッセージの機密保護をおこなう場合に必要なファイルで、クライアントとサーバーの間でおこなわれるメッセージ暗号化の方法を決定するための設定情報が含まれます。
  3. Auth.xml - 認証をおこなう場合に必要なファイルで、クライアントおよびサーバー(またはそのいずれか)の認証方法を決定するための設定情報が含まれます。

これらのポリシー・ファイルについても、デプロイのときにWebサービスと一緒にパッケージ化する必要があります。いうまでもありませんが、必要となるの は各サービスで必要なセキュリティの側面についてのポリシー・ファイルのみです。たとえば、メッセージの機密保護だけが必要な場合、パッケージ化する必要 があるのは Encrypt.xmlのみで、ほかの2つのファイルは必要ありません。

WS-Policyファイルの作成

次に問題となるのは、これらのポリシー・ファイルをどう作成するかという点です。ポリシー・ファイルのドキュメ ントとスキーマは、BEAから入手できます。また、任意のテキスト・エディタを使用して手作業で記述することもできます。ただし、ユーザーにとっては嬉し いことに、 これらのポリシー・ファイルを自動的に生成する機能もあります。この機能を使用すれば、ソース・コードに適切なアノテーションをつけて jwsc Antタスクを実行すると、必要な sign.xml/encrypt.xml/auth.xmlファイルが適宜生成されます。自動生成されたこれらのファイルは、自動的にデプロイ可能なWebサービスにパッケージ化されます。

通常は、これらの自動生成されたポリシー・ファイルで十分に対応できます。ファイルの内容には、元のソース内に 配置されたアノテーションが反映されます。このため、Webサービスを保護する場合、開発者が注意する必要があるのは、ソース・コードにつけられているア ノテーションが適切であるかどうかを確認することだけです。開発者はポリシー・ファイルの作成については考える必要もありません。

ただし、場合によっては自動生成されたポリシー・ファイルが使用できない状況が発生し、セキュリティ・フレーム ワークへの追加のカスタマイズが必要となることもあります。このような処理が必要となる例としては、デフォルトでは自動生成されたポリシーによってメッ セージ全体が暗号化されるように設定されているにもかかわらず、本文全体ではなくメッセージの一部分のみが選択的に暗号化されるようにしなくてはならなく なった場合などがあげられます。こうした場合、開発者はポリシー・ファイルを手作業で作成し、そのあとソース・コードにアノテーションをつけて手作業で作 成したポリシー・ファイルを使用するようにします。これにより、ポリシー・ファイルの自動生成はおこなわれなくなります。ただし通常は、自動生成されたポ リシーで十分に対応可能であるため、このような処理が必要となることはありません(作業的にもはるかに負担が少ないという利点もあります)。

セキュリティに関する注釈

ご承知のとおり、一般的なWebサービスの開発は、Javaコンポーネント(POJO、EJBなど)をコーディングし、そのあとJava Web Service(JWS)を生成するためにコードに アノテーションをつけるという形でおこないます。各サービスのセキュリティを確保するには、 @Policiesおよび @PolicyのアノテーションをJWSに追加します。

たとえば、以下のようなアノテーションをJWSに追加することができます。

@Policies({

  @Policy(uri="policy:Sign.xml"),

  @Policy(uri="policy:Encrypt.xml"),

  @Policy(uri="policy:Auth.xml")

})

上記のアノテーションを使用するのは、Webサービスで整合性、機密保護、認証の3つの側面すべてが求められている場合です。各アノテーションには、任意で追加できる複数の属性があります。この追加属性については、後ほど説明します。

セキュリティの基本についての説明はひととおり終わりましたので、次にWebサービスを作成してセキュリティ関連の各種機能を追加する方法について、例をあげて解説していきます。

メッセージ・レベルのセキュリティに関するチュートリアル

このチュートリアルでは、"Hello World"タイプの簡単なサービスを作成し、そこにセキュリティの機能を追加します。ここでは、Webサービス・コンテナにはWebLogic Serverを使用し、開発環境については無償で使用できるオープンソースの統合開発環境(IDE)であるWeb Tools Platform(WTP)を使用します。このプロセス全体を構成する基本手順は、以下のようになります。

  1. WebLogic Server環境の構成
  2. WTPの構成
  3. TCP/IPモニターの有効化
  4. シンプルなHello Worldサービスの構築、生成、およびデプロイ
  5. Hello Worldサービス用のシンプルなクライアントの構築とテスト
  6. クライアントの鍵の生成
  7. サーバーのトラストストアへのクライアント証明書のインポート
  8. サービスへの整合性の追加
  9. サービスへの機密保護の追加
  10. サービスへの認証の追加

上記の手順には、この記事で取り上げている内容とは直接関係のないものも含まれています(WebLogic Server環境の構成など)。これらの手順の詳細にはここでは触れませんので、具体的な実行方法については関連のBEAドキュメントを参照してください。

WebLogic Server環境の構成

まだインストールされていない場合は、WebLogic Serverをインストールします。BEAの構成ウィザードを使用し、管理ユーザー名を weblogic、パスワードを passwordとして、新規のWebLogicドメインを作成します。特別な設定(クラスタ、管理サーバー、JDBC、JMSなど)は必要ないため、これらの設定段階については省略します。ドメインに WSTestDomainという名前をつけ、配置先については、デフォルトのディレクトリをそのまま使用します。これで、新規ドメインのディレクトリが作成されます。Windowsベースのオペレーティング・システムを使用している場合は、ドメインのディレクトリは、 C:\bea\user_projects\domains\WSTestDomainのようになります。このチュートリアルでは、このディレクトリを DOMAIN_DIRと呼びます。

WTPの構成

このチュートリアルでは、幅広く利用されているオープンソースのEclipse IDEを、Web Tools Platform(WTP)プラグインとあわせて使用します。お持ちでない場合は、 http://download.eclipse.org/webtools/downloads/からダウンロードしてください。 このチュートリアルは、WTP/Eclipseについて十分な知識のあるユーザーを対象としていますので、あまり使い慣れていない場合は、Eclipse WTPのヘルプ文書を参照して理解を深めておくことをお勧めします。

ここでのWTPの使用は必須ではなく、任意のIDEを使用できます。(また、IDEを使用できない場合は、コマ ンド・ラインとテキスト・エディタを基盤とした環境でも対応可能です。ただし、テキストベースの環境ではメッセージのトラフィックを調べることはできない ため、そのために別のツールが必要となります。)このチュートリアルでWTPを選択したのは、幅広く使用されているオープンソース(無償でダウンロードし て使用できる)のIDEであること、そして実際にセキュアなメッセージが送信されていることを確認できるTCP/IPモニター機能に対応していることの2 つの理由からです。

WTPをインストールするには、通常、この製品が含まれたZIPファイルを取得し、それをファイル・システム上で解凍します。この処理が終わったら、WTPを起動します。プロンプトが表示されたら、新しい作業領域のディレクトリを選択します(例: C:\workspaces)。このチュートリアルでは、ここで選択した作業領域のディレクトリを WORKSPACE_DIRと呼びます。

WTPの起動後に、デフォルトのJVMを、WebLogic Serverに同梱されているJVMに変更する必要があります。Javaパースペクティブに切り替えます(Javaパースペクティブが有効となっていない場合)。メニューから「 Window」→「 Preferences」を選択します。左側のペインで「 Java」を展開し、その下の「 Installed JREs」を選択します。BEAにより提供されているJDKを追加する必要があります。右側のペインで、「 Add...」をクリックします。「 Browse...」ボタンをクリックしてBEA JDKのホーム・ディレクトリ(通常は C:\bea\jdk150_04)に移動し、「 OK」をクリックします。これで、両方のJREが一覧に表示されます。新しく追加したJRE(jdk150_04)のボックスをチェックして、「 OK」をクリックします。再構築を求めるプロンプトが表示されたら、「 Yes」をクリックします。

これでWTPの構成が終わりましたので、モニターを有効化する手順に移ります。

TCP/IPモニターの有効化

セキュリティが希望どおりに機能しているかをテストするため、WTPのTCP/IPモニター機能を有効化しま す。これにより、クライアントとサービスの間で交換されるメッセージのインターセプトと検証が可能となります。モニターを有効化する場合、WTP内から WebLogic Serverを示すサーバー・インスタンスを定義する必要があります。そのためには、まず最初に実行中のWebLogic Serverインスタンスをすべて停止します( stopWebLogic.cmd スクリプトを使用)。

WTPで、サーバー・ビューを開きます。このビューの上で右クリックして、「 New」→「 Server」の順に選択します。表示されたポップアップ画面で「 BEA Systems」を展開して、「 Generic BEA WebLogic Server v9.2」を選択します。「 Next」をクリックします。JREドロップダウン・メニューで、「 jdk150_04」を選択してから「 Next」をクリックします。

Domain Directoryを、 DOMAIN_DIRを指すように変更します。 Start Scriptフィールドと Stop Scriptフィールドを、 DOMAIN_DIR/bin内の該当する開始スクリプトと停止スクリプト( startWebLogic.cmd および stopWebLogic.cmd スクリプト)を指すように変更します。 Passwordフィールドを passwordに変更してから「 Finish」をクリックします。 サーバー・ビューに戻り、新しく一覧に表示された「 Generic BEA WebLogic Server v9.2」を右クリックして、「 Monitoring」→「 Properties」を選択します。表示された Monitoring Portsポップアップ・ウィンドウで、「 Add...」をクリックします。そのあと表示されたポップアップ・メニューでは、そのまま「 OK」をクリックします。新しいモニター・ポート(7001/7002)が表示されます。このポートを選択して「 Start」をクリックします。「 OK」をクリックします。

この時点で、ポート7002に送信されたトラフィックはモニターに渡され、(正しい)サーバー・ポート7001に転送される前に、モニター上に表示されます。これにより、受信と送信のトラフィックをチェックすることができます。

シンプルなHello Worldサービスの構築、生成、およびデプロイ

次に、JWSで基本的なWebサービスを作成します。ここで作成するのは、文字列が渡されると適切なあいさつのメッセージを返すだけの、非常にシンプルなサービスです。作成後、サービスを構築してデプロイします。

WTPで、 WSTestという名前の新規Javaプロジェクトを作成します。このプロジェクトでは、 com.test.HelloWorldServiceというJavaクラスを新規に作成します。

ここでは、プロジェクトにBEA weblogic.jarライブラリを追加して、コードが適切にコンパイルされるようにする必要があります。まず、「 WSTest」プロジェクトを右クリックして、「 Properties」を選択します。 Propertiesウィンドウが表示されます。左側のペインで「 Java Build Path」をクリックします。右側のペインの「 Libraries」をクリックします。「 Add External JARs」をクリックします。表示された JAR SelectionウィンドウでWebLogic Serverライブラリ・フォルダに移動し、「 weblogic.jar」を選択します(通常はC:\bea\weblogic92\server\lib\weblogic.jarのような形で表示されています)。「 Open」をクリックします。これで、 weblogic.jarライブラリの1つとして表示されます。「 OK」をクリックします。

HelloWorldService.javaのソースを以下のように設定します。

package com.test;



import javax.jws.*;

@WebService(name = "HelloWorldPortType", 

                serviceName = "HelloWorldService", 

                targetNamespace = "http://mycompany.com")

public class HelloWorldService {



        public String sayHello(String name) {

                return "Hello there, " + name;

        }



}

アノテーションとして @WebServiceを使用すると、そのクラスがWebサービスとして定義されます。また、ここで使用しているビジネス・メソッド sayHelloは、単一の文字列を引数として取り、あいさつのメッセージを返します。

次の手順では、Antスクリプトを作成し、サービスの構築とデプロイをおこないます。プロジェクト・ディレクトリ( WORKSPACE_DIR/WSTest)で build.xmlという名前のテキスト・ファイルを作成し、その内容を以下のように設定します。

<project default="build">

<taskdef name="jwsc"

         classname="weblogic.wsee.tools.anttasks.JwscTask"  
                            
                          

<target name="jwsc">

<jwsc

srcdir="."

destdir="."

>

<jws file="com/test/HelloWorldService.java" />

</jwsc>

</target>

<target name="build" depends="jwsc">

<wldeploy action="deploy"

name="HelloWorldService"

source="com/test/HelloWorldService.war"

user="weblogic"

password="password"

adminurl="t3://localhost:7001/"

targets="AdminServer"/>

</target>

</project>

ここでは、とくに注意する点はありません。実際のサービスを構築するターゲットと、サービスをデプロイするターゲットの2つが定義されます。

これで、サービスを実行する準備が整いました。まず、WSTestDomainで管理サーバーを起動します。(WTPの Serversビューから「 Generic BEA WebLogic Server v9.2」を右クリックし、「 Start」をクリックすると、起動できます。) コマンド・シェル・ウィンドウを開き、 DOMAIN_DIR/bin内にある setDomainEnvスクリプトを実行します。次に、同じコマンド・シェル・ウィンドウで、 cdを実行して WORKSPACE_DIR/WSTestに移動します。このディレクトリで、コマンド antを実行します。

スクリプトを実行すると、 BUILD SUCCESSFULメッセージが表示されます。コマンド・シェルは、またあとで必要となるので、ここでは終了しないでください。これで、サービスの構築とデプロイが終わり、実行されているはずです。ブラウザを開いて、 http://localhost:7001/HelloWorldService/HelloWorldService?WSDLに移動します。開いたページに、サービスのWSDLファイルが表示されています。このページは、このチュートリアル全体でクライアント・プロキシを生成するために必要となるため、ブックマークに追加しておきます。ここではブラウザを使用して、このページを HelloWorldService.wsdlとして WORKSPACE_DIR/WSTestディレクトリに保存します(WSDLファイル名の最後に、".xml"拡張子をつけないようにしてください)。

ページ: 1, 2, 3

次ページ >>