15 WebLogic JMSのセキュリティの理解
スレッド・ベースおよびオブジェクトベースのセキュリティ・モデルを使用してWebLogic JMSリソースを保護する方法を学習します。
WebLogic JMSリソースの保護
WebLogic JMSでは、JMS宛先へのアクセスを制限することでJMSリソースを保護できます。
デフォルトでは、すべてのユーザーがWebLogicサーバーまたはWebLogicクラスタ内のJMSリソースにアクセスできます。これには、リモート・アクセス権を持つユーザー、WebLogicサーバーまたはWebLogicクラスタ自体で直接実行しているユーザーが含まれます。WebLogic JMS宛先へのアクセスを制限するには、ユーザーのシステム・リソースに対するセキュリティ・ポリシーを作成し、ユーザーに必要なロールを付与する必要があります。セキュリティ・ロールとポリシーの詳細は、「WebLogicリソースの保護の概要」を、JMSで使用できるポリシーについては「Java Messaging Service (JMS)リソース」を参照してください。
JMSセキュリティに関する用語
WebLogic JMSでは、オブジェクトベース・セキュリティ(OBS)またはスレッド・ベースのセキュリティを使用して、保護されたWebLogic JMS宛先へのアクセス時にチェックされるユーザーを決定します。
2つのセキュリティ・アプローチの違いを調査する前に、JMSセキュリティのコンテキストで使用する一般的な用語をいくつか理解します。
- サブジェクト: WebLogicアプリケーション内のユーザーを表すセキュリティ・オブジェクト。
- プリンシパルおよび資格証明: それぞれユーザーのユーザー名およびパスワード。
- 資格証明: ユーザーのユーザー名とパスワードの組合せを表すために使用されることがよくあります。
スレッド・ベースのセキュリティでは、保護されたWebLogic JMS宛先がチェックするサブジェクトは、現在の呼出し側のスレッドから暗黙的に派生します。オブジェクトベースのセキュリティでは、サブジェクトは、呼出し側がJMS呼出しに使用しているオブジェクトに格納されたサブジェクトから暗黙的に派生します。一般に、WebLogicのセキュリティはスレッド・ベースです。次の各項では、これら両方の方法について説明します。
クライアントおよびサーバーでのスレッド・ベースのセキュリティの理解
デフォルトでは、保護されているWebLogic JMSリソースへのアクセスには、スレッド・ベースのセキュリティが利用されます。これにより、EJB、WebアプリケーションおよびRMIに対するJava EEの一般的なセキュリティ・モデルと同等のWebLogic JMSセキュリティの動作が提供されます。
- チェック済では、現在のスレッド内に暗黙的に格納されたセキュリティ・サブジェクト/ロールを使用します。
- チェックなしでは、JMS javax.jms
createConnection()
またはcreateJMSContext()
コールに渡すことができるユーザー名とパスワードを使用します。つまり、(1)からのスレッドのサブジェクトは、アプリケーションがオプションでcreateConnection()
またはcreateJMSContext()
に渡すことができるユーザー名およびパスワードより優先されます。
サーバー・アプリケーションに対するスレッド・ベースのセキュリティ
サーバー側アプリケーションでは、EJBおよびWebアプリケーション・スレッドのサブジェクトまたはロールを設定する方法は複数あります。『Oracle Fusion Middleware WebLogicセキュリティ・サービスによるアプリケーションの開発』を参照してください。サーバー側のWebLogic JMS送信および消費コールのスレッド・ベースのJMSセキュリティ・チェック動作をオーバーライドするには、「サーバー・アプリケーションにおけるオブジェクトベースのセキュリティの理解」を参照してください。
クライアント・アプリケーションに対するスレッド・ベースのセキュリティ
クライアント・アプリケーションの場合は、クライアント・アプリケーションでJNDIコンテキストが作成されると、現在のスレッドのサブジェクトが生成され、スレッドに暗黙的に配置されます。JNDIコンテキストは、SECURITY_PRINCIPAL
およびContext.SECURITY_CREDENTIALS
プロパティを使用して、資格証明をオプションで指定できます。
java.util.Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, url); // typical url: t3://example.com:7001
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.SECURITY_PRINCIPAL, "myusername");
env.put(Context.SECURITY_CREDENTIALS, "user_password");
javax.naming.InitialContext ic = new InitialContext(env); // throws an exception if user name/password is incorrect
// thread now implicitly has subject for the ic user name/password
ic.close();
// thread now has original subject from before the ic was created
クライアントが資格証明を指定せずにInitialContext
オブジェクトを作成する場合、次のようになります。
- 現在のスレッドにすでにあるサブジェクトは変更されていません。
- スレッドのサブジェクトがない場合は、匿名のサブジェクトであるとみなされます。
クライアント・プログラムが、InitialContext
オブジェクトの作成に使用したスレッドとは異なるスレッドにスレッドのサブジェクトを転送する必要がある場合、クライアント・プログラムはセキュリティAPIを使用してスレッドの現在のサブジェクトを格納し、その後このキャッシュされたサブジェクトを別のスレッドで使用できます。
// retrieve the subject that is implicitly store in the current thread
javax.security.auth.Subject subject =
weblogic.security.Security.getCurrentSubject();
...
// use the given subject to perform an action:
// if the action throws, return an exception
// if the action succeeds, return "OK"
static Object doSomethingAsSubject(javax.security.auth.Subject subject) {
try {
return weblogic.security.Security.runAs(subject,
new java.security.PrivilegedExceptionAction() {
public java.lang.Object run() throws Exception {
// do something or throw
return "OK";
}});
} catch (java.security.PrivilegedActionException e) {
return e;
} catch (Throwable t) {
return t;
}
}
javax.security.auth.Subject anon = new javax.security.auth.Subject();
クライアント側のWebLogic JMS送信および消費コールのスレッド・ベースのJMSセキュリティ・チェック動作をオーバーライドするには、「クライアントにおけるオブジェクトベースのセキュリティの理解」を参照してください。
オブジェクトベースのセキュリティの理解
WebLogic JMSクライアントでは、スレッド・ベースのセキュリティではなく、オブジェクトベースのセキュリティ(OBS)と呼ばれるより単純なセキュリティ・モデルをオプションで使用できます。このオプションはWebLogic 12.2.1.3で導入されたもので、マルチスレッド・クライアントでは、これを使用しないとスレッド間でスレッド・ベースのセキュリティ・サブジェクトを転送するための追加コードが必要になるため便利です。
次の各項では、オブジェクトベースのセキュリティを有効にする方法について説明します。
クライアントでのオブジェクトベースのセキュリティの有効化
オブジェクトベースのセキュリティ(OBS)を有効にすると、メッセージが送信され、コール元のスレッドの件名ではなく、JMSクライアントの初期化時に指定した資格証明に基づいてセキュリティ・チェックが消費されます。
OBSを有効にするには、OBS JNDI初期コンテキストを使用する必要があります。OBS初期コンテキストから取得されるOBS接続ファクトリを使用して作成されるWebLogic JMS送信者またはコンシューマは、デフォルトで、現在の送信者またはコンシューマ・スレッドに関連付けられたサブジェクトではなく、OBS初期コンテキストに関連付けられた資格証明を暗黙的に使用します。また、ユーザー名とパスワード資格証明がOBS接続ファクトリの標準のJMS createConnection()
またはcreateJMSContext()
コールにパラメータとして渡される場合、この新しい資格証明は、OBS初期コンテキストに関連付けられた資格証明よりも優先します。新しい資格証明を使用して、その接続またはJMSコンテキストで送信または消費を行います。
JMSクライアントの送信者およびコンシューマでOBSを有効にするステップ:
クライアントでのオブジェクトベースのセキュリティの制限
次に、OBSの制限事項のいくつかを示します。
- OBS初期コンテキストでは、
lookup()
コールのみをサポートし、それ以外の場合はNotSupported
例外をスローします。他のコールをサポートするコンテキストが必要な場合は、OBSを有効にしない2番目のコンテキストを作成します。 - OBS初期コンテキストは、WebLogicクライアントでのみサポートされ、WebLogicサーバーではサポートされません。ブリッジ、MDB、リソース参照などのWebLogic JMSサーバー機能と組み合せて、このようなコンテキストを使用しようとすると、例外がスローされます。これらのサーバー側JMS機能にはすでに、OBSに類似したセマンティクスを提供する独自のセキュリティ処理があるため、このような制限が存在します。
- OBS初期コンテキストが作成されると、初期コンテキストのユーザーは現在のスレッドに配置されません。これは
weblogic.jndi.WLInitialContextFactory
コンテキストとは異なります。
サーバー・アプリケーションでのオブジェクトベースのセキュリティの有効化
インバウンドおよびアウトバウンドJMSアプリケーションでオブジェクトベース・セキュリティ(OBS)を有効にする方法を学習します。
インバウンドJMSアプリケーションのオブジェクトベースのセキュリティ
- アプリケーション自体での指定。
ノート:
この方法の使用はお薦めしません。 - サービス自体での定義(メッセージング・ブリッジを使用すると、ユーザー名またはパスワードを構成できます)。
ノート:
この方法の使用はお薦めしません。 - アウトバウンドの場合と同様に、JMSリソースをJNDIにマップするJMSシステム・リソース・モジュールに外部JMSサーバーを使用して指定します。
- 資格証明が動的に構成可能であり、アプリケーション・ファイルまたは記述子ファイルにハードコードされていないことを確認します。
- ほぼすべてのインバウンドおよびアウトバウンドのユースケースに適用されるため、JMS資格証明を集中管理する方法として役立ちます。
アウトバウンドJMSアプリケーションのオブジェクトベースのセキュリティ
アウトバウンドWebLogic JMSコールを実行するサーバー・アプリケーションは、現在のスレッドで現在のセキュリティ・サブジェクトに優先するオブジェクトベースのセキュリティ・パターンを実現できます。これが機能するには、次のことを確認してください。
- JMS接続ファクトリの現在のJNDIロケーションをローカルJNDIにマップするには、次のようにします。
- JMSシステム・リソース・モジュールに外部JMSサーバーを構成します。
- 必要な権限を持つユーザーに対し外部JMSサーバーの資格証明を構成します。
- アプリケーション・コードで、JMSリソース参照を使用するか、JMS接続ファクトリのローカルJNDI名を参照するJMSコンテキストを挿入します。
ノート:
オブジェクトベースのセキュリティ・パターンやスレッドベースのセキュリティ・パターンが必要かどうかにかかわらず、サーバー・アプリケーションがリソース参照またはJMSコンテキスト・インジェクションを使用してJMS接続ファクトリを参照することは、一般的なベスト・プラクティスです。
前述の要件が満たされた後、WebLogicサーバーは、外部JMSサーバーに構成した資格証明を、特定のJMS接続ファクトリから発生したアウトバウンド送信コールまたは消費コールすべてにインジェクトします。