Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護 11gリリース1 (11.1.1) E64849-03 |
|
前 |
次 |
この章の情報はJava SEアプリケーションにのみ適用され、Java SEアプリケーションの開発者を対象読者としています。
Java EEアプリケーションについての同様の情報は、第23章「OPSSを使用するためのJava EEアプリケーションの構成」を参照してください。
この章の内容は次のとおりです。
Java SEアプリケーションでOPSSを使用するためには、開発者は次のことを理解する必要があります。
oracle_common/modules/oracle.jps_11.1.1/jps-manifest.jar
ファイルは、クラス・パス内にある必要があります。
初期化の際に、アプリケーションはJpsStartup.start()
をコールする必要があります。
次のシステム・プロパティを設定する必要があります。
oracle.security.jps.config
。jps-config-jse.xml
ファイルへのファイル・パス。
common.components.home
。oracle commonディレクトリへのパス。
java.security.policy
。java.policy
ファイルへのファイル・パス。
java.policy
ファイルは標準に準拠している必要があり、要件にあわせてそのコンテンツをカスタマイズします。サンプルのjava.policy
ファイルは、domain_config/jse/java.policy
を参照してください。このファイルとweblogic.policy
ファイルのコンテンツは類似しています。
opss.audit.logDirectory
。監査レコードが書き込まれる、書込み可能なディレクトリへのパス。
その他の設定可能な(オプションの)システム・プロパティの詳細は、第F.1項「OPSSシステム・プロパティ」を参照してください。
JVMオプション-Djava.security.policy
は、Oracle WebLogic Serverポリシー・ファイルweblogic.policy
の場所を指定します。通常、wl_home/server/lib
ディレクトリに存在します。
次のサンプル・スニペットで示すように、アプリケーションはOPSSクラスAppSecurityContext
を使用します。
注意: このサンプル・スニペットは、CSF/KSS機能のみを使用する場合には必要ありません。 |
String appID = AppSecurityContext.getApplicationID(); try { setApplicationID(appName); ..... } finally { setApplicationID(appID ); } } private static void setApplicationID(final String applicationID) { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { AppSecurityContext.setApplicationID(applicationID); return null; } }); }
AppSecurityContext.setApplicationID
コールには、次のようなコードソース・パーミッションが必要です。
<grant> <grantee> <codesource> <url>myJavaSEapp/-</url> </codesource> </grantee> <permissions> <permission> <class>oracle.security.jps.JpsPermission</class> <name>AppSecurityContext.setApplicationID.myAppStripeID</name> </permission> </permissions> </grant>
OPSSポリシー・プロバイダは、次の例に示すように、Java SEアプリケーションに明示的に設定する必要があります。
java.security.Policy.setPolicy(new oracle.security.jps.internal.policystore.JavaPolicyProvider())
Java SEアプリケーションにポリシー・プロバイダを明示的に設定しておかないと、ランタイム・メソッド(JpsAuth.checkPermission
など)が不正確な値を返す場合があります。
OPSSセキュリティ・ストアを構成する方法の詳細は、第8章「OPSSセキュリティ・ストアの構成」を参照してください。
この項では、クラスJpsStartup
に対するの次の拡張機能について説明します。
メソッドJpsStartup.start()
のOPSS状態セット
メソッドJpsStartup.start()
のランタイム・オプションの一部
クラスJpsStartup
の新しいコンストラクタ
メソッドJpsStartup.getState()
このクラスに関する詳細は、『Oracle Fusion Middleware Java API Reference for Oracle Platform Security Services』を参照してください。使用例については、「OPSS起動例」を参照してください。
この項の内容は次のとおりです。
JpsStartup.start()
の遷移状態は、次の定数で定義されます。
UNINITIALIZED - JpsStartup.start()
が呼び出される前のデフォルトの状態。
INITIALIZING - JpsStartup.start()
が呼び出された後、この状態に遷移します。
FAILURE - INITIALIZINGの状態でなんらかの障害が発生した場合、この状態に遷移します。
ACTIVE - すべてのサービスが障害なく起動された場合、つまりINITIALIZING状態で何も障害が発生しなかった場合にはこの状態に遷移します。
INACTIVE - JpsStatup.stop()
を呼び出すと、この状態に遷移します。
次の表は、クラス・コンストラクタjpsStartup()
を呼び出すときに使用できるランタイム・オプションをまとめたものです。
表24-1 JpsStartupのランタイム・オプション
オプション | 値 | デフォルト | 説明 |
---|---|---|---|
ACTIVE_CONTEXT |
アクティブ・コンテキストの名前または文字列"default"。 |
"default" |
渡された場合は、指定されたコンテキストを使用。それ以外の場合は"default"コンテキストを使用。 |
ENABLE_JAVA_POLICY_PROVIDER |
TRUEまたはFALSE |
TRUE |
Java2ポリシー・プロバイダを使用する場合はTRUEに、それ以外の場合はFALSEに設定。 |
ENABLE_AUDIT_SERVICE_EXT |
TRUEまたはFALSE |
TRUE |
監査モニタリングと監査ローダーとともに監査サービスを起動する場合はTRUEに、それ以外の場合はFALSEに設定。 |
ENABLE_POLICY_STORE_SERVICE_EXT |
TRUEまたはFALSE |
TRUE |
ポリシー変更スキャナ・スレッドとともにポリシー配布ポイント(PDP)を起動する場合はTRUEに、それ以外の場合はFALSEに設定。 |
ENABLE_DEPLOYMENT_HANDLING |
TRUEまたはFALSE |
TRUE |
デプロイメント・ハンドラを作成する場合はTRUE、それ以外の場合はFALSEに設定します。 |
RUNTIME_MODE |
DEFAULTまたは SCRIPT |
DEFAULT |
ENABLE_JAVA_POLICY_PROVIDER、ENABLE_AUDIT_SERVICE_EXT、ENABLE_POLICY_STORE_SERVICE_EXT、ENABLE_DEPLOYMENT_HANDLINGオプションをFALSEに設定する場合はSCRIPTに設定。それ以外の場合はDEFAULTに設定。 |
JPS_CONFIG |
ファイルjps.config.xmlへのパス |
oracle.security.jps.configプロパティで指定されたパス |
渡された場合は、指定されたパスを使用。それ以外の場合は"default"パスを使用。 |
このクラスに次のコンストラクタが追加されました。
JpsStatup(java.lang.String platformType, java.util.Map<java.lang.String, ContextConfiguration> ctxtCfgs, java.util.Map<java.lang.String,?> options)
引数ContextConfiguration
は、構成ファイルjps-config-jse.xml
の<jpsContext>内のコンテキストに関する詳細を保持します。JpsStartupを呼び出す前にContextConfigurationを取得する方法については、「OPSS起動例」の例3と4を参照してください。
"default"コンテキストに加えて複数のコンテキストを起動するには、複数のコンテキスト情報を渡します。詳細は、「OPSS起動例」の例4を参照してください。"default"以外のコンテキストを起動するには、目的のコンテキスト名を渡します。何も渡さなかった場合はデフォルトのコンテキストが起動されます。
引数options
には、OPSSの起動に使用される起動プロパティをすべて指定できます。利用可能なオプションの一覧については、表24-1を参照してください。
このコンストラクタは通常、ContextConfiguration
の詳細を指定してOPSSを起動したときに呼び出されます。「OPSS起動例」の例3を参照してください。
このメソッドは、呼び出し時のOPSSの状態として、INITIALIZING、UNINITIALIZED、FAILURE、ACTIVEまたはINACTIVEのいずれかを返します。
次のコードは、一般的な起動シナリオでクラスJpsStartup
を使用した例です。
例1
次のコードは、特にパラメータを指定せずにOPSSを起動する方法の例です。
JpsStartup jpsStartUp = new JpsStartup(); jpsStartUp.start(); jpsStartUp.getState(); jpsStartUp.stop();
例2
ここでは、次の構成でOPSSを起動する方法の例を示します。
default1
は、contextConfig
マップの一部として渡されるデフォルト・コンテキストです。
監査ローダーや監査モニタリングなどの監査ランタイム・サービスを無効化するには、パラメータ"ENABLE_AUDIT_SERVICE_EXT"を"FALSE"に設定して渡します。デフォルトではこのパラメータは有効化されていますので注意してください。
ポリシー変更スキャナ・スレッドなどのランタイム・サービスを無効化するには、パラメータ"ENABLE_POLICY_STORE_SERVICE_EXT"を"FALSE"に設定して渡します。デフォルトではこのパラメータは有効化されていますので注意してください。
ConfigurationServiceProvider prov = ConfigurationServiceProvider.newInstance(); ConfigurationService configService = prov.getConfigurationService(); ContextConfiguration configuration = configService.getContextConfiguration("default1"); Map<String, ContextConfiguration> contextConfig = new HashMap<String, ContextConfiguration>(); contextConfig.put(JpsConstants.DEFAULT_CONTEXT_KEY, configuration); Map<String, Object> option = new HashMap<String, Object>(); option.put(JpsConstants.ENABLE_AUDIT_SERVICE_EXT, "FALSE"); option.put(JpsConstants.ENABLE_POLICY_STORE_SERVICE_EXT, "FALSE"); JpsStartup jpsStartUp = new JpsStartup("JSE", contextConfig, option); jpsStartUp.start(); jpsStartUp.stop();
例3
ここでは、ContextConfigurations
の詳細を指定してOPSSを起動する方法の例を示します。
Map<String, Object> startupOption = new HashMap<String, Object>(); ConfigurationServiceProvider prov = ConfigurationServiceProvider.newInstance(); ConfigurationService configService = prov.getConfigurationService(); ContextConfiguration configuration = configService.getContextConfiguration("default1"); Map<String, ContextConfiguration> contextConfig = new HashMap<String, ContextConfiguration>(); contextConfig.put(JpsConstants.DEFAULT_CONTEXT_KEY, configuration); JpsStartup jpsStartUp = new JpsStartup("JSE", contextConfig, startupOption); jpsStartUp.start(); jpsStartUp.stop();
例4
次のコードは、複数のコンテキストを使用したOPSSの起動方法の例です。ここでは、jps.config.xml
ファイルに次のコンテキストが含まれていると仮定しています。
<jpsContexts default="default"> <jpsContext name="default"> <serviceInstanceRef ref="credstore"/> ... </jpsContext> <jpsContext name="default1"> <serviceInstanceRef ref="idstore.loginmodule"/> ... </jpsContext> <jpsContext name="default2"> <serviceInstanceRef ref="keystore"/> ... </jpsContext> <jpsContext name="default3"> <serviceInstanceRef ref="policystore "/> ... </jpsContext> <jpsContext name="bootstrap_credstore_context"> <serviceInstanceRef ref="bootstrap.credstore"/> </jpsContext> </jpsContexts> ConfigurationServiceProvider prov = ConfigurationServiceProvider.newInstance(); ConfigurationService configService = prov.getConfigurationService(); ContextConfiguration configuration1 = configService.getContextConfiguration("default1"); ContextConfiguration configuration2 = configService.getContextConfiguration("default2"); ContextConfiguration configuration3 = configService.getContextConfiguration("default3"); Map<String, ContextConfiguration> contextConfig = new HashMap<String, ContextConfiguration>(); contextConfig.put(JpsConstants.DEFAULT_CONTEXT_KEY, configuration); contextConfig.put(("default1", configuration1); contextConfig.put(("default2", configuration2); contextConfig.put(("default3", configuration3); Map<String, Object> startupOption = new HashMap<String, Object>(); startupOption.put(JpsConstants.ACTIVE_CONTEXT, "default"); JpsStartup jpsStartUp = new JpsStartup("JSE", contextConfig, startupOption); jpsStartUp.start(); jpsStartUp.stop();
パラメータ"ACTIVE_CONTEXT"は、デフォルトとして使用するコンテキストを示します。マップの一部としてJpsConstants.DEFAULT_CONTEXT_KEYを渡さなかった場合、startupOption
マップの一部として"ACTIVE_CONTEXT"キーが渡されていなければ、デフォルトでは"default"コンテキストが起動されます。
例5
次のコードは、"SCRIPT"モードでOPSSを起動する方法の例です。このモードは通常、移行やアップグレードの間、ランタイム・サービスを起動する必要がない場合に使用されます。
Map<String, Object> startupOption = new HashMap<String, Object>(); startupOption.put(JpsConstants.RUNTIME_MODE, "SCRIPT"); JpsStartup jpsStartUp = new JpsStartup("JSE", startupOption); jpsStartUp.start(); jpsStartUp.stop();
この項では、Java SEアプリケーションのOPSSサポートについて、サービスごとに説明します。
この項では、Java SEアプリケーションに対するアイデンティティ・ストアのサポートについて説明します。内容は次のとおりです。
動作保証情報は、http://www.oracle.com/technetwork/middleware/downloads/fmw-11gr1certmatrix.xls
の動作保証マトリックスを参照してください。
認証とは、コール元が特定のユーザーまたはシステムの代理として機能していることを証明するメカニズムです。認証では、名前とパスワードの組合せなどのデータを使用して、相手がだれであるかという質問への回答が提供されます。アイデンティティ・ストアという用語はアイデンティティ・データの格納場所を表し、認証プロバイダはアイデンティティ・ストアにアクセスするための手段です。
アプリケーションによるOPSSセキュリティ・ストア(アイデンティティ・ストア、ポリシー・ストアまたは資格証明ストア)からの情報の取得と、そのコンテンツの管理には、OPSS APIが使用されます。次の図はこれを示したものです。
Java SEアプリケーションは、次のスニペットに示すように、<serviceProvider>
、<serviceInstance>
および<jpsContext>
の各要素を含むファイルjps-config-jse.xml
に構成されたLDAPベースのアイデンティティ・ストアを使用できます。
<serviceProviders> <serviceProvider type="IDENTITY_STORE" name="idstore.ldap.provider" class="oracle.security.jps.internal.idstore.ldap.LdapIdentityStoreProvider"> <description>Prototype LDAP-based ID store</description> </serviceProvider> </serviceProviders> <serviceInstances> <serviceInstance name="idstore.ldap" provider="idstore.ldap.provider"> <property name="idstore.type" value="OID"/> <property name="max.search.filter.length" value="500"/> <extendedProperty> <name>user.search.bases</name> <values> <value>cn=users,dc=us,dc=oracle,dc=com</value> </values> </extendedProperty> <extendedProperty> <name>group.search.bases</name> <values> <value>cn=groups,dc=us,dc=oracle,dc=com</value> </values> </extendedProperty> </serviceInstance> </serviceInstances> <jpsContexts default="ldap_idstore"> <jpsContext name="ldap_idstore"> <serviceInstanceRef ref="idstore.ldap"/> </jpsContext> <jpsContext name="bootstrap_credstore_context"> <serviceInstanceRef ref="bootstrap.cred"/> </jpsContext> </jpsContexts>
次の点に注意してください:
<serviceInstance>
の名前(この例では<idstore.ldap>
)には任意の値を指定できますが、要素<serviceInstanceRef>
で参照されるインスタンスと一致している必要があります。
<serviceProvider>
の名前(この例では<idstore.ldap.provider>
)には任意の値を指定できますが、要素<serviceInstance>
内のプロバイダと一致している必要があります。
指定したスクリプトを使用してプロバイダ・インスタンスにプロパティを追加するには、付録E「スクリプトを使用したOPSSサービス・プロバイダ・インスタンスの構成」を参照してください。
ログイン・モジュールは、ユーザーを認証し、サブジェクトにプリンシパルを移入するコンポーネントです。このプロセスは、2つの異なる段階で行われます。第一段階では、ログイン・モジュールによって要求元のユーザー(必要に応じて名前、パスワードまたはその他の資格証明データ)の認証が試みられます。第一段階が成功した場合にのみ、第二段階が呼び出されます。第二段階では、ログイン・モジュールによって、関連プリンシパルがサブジェクトに割り当てられ、最終的にそれが権限が付与されたアクションを実行するために使用されます。
Java SEアプリケーションではログイン・モジュールのスタックを使用してユーザーを認証でき、各モジュールではスタック内の他のモジュールとは無関係に独自の計算を実行できます。これらのサービスおよびその他のサービスは、ファイルjps-config-jse.xml
で指定されます。
OPSS APIには、インタフェースoracle.security.jps.service.login.LoginService
が組み込まれており、これによってJava SEアプリケーションはスタック内のすべてのログイン・モジュールを呼び出せるのみでなく、それらのサブセットを指定の順序で呼び出すことができます。
LoginService
インタフェースのメソッドLoginContext
に渡されるjpsコンテキスト(構成ファイルjps-config-jse.xml
に定義されたもの)の名前によって、アプリケーションが使用するログイン・モジュールのスタックが判別されます。標準のJAAS API LoginContext
を使用して、デフォルトのコンテキストで定義されたログイン・モジュールを呼び出すこともできます。
JPSコンテキストによってスタックにログイン・モジュールがリストされる順序は重要です。それは、認証アルゴリズムでは、モジュールのセキュリティ・レベルを特定するフラグ(required、sufficient、requisite、optional)などのデータに加えてこの順序が考慮されるためです。
すぐに使用できるアイデンティティ・ストア・サービスはファイルベースであり、そのコンテンツはファイルsystem-jazn-data.xmlでプロビジョニングされています。そのサービスを再構成して、LDAPベースのアイデンティティ・ストアを使用することも可能です。
OPSSでは、Java SEアプリケーションのアイデンティティ・ストア・ログイン・モジュールがサポートされており、次の項の説明に従って、認証またはアイデンティティ・アサーションに使用できます。
アイデンティティ・ストアのログイン・モジュール
このログイン・モジュールに関連付けられているクラスは、次のとおりです。
oracle.security.jps.internal.jaas.module.idstore.IdStoreLoginModule
このモジュールのインスタンスは、次のフラグメントに示すように、ファイルjps-config-jse.xml
に構成されます。
<serviceInstance name="idstore.loginmodule" provider="jaas.login.provider"> <description>Identity Store Login Module</description> <property name="loginModuleClassName" value="oracle.security.jps.internal.jaas.module.idstore.IdStoreLoginModule"/> <property name="jaas.login.controlFlag" value="REQUIRED"/> </serviceInstance>
このログイン・モジュールに固有のプロパティは、次のとおりです。
remove.anonymous.role (defaults to true) add.application.role (defaults to true)
この項では、基本的なユーザー名とパスワードの認証のためのアイデンティティ・ストア・ログイン・モジュールの使用方法を示します。
IdStoreLoginModuleの起動
次のフラグメントは、コールバック・ハンドラとコンテキストの設定方法を示しています。
import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; Subject sub = new Subject(); CallbackHandler cbh = new YourCallbackHandler(); LoginContext context = new LoginContext(appName, subject, cbh); context.login();
コールバック・ハンドラでは、NameCallback
とPasswordCallback
を処理できる必要があります。
jps-config-jse.xmlの構成
次のjps-config-jse.xml
のファイルの断片は、コンテキストappName
の構成を示しています。
<jpsContext name="appName"> <serviceInstanceRef ref="jaaslm.idstore1"/> </jpsContext> <serviceProvider type="JAAS_LM" name="jaaslm.idstore" class="oracle.security.jps.internal.jaas.module.idstore.IdStoreLoginModule"> <description>Identity Store-based LoginModule </description> </serviceProvider> <serviceInstance name="jaaslm.idstore1" provider="jaaslm.idstore"> <property name="jaas.login.controlFlag" value="REQUIRED"/> <property name="debug" value="true"/> <property name="addAllRoles" value="true"/> </serviceInstance>
コールバック・ハンドラの書込み
次のコード・スニペットは、コールバック・ハンドラで名前とパスワードのコールバックを処理できることを示しています。
import javax.security.auth.callback.*; import java.io.IOException; public class SampleCallbackHandler implements CallbackHandler { //For name/password callbacks private String name = null;private char[] password = null; public SampleCallbackHandler(String name, char[] pwd) { if (name == null || name.length() == 0 ) throw new IllegalArgumentException("Invalid name "); else this.name = name; if (pwd == null || pwd.length == 0) throw new IllegalArgumentException("Invalid password "); else this.password = pwd; } public String getName() { return name; } public char[] getPassword() { return password; } public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { if (callbacks != null && callbacks.length > 0) { for (Callback c : callbacks) { if (c instanceof NameCallback) { ((NameCallback) c).setName(name); } else if (c instanceof PasswordCallback) { ((PasswordCallback) c).setPassword(password); } else { throw new UnsupportedCallbackException(c); } } } } }
アイデンティティ・ストアのログイン・モジュールをアサーションのために使用するには、開発者は次の処理を行う必要があります。
コール元が保護されたメソッドsetIdentity
を実行するための適切なパーミッションを提供します。これには、IdentityAssertion
という名前を持つパーミッションoracle.security.jps.JpsPermission
を付与することが必要になります。
次のコード・サンプルに示すようなクラスoracle.security.jps.callback.IdentityCallback
を使用するコールバック・ハンドラを実装します。
この2つの要件を次の構成およびコード・サンプルに示します。
JpsPermissionのプロビジョニング
次の構成サンプルでは、必須JpsPermission
がアサーション・ログイン・モジュールの保護されたメソッドを実行できるようにコードMyApp
に権限を与えています。
<grant> <grantee> <codesource> <url>file:${soa.oracle.home}/application/myApp.ear</url> <--! soa.oracle.home is a system property set when the server JVM is started --> </codesource> </grantee> <permissions> <permission> <class>oracle.security.jps.JpsPermission</class> <name>IdentityAssertion</name> </permission> </permissions> </grant>
次の構成サンプルでは、必須JpsPermission
がアサーション・ログイン・モジュールを実行できるようにプリンシパルjdoe
に権限を与えています。
<grant> <grantee> <principals> <principal> <class>weblogic.security.principal.WLSUserImpl</class> <name>jdoe</name> </principal> </principals> </grantee> <permissions> <permission> <class>oracle.security.jps.JpsPermission</class> <name>IdentityAssertion</name> </permission> </permissions> </grant>
CallbackHandlerの実装
次のコード部分は、コールバック・ハンドラの実装を示しています。
import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; import oracle.security.jps.callback.IdentityCallback; public class CustomCallbackHandler implements CallbackHandler { private String name = null; private char[] password; public CustomCallbackHandler(String name) { this.name = name; } public CustomCallbackHandler(String name, char[] password) { this.name = name; this.password = password; } public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback callback : callbacks) { if (callback instanceof NameCallback) { NameCallback nc = (NameCallback) callback; nc.setName(name); } else if (callback instanceof PasswordCallback) { PasswordCallback pc = (PasswordCallback) callback; pc.setPassword(password); } else if (callback instanceof IdentityCallback) { IdentityCallback idcb = (IdentityCallback)callback; idcb.setIdentity(name); idcb.setIdentityAsserted(true); idcb.setAuthenticationType("CUSTOM"); } else { //throw exception throw new UnsupportedCallbackException(callback); } } } }
次のコード部分は、ログイン・モジュールの実装を示しています。
import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginContext; import oracle.security.jps.service.JpsServiceLocator; import oracle.security.jps.service.login.LoginService; public class LoginModuleExample { private static final String CONTEXT_NAME = "JSE_UserAuthnAssertion"; public LoginModuleExample() { super(); } public Subject assertUser(final String username) throws Exception { CallbackHandler cbh = AccessController.doPrivileged(new PrivilegedExceptionAction<CallbackHandler>() { public CallbackHandler run() throws Exception { return new CustomCallbackHandler(username); } }); Subject sub = new Subject(); LoginService ls = JpsServiceLocator.getServiceLocator().lookup(LoginService.class); LoginContext context = ls.getLoginContext(sub, cbh); context.login(); Subject s = context.getSubject(); return s; } public Subject authenticate(final String username, final char[] password) throws Exception { CallbackHandler cbh = new CustomCallbackHandler(username, password); Subject sub = new Subject(); LoginService ls = JpsServiceLocator.getServiceLocator().lookup(LoginService.class); LoginContext context = ls.getLoginContext(sub, cbh); context.login(); Subject s = context.getSubject(); return s; } public static void main(String[] args) { LoginModuleExample loginModuleExample = new LoginModuleExample(); try { System.out.println("authenticated user subject = " + loginModuleExample.authenticate("testUser", "welcome1".toCharArray())); System.out.println("asserted user subject = " + loginModuleExample.assertUser("testUser")); } catch (Exception e) { e.printStackTrace(); } } }
Java SEアプリケーションでログイン・モジュールをプログラムによって呼び出すには、インタフェースoracle.security.jps.service.login.LoginService
のメソッドgetLoginContext
を使用します。
標準JAAS APIのメソッドLoginContext
と同様に、getLoginContext
は、ユーザーを認証するために使用できるLoginContextオブジェクトのインスタンスを返しますが、これによって、任意の順序で任意の数のログイン・モジュールを使用することもできます。これらのログオン・モジュールのみに対して、それらが渡された順序で認証が実行されます。
次のフラグメントは、ログイン・モジュールのサブセットに対するユーザー認証が、指定された順序で、getLoginContext
を使用して実行されることを示しています。
import oracle.security.jps.service.ServiceLocator; import oracle.security.jps.service.JpsServiceLocator; import oracle.security.jps.service.login.LoginService; //Obtain the login service ServiceLocator locator = JpsServiceLocator.getServiceLocator(); LoginService loginService = locator.lookup(LoginService.class); //Create the handler for given name and password CallbackHandler cbh = new MyCallbackHandler("name", "password".toCharArray()); //Invoke login modules selectively in a given order selectiveModules = new String[]{"lmName1", "lmName2", "lmName3"}; LoginContext ctx = loginService.getLoginContext(new Subject(), cbh, selectiveModules); ctx.login(); Subject s = ctx.getSubject();
selectiveModules
は、(ログイン・モジュールの)名前の配列であり、認証では、その配列内で名前を指定されたログイン・モジュールが配列内にリストされた順序で使用されます。配列内のそれぞれの名前は、ファイルjps-config-jse.xml
のデフォルトのコンテキストにリストされたサービス・インスタンスの名前にする必要があります。
次のフラグメントは、2つのログイン・モジュールからなるスタックの構成を示しています。
<serviceProvider type="LOGIN" name="jaas.login.provider" class="oracle.security.jps.internal.login.jaas.JaasLoginServiceProvider"> <description>Common definition for any login module instances</description> </serviceProvider> <serviceInstance name="auth.loginmodule" provider="jaas.login.provider"> <description>User Authentication Login Module</description> <property name="loginModuleClassName" value="oracle.security.jps.internal.jaas.module.authentication.JpsUserAuthenticationLoginModule"/> <property name="jaas.login.controlFlag" value="REQUIRED"/> </serviceInstance> <serviceInstance name="custom.loginmodule" provider="jaas.login.provider"> <description>My Custom Login Module</description> <property name="loginModuleClassName" value="my.custom.MyLoginModuleClass"/> <property name="jaas.login.controlFlag" value="REQUIRED"/> </serviceInstance> <jpsContexts default="aJpsContext"> <jpsContext name="aJpsContext"> <serviceInstanceRef ref="auth.loginmodule"/> <serviceInstanceRef ref="custom.loginmodule"/> </jpsContext> </jpsContexts>
この項では、Java SEアプリケーションを使用してイベントを監査するために共通監査フレームワーク(CAF)を活用し始めるのに必要な予備知識を提供します。Java SEクライアントのために基本要件を説明し、共通監査使用シナリオをいくつか説明します。この項の内容は、次のとおりです。
この項では、役に立つ監査の概念について説明します。
監査構成プロパティ
第24.1項で説明しているように、監査構成はjps-config-jse.xml
ファイルに格納されます。
次に示すのはそのファイルの記述例で、監査プロパティを示しています。
<serviceInstance provider="audit.provider" name="audit"> <property value="Medium" name="audit.filterPreset"/> <property value="0" name="audit.maxDirSize"/> <property value="104857600" name="audit.maxFileSize"/> <property value="" name="audit.specialUsers"/> <property value="" name="audit.customEvents"/> <property value="Db" name="audit.loader.repositoryType"/> <property value="file" name="auditstore.type"/> </serviceInstance>
監査サービスおよびプロセス
監査ランタイム・サービスにより、アプリケーションは、(監査ストアに格納されている)監査メタデータで指定される条件によって規定される様々なイベントを監査し、各イベントをバスストップ・ファイル内に記録します。
その他注目すべきプロセスには、バスストップ・ファイルからデータベースにデータを移動する監査ローダーが含まれます。
バスストップ・ファイル
これらのファイルは、新たに生成された監査レコードを保持するよう明示的に設計されています。監査ログと間違われて参照されることもありますが、システム・ログ・ファイルとは混同しないでください。
次の項では、JavaSE環境の要件および推奨事項を含む監査操作の側面をさらに詳細に説明します。
注意: 11gリリース1 (11.1.1.9)以降、バスストップ・ファイルの名前の形式は次のように変わりました。$hostname_$processId_audit_$majorVersion_$minorVersion.log 例: example.myhost.com_12345_audit_1_0.log |
Java SEクライアントは、監査バスストップ・ファイルを書き込むための書込み可能なディレクトリを指定する必要があります。このディレクトリを構成する手順は次のとおりです。
WebLogic環境では、setAuditRepository
() WLSTコマンドを使用してください。例:
setAuditRepository(logDirectory="/Audit")
WebLogic環境以外では、jps-config-jse.xml
ファイルの監査サービス・プロパティaudit.logDirectory
を使用して設定してください。
警告: 実行時プロセスが書込み可能なディレクトリを特定できない場合、監査サービスは停止する可能性があります。 |
このディレクトリは、次の場合にはJavaSEクライアント・プロセスと共有することができます。
jps-config-jse.xml
ファイルでaudit.logDirectoryサービス・プロパティを使用してディレクトリを設定し、環境内のすべてのJava SEクライアント/プロセスが同じjps-config-jse.xml
を使用する場合
または
バスストップ・ディレクトリの同じ値がシステム・プロパティとしてすべてのJava SEクライアントに渡される場合。
監査データ・ローダーは、バスストップ・ファイルからデータベースへデータをプッシュするスレッド/プロセスです。
注意: audit.loader.repositoryTypeプロパティを'Db'に設定することは、JavaEEおよびJavaSEの両環境における監査サービス・ローダーのデフォルト要件です。 |
JavaSEアプリケーションには2種類のローダーがあります。
1つ目はJavaSE監査サービス・ローダーです。これはランタイムOPSS監査サービスによって開始されたスレッドです。
デフォルトでは、この監査ローダーは無効になっています。有効にするには、JVMに"audit.loader.enable=true"を渡します。
2つ目のローダーはスタンドアロンJavaSEアプリケーションです。これはこの環境に、特に第24.4.2項で示している共有ディレクトリを使用している場合に推奨されるローダーです。
スタンドアロン・ローダーを開始する詳細は、第13.2.6.2項および第24.4.4.1項の最後の手順を参照してください。
この項では、Java SEで監査を実装する一般的なシナリオをいくつか説明します。
同じ環境にOracle WebLogic Serverが配置されている環境と配置されていない環境の両方を考慮します。
ドメインを設定後、管理者として次の手順を実行します。
setAuditRepository() WLSTコマンドを実行して、またはFusion Middleware Controlを使用して監査ローダー構成を設定します。
注意: setAuditRepositoryはオンライン・コマンドです。 |
この手順では、jps-config.xml
ファイルおよびjps-config-jse.xml
ファイル内の適切なプロパティも更新し、Java SEおよびJava EEシナリオの両方を有効化します。WLSTスクリプトは、次の例と類似しています。
# logDirectory is the location of the audit log directory # jdbcSring is the connect string # user and pass refer to the IAU append schema user and password
# (These get stored in bootstrap credential store) setAuditRepository(switchToDB = "true",dataSourceName = "jdbc/AuditDB",interval = "20", timezone="utc", logDirectory="/foo/bar", jdbcString="jdbc:oracle:thin:@host:1521:sid", dbUser="test_iau_append", dbPassword="password");
注意: JavaSEプロセスの書込み可能な監査ディレクトリがOracle WebLogic Server のログ・ディレクトリと同じディレクトリ(DOMAIN_HOME/servers/AdminServer/logsなど)に設定されている場合、スタンドアロン監査ローダーは必要ありません。コンテナの監査ローダー・プロセスがこのタスクを行います。 |
JavaSEプロセス間で別々の書込み可能な監査ディレクトリを選択した場合、スタンドアロン監査ローダーを開始してこれらのレコードをデータベースにプッシュします。システム・プロパティの1つを渡し、バスストップ・ディレクトリの値に設定します。次の例では、oracle.instanceが使用されています。
$JAVA_HOME/bin/java
-classpath $COMMON_COMPONENTS_HOME/modules/oracle.jps_11.1.1/jps-manifest.jar:
$COMMON_COMPONENTS_HOME/modules/oracle.jdbc_11.1.1/ojdbc6dms.jar:
$COMMON_COMPONENTS_HOME/modules/oracle.iau_11.1.1./fmw_audit.jar
-Doracle.instance=$ORACLE_INST
-Doracle.security.jps.config=path_to_jps-config-jse.xml
oracle.security.audit.ajl.loader.StandaloneAuditLoader
ここでは、ミドルウェア・ホームが有効で、Oracle WebLogic Serverが実行されていないことを想定しています。そのため、Fusion Middleware ControlまたはsetAuditRepository()などのオンラインWLSTコマンドは使用できません。
手順は次のとおりです。
デフォルトでは、書込み可能ディレクトリがJVMに指定されている場合、監査ランタイムがJavaSEで有効化されます。
audit.logDirectoryサービス・プロパティはデフォルトではjps-config-jse.xml
ファイルで有効ではないため、バスストップ・ディレクトリを指定するためにopss.audit.logDirectoryまたはoracle.instanceのシステム・プロパティを設定することをお薦めします。
管理者として、次にaddBootStrapCredential( ) WLSTコマンドを使用して、jps-config-jse.xml
ファイルに定義されているようにブートストラップ資格証明をブートストラップ資格証明ストアに追加します。
addBootStrapCredential(jpsConfigFile='../../../user_projects/domains/base_domain/config/fmwconfig/jps-config-jse.xml', map='AuditDbPrincipalMap', key='AuditDbPrincipalMap', username='TEST_IAU_APPEND', password='password')
JavaSEプロセスが共有監査ディレクトリを使用する場合、スタンドアロン監査ローダーを開始してこれらのレコードをデータベースにプッシュします。
最後に、関連する監査ローダーが操作可能であることを確認します。2つのシナリオがあります:
監査ディレクトリは共有されていない(つまり、すべてのJavaSEプロセスはそれ自体の監査ディレクトリに書き込みます)。
この場合、audit.loader.enable=trueを指定することで単純にランタイム・サービスの監査ローダーを有効にします。
監査ディレクトリは共有されている(つまり、複数のJavaSEプロセスが同じ監査ディレクトリに書き込みます)。
この場合、第24.4.4.1項で示しているようにスタンドアロン監査ローダーを開始します。
注意: スタンドアロン監査ローダーはディレクトリが共有されていないときにも使用できます。 |
この項では、次のアーティファクトの構成を示します。
XMLのポリシー・ストアおよび資格証明ストア
XMLおよびLDAPのアイデンティティ・ストア
ログイン・モジュールのプリンシパル
XMLのポリシー・ストアおよび資格証明ストアの構成
次のスニペットは、XMLベースのポリシー・ストアおよび資格証明ストアの構成を示しています。XMLベースのポリシー・ストアのコンテンツは、ファイルsystem-jazn-data.xml
に指定されています。XMLベースの資格証明ストアのコンテンツは、ファイルcwallet.sso
に指定されています。
<serviceProviders> <serviceProvider class="oracle.security.jps.internal.policystore.xml.XmlPolicyStoreProvider" name="policystore.xml.provider" type="POLICY_STORE"> <description>XML-based PolicyStore Provider</description> </serviceProvider> <serviceProvider class="oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider" name="credstoressp" type="CREDENTIAL_STORE"> <description>SecretStore-based CSF Provider</description> </serviceProvider> </serviceProviders> <serviceInstances> <serviceInstance location="./" provider="credstoressp" name="credstore"> <description>File-based Credential Store Service Instance</description> </serviceInstance> <serviceInstance location="./system-jazn-data.xml" provider="policystore.xml.provider" name="policystore.xml"> <description>File-based Policy Store Service Instance</description> </serviceInstance> </serviceInstances>
XMLのアイデンティティ・ストアの構成
次のスニペットは、XMLベースのアイデンティティ・ストアの構成を示しています。XMLベースのアイデンティティ・ストアのコンテンツは、ファイルsystem-jazn-data.xml
に指定されています。
<serviceProvider class="oracle.security.jps.internal.idstore.xml.XmlIdentityStoreProvider" name="idstore.xml.provider" type="IDENTITY_STORE"> <description>XML-based Identity Store Service Provider</description> </serviceProvider> <serviceInstance location="./system-jazn-data.xml" provider="idstore.xml.provider" name="idstore.xml"> <description>File Based Identity Store Service Instance</description> <property value="jazn.com" name="subscriber.name"/> </serviceInstance>
LDAPのアイデンティティ・ストアの構成
次のスニペットは、LDAPベースのアイデンティティ・ストアの構成を示しています。このアイデンティティ・ストアには、LDAPサーバーにアクセスするためのブートストラップ資格証明の必須構成が含まれています。サービス・インスタンス・プロパティidstore.type
には、動作保証マトリックスに示している値を設定できます。
動作保証情報は、http://www.oracle.com/technetwork/middleware/downloads/fmw-11gr1certmatrix.xls
の動作保証マトリックスを参照してください。
<serviceProvider class="oracle.security.jps.internal.idstore.ldap.LdapIdentityStoreProvider" name="idstore.ldap.provider" type="IDENTITY_STORE"> <description>LDAP-based Identity Store Service Provider</description> </serviceProvider> <serviceProvider class="oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider" name="credstoressp" type="CREDENTIAL_STORE"> <description>SecretStore-based CSF Provider</description> </serviceProvider> <serviceInstance name="idstore.oid" provider="idstore.ldap.provider"> <property name="subscriber.name" value="dc=us,dc=oracle,dc=com"/> <property name="idstore.type" value="OID"/> <property value=ldap://myOID.com:3555 name="ldap.url"/> <extendedProperty> <name>user.search.bases</name> <values> <value>cn=users,dc=us,dc=oracle,dc=com</value> </values> </extendedProperty> <extendedProperty> <name>group.search.bases</name> <values> <value>cn=groups,dc=us,dc=oracle,dc=com</value> </values> </extendedProperty> <property name="username.attr" value="uid"/> <propperty name="group.attr" value="cn"/> </serviceInstance> <serviceInstance location="./bootstrap" provider="credstoressp" name="bootstrap.cred"> <property value="./bootstrap" name="location"/> </serviceInstance>
ログイン・モジュールのプリンシパル
次のプロパティはデフォルトのjps-config-jse.xml
ファイルに設定されています。
<property name="oracle.security.jps.enterprise.user.class" value="weblogic.security.principal.WLSUserImpl"/> <property name="oracle.security.jps.enterprise.role.class" value="weblogic.security.principal.WLSGroupImpl"/>
どのようなログイン・モジュールでも、前述のプロパティを使用する必要があります。これは、アイデンティティ・ストア内のユーザーおよびグループを表すプリンシパルが、次のとおりであることを意味しています。
weblogic.security.principal.WLSUserImpl weblogic.security.principal.WLSGroupImpl