Oracle® Fusion Middleware Oracle WebLogic Server Web サービスのセキュリティ 11g リリース 1 (10.3.1) B55522-01 |
|
戻る |
次へ |
この章では、Web サービス セキュリティをコンフィグレーションする方法について説明します。
アクセス制御セキュリティとは、アクセスできるユーザを制御するように Web サービスをコンフィグレーションし、クライアントがオペレーションの 1 つを呼び出したときに Web サービスに対して HTTP/S またはユーザ名トークンを使用して自身を認証するようにクライアント アプリケーションをコーディングすることです。
Web サービスのアクセス制御セキュリティを指定するには、JWS ファイル内で、以下のアノテーションを 1 つ以上、使用します。
weblogic.jws.security.RolesAllowed
weblogic.jws.security.SecurityRole
weblogic.jws.security.RolesReferenced
weblogic.jws.security.SecurityRoleRef
weblogic.jws.security.RunAs
注意 : @weblogic の.security.jws.SecurityRoles と weblogic.security.jws.SecurityIdentity JWS アノテーションは WebLogic Server 9.1 から非推奨となっている。 |
以下では、これらのアノテーションを使用してアクセス制御セキュリティを有効化する高度な手順について説明します。手順の詳細についてはこの章の後の節で説明します。
注意 : 次の手順では、WebLogic Web サービスを実装する JWS ファイルがすでに作成されていることを前提として、そのファイルをアクセス制御セキュリティの設定で更新します。Web サービスを反復的に開発するのに Ant ビルド スクリプトを使用すると思われて、あなたが作業 build.xml ファイルを持っていて新しい情報でアップデートすることができます。さらに、保護されていない Web サービスを呼び出すクライアント アプリケーションも用意されているものとします。これらの前提条件が満たされていない場合は、「JAX-RPC を使用して WebLogic サービス入門」を参照してください。 |
必要に応じて、適切なレベル (クラスまたはオペレーション) で、@weblogic.jws.security.RolesAllowed
、@weblogic.jws.security.SecurityRole
、@weblogic.jws.security.RolesReferenced
または @weblogic.jws.security.SecurityRoleRef
アノテーションを追加し、JWS ファイルを更新します。
「セキュリティ関連アノテーションでの JWS ファイルの更新」を参照してください。
必要に応じて @weblogic.jws.security.RunAs
JWS アノテーションを追加することで、WebLogic Server が実際に Web サービスを呼び出すユーザに割り当てられているロールではなく、特定のロールを使用して Web サービスを内部で実行することを指定します。
「@RunAs アノテーションでの JWS ファイルの更新」を参照してください。
必要に応じて @weblogic.jws.security.UserDataConstraint
JWS アノテーションを追加することで、Web サービスが HTTPS を使用して呼び出し可能であること、または呼び出される必要があることを指定します。
詳細については、「UserDataConstraint による転送レベルのセキュリティのコンフィグレーション : 主な手順 (JAX-RPC のみ)」を参照してください。この節ではまた、SSL を使用するようにクライアント アプリケーションを更新する方法についても説明します。
通常の反復的な開発プロセスの一部として、Web サービスを再コンパイルして再デプロイします。
『JAX-RPC を使用した WebLogic サービス入門』の「WebLogic Web サービスの開発」を参照してください。
Administration Console を使用し、有効な WebLogic Server ユーザが存在しなければ、それを作成します。ユーザのロールへのマッピングが外部で行われている場合は、さらに Administration Console を使用して @SecurityRole
アノテーションで指定されているロールを作成し、ユーザをロールにマッピングします。
注意 : Web サービスを呼び出すことができるすべてのユーザを記載するためにあなたの JWS ファイルの @SecurityRole アノテーションの mapToPrincipals 属性を指定しない場合、ロールへのユーザのマッピングは外部的に定義されます。 |
『ロールおよびポリシーによる WebLogic リソースの保護』の「ユーザ、グループ、およびセキュリティ ロール」を参照してください。
HttpTransportInfo
WebLogic API を使用し、Service
オブジェクトの作成時に適切なユーザおよびパスワードを指定するよう、クライアント アプリケーションを更新します。
「サービス オブジェクト作成時のユーザ名とパスワードの設定」を参照してください。
build.xml
ファイル内の clientgen
Ant タスクを更新して、有効な WebLogic ユーザのユーザ名およびパスワード (Web サービスで @RolesAllowed
アノテーションを使用する場合)、および WebLogic Server のものを含む信頼性のある証明書のリストが格納されたトラストストア (@UserDataConstraint
を指定する場合) を指定します。
これは以下のサンプルに示すように、clientgen
Ant タスクに標準の Ant のネストされた要素である <sysproperty>
を追加して、必要な Java プロパティに key
属性を設定することで指定できます。
注意 : このサンプルではユーザ名とパスワードをハードコード化しており、両者を要求することでセキュリティを高めています。SSL を使用する必要がある場合、@RolesAllowed と trustStore のためのユーザ名とパスワードを必要とします。 |
<clientgen wsdl="http://example.com/myapp/myservice.wsdl" destDir="/output/clientclasses" packageName="myapp.myservice.client" serviceName="StockQuoteService" > <sysproperty key="javax.net.ssl.trustStore" value="/keystores/DemoTrust.jks"/> <sysproperty key="weblogic.wsee.client.ssl.stricthostchecking" value="false"/> <sysproperty key="javax.xml.rpc.security.auth.username" value="juliet"/> <sysproperty key="javax.xml.rpc.security.auth.password" value="secret"/> </clientgen>
クライアントサイドのコンポーネントを再生成して、Java コードを通常どおりに再コンパイルします。
JWS ファイルで WebLogic 固有の @weblogic.jws.security.RolesAllowed
アノテーションを使用し、Web サービスの呼び出しが許可されているロールをリストする @weblogic.jws.security.SecurityRoles
アノテーションの配列を指定します。これら 2 つのアノテーションは、クラス レベルまたはメソッド レベルのいずれでも指定できます。クラスレベルで設定した場合、ロールはすべてのパブリック オペレーションに適用されます。このアノテーションをメソッド レベルで指定することで、特定のオペレーションにロールを追加できます。
@SecurityRole
アノテーションには、以下の 2 つの属性があります。
ロール
Web サービスを呼び出すことができるロールの名前です。
mapToPrincipals
はロールにマップするユーザのリストです。この属性で 1 人以上のユーザを指定した場合、ユーザとロール間のマッピングを外部で作成 (通常、これには Administration Console を使用) する必要はありません。ただし、この属性で指定されるマッピングは、Web サービスのコンテキスト内のみに適用されます。
@RolesAllowed
アノテーションは、属性を持ちません。
また、@weblogic.jws.security.RolesReferenced
アノテーションを使用して、既存のロールへの参照をリストする @weblogic.jws.security.SecurityRoleRef
アノテーションの配列を指定することもできます。たとえば、ロール manager
にすでに Web サービスの呼び出しが許可されている場合は、mgr
ロールの manager
ロールへのリンクを指定でき、mgr
にマップされるユーザも Web サービスを呼び出せるようになります。これら 2 つのアノテーションは、クラス レベルのみで指定できます。
@SecurityRoleRef
アノテーションには、以下の 2 つの属性があります。
role
はロール参照の名前です。
link
Web サービスを呼び出すことができる既に指定されたロールの名前です。この属性の値は、同じ JWS ファイルで指定されている @SecurityRole annotation
の role
属性の値に対応します。
@RolesReferenced
アノテーションは、属性を持ちません。
次の例では、この節で説明されているアノテーションの JWS ファイルでの使い方を示します。該当する個所は太字で表示しています。
package examples.webservices.security_roles; import javax.jws.WebMethod; import javax.jws.WebService; // WebLogic JWS アノテーション import weblogic.jws.WLHttpTransport; import weblogic.jws.security.RolesAllowed; import weblogic.jws.security.RolesReferenced; import weblogic.jws.security.SecurityRole; import weblogic.jws.security.SecurityRoleRef; @WebService(name="SecurityRolesPortType", serviceName="SecurityRolesService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="security", serviceUri="SecurityRolesService", portName="SecurityRolesPort") @RolesAllowed ( { @SecurityRole (role="manager", mapToPrincipals={ "juliet","amanda" }), @SecurityRole (role="vp") } ) @RolesReferenced ( @SecurityRoleRef (role="mgr", link="manager") ) /** * この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な * Java クラス実装の WebLogic Web サービスの基 *本となる */ public class SecurityRolesImpl { @WebMethod() public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } }
この例では、manager
、vp
、および mgr
ロールのみが、Web サービスの呼び出しを許可されると指定する方法を示しています。mgr
ロールは、実際には manager
ロールへの参照です。Web サービスのコンテキスト内で、ユーザ juliet
および amanda
は manager
ロールにマップされます。vp
ロールにマップされるユーザがないので、WebLogic Server セキュリティ レルムを更新するためには、通常 Administration Console を使用して、外部でマッピングが行われることが前提です。
これらのアノテーションに関する参考情報については、『WebLogic Web サービス リファレンス』の「JWS アノテーション リファレンス」を参照してください。
Web サービスが常に特定のロールとして実行されることを指定するには、JWS ファイル内で WebLogic 固有の @weblogic.jws.security.RunAs
アノテーションを使用します。これはつまり、Web サービスを最初に呼び出すユーザが誰であろうと、またそのユーザがどのロールにマップされていようと、サービスは指定されたロールとして内部で実行されるということです。
@RunAs
アノテーションは、クラス レベルのみで指定できます。このアノテーションには次の属性があります。
role
は Web サービスが走るはずであるロールです。
mapToPrincipal
ロールにマップする主要なユーザです。
次の例では、@RunAs
アノテーションの JWS ファイルでの使い方を示します。該当する個所は太字で表示しています。
package examples.webservices.security_roles; import javax.jws.WebMethod; import javax.jws.WebService; // WebLogic JWS アノテーション import weblogic.jws.WLHttpTransport; import weblogic.jws.security.RunAs; @WebService(name="SecurityRunAsPortType", serviceName="SecurityRunAsService", targetNamespace="http://example.org") @WLHttpTransport(contextPath="security_runas", serviceUri="SecurityRunAsService", portName="SecurityRunAsPort") @RunAs (role="manager", mapToPrincipal="juliet") /** *この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な * WebLogic Web サービスの基本となる * */ public class SecurityRunAsImpl { @WebMethod() public String sayHello(String message) { System.out.println("sayHello:" + message); return "Here is the message: '" + message + "'"; } }
Web サービスの保護に @RolesAllowed
JWS アノテーションを使用する場合、指定されたロールだけが Web サービス オペレーションの呼び出しを許可されます。つまり、保護されている Web サービスを呼び出すクライアント アプリケーションで Service
オブジェクトを作成する際には、ロールにマップするユーザのユーザ名およびパスワードを指定する必要があります。
WebLogic Server では、ユーザ名およびパスワードを設定して Service
コンストラクタに渡すための HttpTransportInfo
クラスが用意されています。以下の例は、スタンドアロン Java クライアントから Web サービスを呼び出す標準的な方法 (『JAX-RPC を使用した WebLogic Web サービスの開始』の「Web サービスの呼び出し」を参照) に基づいていますが、同時に、HttpTransportInfo
クラスを使用してユーザ名およびパスワードを設定する方法も示しています。太字の箇所については、サンプルの後で説明します。
package examples.webservices.sec_wsdl.client; import weblogic.wsee.connection.transport.http.HttpTransportInfo; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import javax.xml.rpc.Stub; /** * SecWsdlService Web サービスの sayHello オペレーション * を呼び出す簡単なスタンドアロンのクライアント アプリケーション * * @author Copyright © 1996, 2008, Oracle およびその関連会社。 * All rights reserved. */ public class Main { public static void main(String[] args) throws ServiceException, RemoteException{ HttpTransportInfo info = new HttpTransportInfo(); info.setUsername("juliet".getBytes()); info.setPassword("secret".getBytes()); SecWsdlService service = new SecWsdlService_Impl(args[0] + "?WSDL", info); SecWsdlPortType port = service.getSecWsdlPort(); try { String result = null; result = port.sayHello("Hi there!"); System.out.println( "Got result: " + result ); } catch (RemoteException e) { throw e; } } }
上記の例で注目すべき主な点は以下のとおりです。
クライアント アプリケーションに HttpTransportInfo
クラスをインポートする。
import weblogic.wsee.connection.transport.http.HttpTransportInfo;
HttpTransportInfo
クラスの setXXX()
メソッドを使用して、ユーザ名およびパスワードを設定する。
HttpTransportInfo info = new HttpTransportInfo(); info.setUsername("juliet".getBytes()); info.setPassword("secret".getBytes());
この例では、パスワード secret
を伴うユーザ juliet
は有効な WebLogic Server ユーザであり、Web サービスの @RolesAllowed
JWS アノテーションで指定されたロールにマップ済みであることが前提となっています。
プロキシを使用して Web サービスにアクセスしている場合、Java コードは以下のようになります。
HttpTransportInfo info = new HttpTransportInfo(); Proxy p = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, Integer.parseInt(proxyPort))); info.setProxy(p); info.setProxyUsername(user.getBytes()); info.setProxyPassword(pass.getBytes());
標準的な WSDL の 1 番目の引数に加えて、ユーザ名およびパスワードが含まれている info
オブジェクトを 2 番目の引数として Service
コンストラクタに渡す。
SecWsdlService service = new SecWsdlService_Impl(args[0] + "?WSDL", info);
保護されていない Web サービスの呼び出しに関する全般的な情報については、『JAX-RPCを使用した WebLogic Web サービスの開始』の「Web サービスの呼び出し」を参照してください。