Oracle Containers for J2EE
セキュリティ・ガイド
10g(10.1.3.4.0) B50832-01 |
|
この章では、Enterprise Information System(EIS)接続にリソース・アダプタを使用するときの、セキュリティ上の注意事項とセキュリティおよび認証の構成方法について説明します。
内容は次のとおりです。
J2EEアプリケーションとEIS間での通信の安全を保証するため、J2EE Connector Architectureでは、アプリケーション・コンポーネントが、EISへの確立済接続にJAASサブジェクトを関連付けできるようになっています。これを実現できるようにするため、J2EE Connector Architectureのセキュリティ規約は、標準のJAASでも使用できるようになっています。次の各項で、概要を示します。
J2EE Connector Architectureのセキュリティ規約は、アプリケーション・サーバーとリソース・アダプタ間のものであり、接続管理規約を安全な接続に関する機能で拡張したものです。このセキュリティ規約は、標準のJAASインタフェースをサポート対象としているため、特定のセキュリティ・フレームワークまたはメカニズムに依存しないようになっています。具体的には、このセキュリティ規約には次の機能が含まれています。
このセキュリティ規約のサポート対象となる具体的な認証メカニズムは、次の2つです。
セキュリティ規約にある機能で使用される主要インタフェースは、次のとおりです。
javax.security.auth.Subject
java.security.principal
javax.security.auth.spi.LoginModule
javax.resource.spi.security.PasswordCredential
このJ2EE Connector Architectureクラスは、パスワード付きのBasic認証用のユーザー名とパスワードのペアを表します。
org.ietf.jgss.GSSCredential
(J2SEバージョン1.4)このインタフェースは、Kerberosバージョン5認証に使用できる汎用資格証明オブジェクトを表します。(これは、非推奨のJ2EE Connector Architecture javax.resource.spi.security.GenericCredential
インタフェースにかわるものです。)
J2EEアプリケーションからEISへのサインオンは、アプリケーション・コンポーネントまたはJ2EEコンテナ(OC4J)によって管理できます。コンポーネント管理サインオンはプログラムで設定する必要があり、OC4J固有の構成を伴いません。コンテナ管理サインオンは、プログラミングの必要のない、OC4J固有の構成を使用した宣言的な方法か、またはOC4J固有の構成とプログラミングを組み合せたプログラム的な方法により、設定できます。プログラムによるコンテナ管理サインオンでは、プリンシパル・マッピング・クラスまたはJAASログイン・モジュールを使用できます。
次のリストは、コンポーネント管理サインオンとコンテナ管理サインオンに必要な設定のオプションとタイプをまとめたものです。各レベルの箇条書き記号は選択肢を表します。
web.xml
またはejb-jar.xml
内のApplication
の<res-auth>
設定が必要です。サインオンの設定はプログラムで行います。OC4J固有の構成はありません。
web.xml
またはejb-jar.xml
内のContainer
の<res-auth>
設定が必要です。サインオンの設定は宣言またはプログラムによって行います。次に示すように、各コンテナ管理サインオン・モードでOC4J固有の構成を使用します。
oc4j-ra.xml
ファイルの<security-config>
要素にuse="none"
として反映されます。
<security-config>
要素に、use="principal-mapping-entries"
として、該当するサブ要素とともに反映されます。
oracle.j2ee.connector
において)PrincipalMapping
インタフェースを直接実装するかAbstractPrincipalMapping
クラスを拡張します。oc4j-ra.xml
ファイルで直接(Application Server Controlのサポートなし)、<security-config>
要素に、use="principal-mapping-interface"
を、該当するサブ要素とともに構成します。
oc4j-ra.xml
ファイルで直接(Application Server Controlのサポートなし)、<security-config>
要素に、use="jaas-module"
を、該当するサブ要素とともに構成します。
OC4Jのコンテナ管理サインオン用の選択肢は、次のように図20-1にも図解されています。
この項では、次の主要リソース・アダプタのセキュリティ構成要素について説明します。
oc4j-ra.xml
ディスクリプタにより、OC4J固有のデプロイ情報(JNDIパス名とコネクタ・プロパティ)がリソース・アダプタに提供されます。oc4j-ra.xml
には、各リソース・アダプタ用に、構成パラメータ値のセットに対応するJNDI名を指定する1つ以上の<connector-factory>
要素が含まれています。OC4Jでは、各接続をConnectionFactory
インスタンスとして、適正なJNDIネームスペース・ロケーションにバインドします。
<connector-factory>
要素には、EISにユーザー名とパスワードを供給する方法を記述した<security-config>
要素(オプション)を含めることができます。
<security-config>
要素には、コンテナ管理サインオンのユーザー名とパスワードを指定します。
oc4j-ra.xml
ファイルの<security-config>
要素にこの情報を指定する方法は、2つあります。
<principal-mapping-entries>
サブ要素に明示的に指定します。
oracle.j2ee.connector.PrincipalMapping
を実装するか、(<principal-mapping-interface>
サブ要素内の)oracle.j2ee.AbstractPrincipalMapping
を継承するものです。
認証問題の詳細は、「コンテナ管理サインオンでの認証」を参照してください。ここでは、<security-config>
要素の構文についてのみ説明します。
<security-config>
要素には、次のいずれかを含めます。
<principal-mapping-entries>
要素。ユーザー名とパスワードを明示的に指定します。
<principal-mapping-interface>
要素。マッピング・クラスの名前を指定します。
<jaas-module>
要素。認証に使用するJAASモジュールを指定します。
oc4j-connectors.xml
ディスクリプタには、アプリケーションに埋め込まれているリソース・アダプタのみでなく、このOC4Jインスタンスにデプロイされているスタンドアロン・リソース・アダプタもリストします。このディスクリプタには、コネクタごとに、コネクタの名前とパス名を指定する<connector>
要素を含めます。各<connector>
要素には、各リソース・アダプタに付与されたパーミッションを定義する<security-permission>
要素を含めます。次に構文を示します。
<security-permission enabled="booleanvalue">
この要素には、各リソース・アダプタに付与するパーミッションを指定します。各<security-permission>
要素には、Java 2セキュリティ・ポリシー・ファイル構文に準拠した<security-permission-spec>
設定を含めます。
OC4Jでは、ra.xml
ファイルの各<security-permission>
要素に対して、oc4j-connectors.xml
ファイルに<security-permission>
要素を自動的に生成します。生成された各要素では、enabled
属性がfalse
に設定されています。enabled
属性をtrue
に設定すると、指定したパーミッションが付与されます。
<oc4j-connectors> <connector name="myEIS" path="eis.rar"> . . . <security-permission> <security-permission-spec enabled="false"> grant {permission java.lang.RuntimePermission "LoadLibrary", *'}; </security-permission-spec> </security-permission> </connector> </oc4j-connectors>
EISへの自身のサインオンを管理するアプリケーションをデプロイする場合は、該当するディスクリプタ・ファイル(Webコンポーネントの場合はweb.xml
、EJBコンポーネントの場合はejb-jar.xml
)の<res-auth>
をApplication
に設定します。これにより、このアプリケーション・コンポーネントは、サインオンに対して明示的なセキュリティ情報を提供する必要が出てきます。次に例を示します。
<resource-ref> <res-ref-name>...</res-ref-name> <res-type>...</res-type> <res-auth>Application</res-auth> <res-sharing-scope>...</res-sharing-scope> </resource-ref>
コンポーネント管理サインオンには、OC4J固有の構成は不要です。
図20-2に、コンポーネント管理サインオンの手順を示します。その後に詳細を示すテキストが続きます。
次の例は、コンポーネント管理サインオンを実行するアプリケーションの抜粋です。
Context initctx = new InitialContext(); // Perform JNDI lookup to obtain a connection factory. javax.resource.cci.ConnectionFactory cxf = (javax.resource.cci.ConnectionFactory)initctx.lookup ("java:com/env/eis/MyEIS"); // Assume a custom class ConnectionSpecImpl, used to store sign-on credentials. com.myeis.ConnectionSpecImpl connSpec = ... connSpec.setUserName("EISuser"); connSpec.setPassword("EISpassword"); // Pass sign-on credentials through getConnection() method call. javax.resource.cci.Connection cx = cxf.getConnection(connSpec);
OC4Jを使用してEISへのサインオンを管理するアプリケーションをデプロイする場合は、該当するディスクリプタ・ファイル(Webコンポーネントの場合はweb.xml
、EJBコンポーネントの場合はejb-jar.xml
)の<res-auth>
をContainer
に設定します。これにより、OC4Jは、サインオンに対してセキュリティ情報を提供する必要が出てきます。次に例を示します。
<resource-ref> <res-ref-name>...</res-ref-name> <res-type>...</res-type> <res-auth>Container</res-auth> <res-sharing-scope>...</res-sharing-scope> </resource-ref>
宣言的コンテナ管理サインオンの場合、OC4Jでは、Application Server Controlを介して指定された構成情報を使用します(「宣言的コンテナ管理サインオンの使用」を参照)。プログラムによるコンテナ管理サインオン(プリンシパル・マッピング・クラスまたはJAASログイン・モジュールのいずれを使用するかを問わない)の場合、OC4Jでは、oc4j-ra.xml
ファイルに直接指定された構成情報を使用します。アプリケーションで接続を取得しようとすると、OC4Jでは、該当するメカニズムを使用して送信サブジェクトを確認し、認証を実行します。
図20-3に、コンテナ管理サインオンの手順を示します。この手順の詳細はこの図の後に記載されています。
次の例は、コンテナ管理サインオンを使用するアプリケーションの抜粋です。
Context initctx = new InitialContext(); // perform JNDI lookup to obtain a connection factory javax.resource.cci.ConnectionFactory cxf = (javax.resource.cci.ConnectionFactory)initctx.lookup("java:com/env/eis/MyEIS"); // For container-managed sign-on, no security information is passed in the // getConnection call javax.resource.cci.Connection cx = cxf.getConnection();
コンテナ管理サインオンを使用する場合、OC4Jではリソース・プリンシパルとその資格証明をEISに提供する必要があります。プリンシパルと資格証明は、次のいずれかの方法で取得できます。
OC4Jでは、これらの方法をすべてサポートするため、JAAS Pluggable Authentication、ユーザー作成認証クラスまたはoc4j-ra.xml
ファイルの該当する設定が使用されます。
この項では、プリンシパル・マッピング・エントリのOC4J固有構成を介して認証を設定する方法について説明します。これを(「プログラムによるコンテナ管理サインオン」に対して)「宣言的コンテナ管理サインオン」と呼びます。Application Server Controlを介してこの構成ができます。
プリンシパル・マッピング・エントリのセットとデフォルトのリソース・ユーザーを指定します。各プリンシパル・マッピング・エントリには、開始プリンシパルと対応するリソース・プリンシパルを指定します。プログラム実行時における実際の開始プリンシパル(OC4Jユーザー)が、指定された開始プリンシパルのいずれかと一致する場合は、対応するリソース・プリンシパルがEISへのサインオンに使用されます。実際の開始プリンシパルが指定されたいずれの開始プリンシパルとも一致しない場合は、EISへのサインオンにはデフォルトのリソース・ユーザーが使用されます(提供または定義されたものがある場合)。デフォルトのリソース・ユーザーが指定されていない場合は、EISにはnull
サブジェクトが渡されます。この場合、EISには、EIS独自のデフォルトでサインオンするオプションがあります。
Application Server Controlコンソールで次の手順に従います。
表20-1に、oc4j-ra.xml
ファイルでのこれらの設定とXMLエンティティの対応関係を示します。表の後に例を示します。
<oc4j-connector-factories ... > <connector-factory ... > ... <security-config use="principal-mapping-entries"> <principal-mapping-entries> <default-mapping> <res-user>scott</res-user> <res-password>->tiger</res-password> </default-mapping> <principal-mapping-entry> <initiating-user>servletuser1</initiating-user> <res-user>jmsuser1</res-user> <res-password>->jmsuser1</res-password> </principal-mapping-entry> <principal-mapping-entry> <initiating-user>servletuser2</initiating-user> <res-user>jmsuser2</res-user> <res-password>->jmsuser2</res-password> </principal-mapping-entry> </principal-mapping-entries> </security-config> </connector-factory> ... </oc4j-connector-factories>
注意
このリリースでは、開始ユーザーの名前は、 いずれの場合も、OracleAS JAAS Providerデフォルト・レルムを指定する必要があります。「ファイルベースのプロバイダまたはOracle Identity Managementのデフォルト・レルム」を参照してください。単純なユーザー名を指定する場合、その名前はデフォルト・レルムのメンバーである必要があります。 |
OC4Jでは、プリンシパル・マッピング・クラスを使用するOC4J固有のメカニズムを介して、またはJAASログイン・モジュールを使用するプラッガブルJAASメカニズムを介して、プログラムによる認証を管理できます。以降の各項では、このメカニズムに加えて追加機能についても説明します。
プログラムによるコンテナ管理サインオンに対するOC4Jでのオプションの1つは、プリンシパル・マッピングを実装するOracle機能を使用することです。アプリケーションには、oracle.j2ee.connector.PrincipalMapping
インタフェースを実装したクラスであるプリンシパル・マッピング・クラスを組み込む必要があります。開発者はこれを行うために、直接このインタフェースを実装しても、または便宜上Oracleによって提供されているoracle.j2ee.connector.AbstractPrincipalMapping
クラスを拡張してもかまいません。oc4j-ra.xml
ファイルを介してプリンシパル・マッピング・クラスを構成します。ここでは、プリンシパル・マッピング・クラスの様々な使用方法について説明します。
表20-2に、PrincipalMapping
インタフェースのメソッドのOC4Jにおける使用方法について説明します。
メソッド・シグネチャ | OC4Jにおける使用方法 |
---|---|
void init (java.util.Properties prop) |
OC4Jでは |
void setManagedConnectionFactory (ManagedConnectionFactory mcf) |
OC4Jでは |
void setAuthenticationMechanisms (java.util.Map authMechanisms) |
OC4Jでは |
Subject mapping (Subject initiatingSubject) |
OC4Jでは |
OC4Jでは、PrincipalMapping
インタフェースを実装する抽象クラスAbstractPrincipalMapping
が、便宜上用意されています。このクラスには、setManagedConnectionFactory()
およびsetAuthenticationMechanism()
メソッドのデフォルト実装の他、次を行えるユーティリティ・メソッドが含まれています。
Subject
インスタンスからのPrincipal
インスタンスの抽出
AbstractPrincipalMapping
クラスを拡張する場合、開発者はinit()
およびmapping()
メソッドを実装するのみで済みます。
AbstractPrincipalMapping
クラスによって公開されるメソッドを次の表20-3にまとめます。
メソッド・シグネチャ | 説明 |
---|---|
abstract void init |
サブクラスでは、 |
void setManagedConnectionFactory (ManagedConnectionFactory mcf) |
サブクラスでは、 |
void setAuthenticationMechanisms |
サブクラスでは、 |
abstract Subject mapping |
サブクラスでは、 |
ManagedConnectionFactory getManagedConnectionFactory () |
|
java.util.Map getAuthenticationMechanisms () |
|
boolean isBasicPasswordSupported () |
|
boolean isKerbv5Supported () |
|
Principal getPrincipal (Subject) |
注意: サブジェクト内に複数のプリンシパルがある場合、このメソッドでは最初のプリンシパルを取得します。( |
例20-1では、AbstractPrincipalMapping
クラスを拡張して、OC4JユーザーからEISのデフォルトのユーザーおよびパスワードにプリンシパル・マッピングを行います。これは、デフォルトのユーザーおよびパスワードがoc4j-ra.xml
ファイルの<principal-mapping-interface>
要素に指定されているものと想定しています(「プリンシパル・マッピング・クラスの構成」を参照)。
package com.example.app; import java.util.*; import javax.resource.spi.*; import javax.resource.spi.security.*; import oracle.j2ee.connector.AbstractPrincipalMapping; import javax.security.auth.*; import java.security.*; public class MyMapping extends AbstractPrincipalMapping { String m_defaultUser; String m_defaultPassword; public void init(Properties prop) { if (prop != null) { // Retrieves the default user and password from the properties m_defaultUser = prop.getProperty("user"); m_defaultPassword = prop.getProperty("password"); } } public Subject mapping(Subject initiatingSubject) { // This implementation is for BasicPassword authentication // mechanism. Return if the resource adapter does not support it. if (!isBasicPasswordSupported()) return null; // Use the utility method to retrieve the Principal from the incoming Subject // (security context), corresponding to the OC4J user. // This code is included here only as an example. // The principal obtained is not actually used in this example. Principal principal = getPrincipal(initiatingSubject); char[] resPasswordArray = null; if (m_defaultPassword != null) resPasswordArray = m_defaultPassword.toCharArray(); // Create a PasswordCredential using the default user name and // password, and add it to the Subject, as in "Option A" in the // J2EE Connector Architecture specification. PasswordCredential cred = new PasswordCredential(m_defaultUser, resPasswordArray); cred.setManagedConnectionFactory(getManagedConnectionFactory()); initiatingSubject.getPrivateCredentials().add(cred); return initiatingSubject; } }
プリンシパル・マッピング・クラスを使用するには、oc4j-ra.xml
を更新してクラス用に<principal-mapping-interface>
要素を追加する必要があります。これは<security-config>
要素のサブ要素で、次のものを含める必要があります。
<impl-class>
サブ要素。これには、プリンシパル・マッピング・クラスの完全修飾名を指定します。
name="user"
およびvalue
設定が指定された<property>
サブ要素と、デフォルト・ユーザーのパスワードを指定するためのname="password"
およびvalue
設定が指定された<property>
サブ要素があります(次の例を参照)。
<oc4j-connector-factories> <connector-factory name="..." location="..."> ... <security-config use="principal-mapping-interface"> <principal-mapping-interface> <impl-class>com.example.app.MyMapping</impl-class> <property name="user" value="scott" /> <property name="password" value="tiger" /> </principal-mapping-interface> </security-config> ... </connector-factory> </oc4j-connector-factories>
JAASを介してEISへのサインオンをプログラムにより管理することもできます。
OC4Jには、Connector Architecture仕様に準拠するJAAS Pluggable Authenticationフレームワークが用意されています。このフレームワークにより、アプリケーション・サーバーとその基礎となる認証サービスは相互に独立した状態を維持し、アプリケーション・サーバーに変更を加えずに、新規認証サービスをプラグインできます。
認証サービスでは、次のいずれかのタイプのJAASログイン・モジュールを使用してリソース・プリンシパルと資格証明を取得できます。
ログイン・モジュールは、カスタマ、EISベンダーまたはリソース・アダプタ・ベンダーが提供できます。ログイン・モジュールは、javax.security.auth.spi.LoginModule
インタフェースを実装します。
OC4Jでは、公開証明書を格納するjavax.security.auth.Subject
クラスのインスタンス、およびOC4Jユーザーを表すoracle.j2ee.connector.InitiatingPrincipal
インスタンスを渡すことで、ログイン・モジュールに開始ユーザー・サブジェクトを提供します。認証されたユーザーがない場合、つまり、匿名ユーザーがある場合、OC4Jではnullサブジェクトを渡すことができます。ログイン・モジュールのログイン・メソッドは、開始ユーザーに基づいて、対応するリソース・プリンシパルを検索して、そのリソース・プリンシパル用に新規のPasswordCredential
またはGenericCredential
インスタンスを作成する必要があります。これにより、リソース・プリンシパルおよび資格証明オブジェクトが、commit()
メソッドの開始Subject
インスタンスに追加されます。リソース資格証明は、リソース・アダプタによって提供されるjavax.resource.spi.ManagedConnectionFactory
実装のcreateManagedConnection()
メソッドに渡されます。nullのSubject
インスタンスが渡された場合、ログイン・モジュールは、リソース・プリンシパルとそれに対応する資格証明を含んだ新規のSubject
インスタンスを作成する必要があります。
oracle.j2ee.connector.InitiatingPrincipal
クラスは、ログイン・モジュールのOC4Jユーザーを表します。OC4Jでは、InitiatingPrincipal
のインスタンスを作成してサブジェクトに組み込みます。このサブジェクトはログイン・モジュールのinitialize()
メソッドに渡されます。InitiatingPrincipal
クラスは、java.security.Principal
インタフェースの実装にgetGroups()
メソッドが追加されたものです。
また、oracle.j2ee.connector.InitiatingGroup
クラスはPrincipal
インタフェースの実装ですが、OC4Jロールを表します。OC4Jでは、InitiatingPrincipal
インスタンスを作成してサブジェクトに組み入れます。このサブジェクトは、ログイン・モジュールのinitialize()
メソッド、またはプリンシパル・マッピング・クラスのmapping()
メソッドに渡されます。また、InitiatingPrincipal
クラスには、getGroups()
メソッドも含まれています。
getGroups()
メソッドでは、InitiatingGroup
オブジェクトのセット(java.util.Set
インスタンス)を戻します。これはOC4JのロールまたはこのOC4JユーザーのOracleAS JAAS Providerロールを表します。ロール・メンバーシップは、OC4J固有のディスクリプタ・ファイル(通常、system-jazn-data.xml
)に定義されます。
ログイン・モジュールでは、getGroups()
を使用してOC4JロールとEISユーザー間でマッピングを行えます。Principal
インタフェースのメソッドでは、OC4JロールとEISユーザー間のマッピングがサポートされます。ログイン・モジュールは、OC4JロールとEISユーザー間でマッピングを行わない場合は、InitiatingPrincipal
およびInitiatingGroup
クラスを参照する必要がありません。
oc4j-ra.xml
の各<connector-factory>
要素には、異なるJAASログイン・モジュールを指定できます。<jaas-module>
要素に、コネクタ・ファクトリ構成の名前を指定します。次に、oc4j-ra.xml
ファイルの<connector-factory>
要素の例を示します。この例では、コンテナ管理サインオンにログイン・モジュールが使用されています。
<connector-factory connector-name="myBlackbox" location="eis/myEIS1"> <description>Connection to my EIS</description> <config-property name="connectionURL" value="jdbc:oracle:thin:@localhost:5521/myservice" /> <security-config> <jaas-module> <jaas-application-name>JAASModuleDemo</jaas-application-name> </jaas-module> </security-config> </connector-factory>
JAASでは、特定のアプリケーションに使用するログイン・モジュールと、ログイン・モジュール間の起動順序を指定する必要があります。JAASでは、<jaas-application-name>
要素に指定された値を使用してログイン・モジュールを検索します。
|
Copyright © 2003, 2008 Oracle Corporation. All Rights Reserved. |
|