Oracle® Fusion Middleware Oracle Platform Security Servicesによるアプリケーションの保護 12c (12.2.1.3.0) E92000-01 |
|
前 |
次 |
この章の内容は次のとおりです。
Java SEアプリケーションでOPSSを使用するには、次のようにします。
jps-manifest.jar
ファイルをクラスパスに挿入します。
初期化の際に、JpsStartup.start
をコールします。
次のプロパティを設定します。
oracle.security.jps.config
: jps-config-jse.xml
ファイルへのファイル・パス。
common.components.home
: oracle_common
ディレクトリへのパス。
java.security.policy
: java.policy
ファイルへのパス。
opss.audit.logDirectory
: 監査によってアプリケーションに関するレコードが書き込まれる、書込み可能なディレクトリへのパス。
-Djava.security.policy
を、(wl_home/server/lib
ディレクトリにある)Oracle WebLogic Serverのweblogic.policy
ポリシー・ファイルの場所に設定します。
OPSS AppSecurityContext
クラスを使用し、必要な関連する権限付与を書き留めます。
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
コールでは、jps-config-jse.xml
に次のようなコードソース・パーミッションを挿入する必要があります。
<grant> <grantee> <codesource> <url>myJavaSEapp/-</url> </codesource> </grantee> <permissions> <permission> <class>oracle.security.jps.JpsPermission</class> <name>AppSecurityContext.setApplicationID.myAppStripeID</name> </permission> </permissions> </grant>
次の各項では、JpsStartup
クラスの状態、ランタイム・オプションおよび使用例について説明します。
関連項目:
Oracle Platform Security ServicesのJava APIリファレンス
JpsStartup.start
メソッドの遷移状態は、次の定数で定義されます。
UNINITIALIZED
- JpsStartup.start
をコールする前の状態。
INITIALIZING
- JpsStartup.start
がコールされた後、この状態に遷移します。
FAILURE
- INITIALIZING
状態でエラーが発生した場合、この状態に遷移します。
ACTIVE
- INITIALIZING
状態が正常に完了した場合、この状態に遷移します。
INACTIVE
- JpsStatup.stop
メソッドがコールされた後、この状態に遷移します。
JpsStartup.getState
メソッドは、現在のOPSSの状態を返します。
クラスには次のコンストラクタが含まれます。
JpsStatup(java.lang.String platformType, java.util.Map<java.lang.String,ContextConfiguration> ctxtCfgs, java.util.Map<java.lang.String,?> options)
追加のコンテキストの詳細およびオプションを指定してOPSSを起動する場合に、このコンストラクタをコールします。
ctxCfgs
引数は、jps-config-jse.xml
ファイルに指定されたコンテキストの詳細を保持します。デフォルトのコンテキスト以外のコンテキストを複数起動するには、複数のコンテキスト情報を渡します。デフォルトのコンテキスト以外のコンテキストを1つ起動するには、コンテキスト名を渡します。指定しない場合は、デフォルトのコンテキストが使用されます。
options
引数は、特定のOPSS起動値を1つにまとめます。ランタイム・オプションの詳細は、表24-1を参照してください。
関連項目:
次の表は、jpsStartup
メソッドで使用するオプションの説明をまとめたものです。
表24-1 JpsStartupのランタイム・オプション
オプション | 値 | デフォルト | 説明 |
---|---|---|---|
|
アクティブなコンテキストの名前。 |
default |
指定されたコンテキストを使用します。それ以外の場合は、デフォルトのコンテキストを使用します。 |
|
|
|
ポリシー・プロバイダを使用する場合は |
|
|
|
サービスの起動時に監査モニタリングおよび監査ローダーを起動する場合は |
|
|
|
ポリシー変更とともにポリシー配布ポイント(PDP)を起動する場合は |
|
|
|
デプロイメント・ハンドラを作成する場合は |
|
|
|
次のオプションを
それ以外の場合は、 |
|
|
指定されたパスを使用します。それ以外の場合は、デフォルトのパスを使用します。 |
この項では、一般的なシナリオでの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
次の例では、追加のコンテキストを使用して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-jse.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
パラメータでは、デフォルトとして使用するコンテキストを指定します。マップの一部としてDEFAULT_CONTEXT_KEY
を渡さなかった場合、startupOption
マップの一部として渡されたACTIVE_CONTEXT
キーがなければ、デフォルトのコンテキストが起動されます。
例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アプリケーションでのアイデンティティ・ストアのサポートについて説明します。
Java SEアプリケーションでは、jps-config-jse.xml
ファイルでserviceProvider
、serviceInstance
およびjpsContext
の各要素を使用して構成されたLDAPアイデンティティ・ストアを使用できます。
<serviceProviders> <serviceProvider type="IDENTITY_STORE" name="idstore.ldap.provider" class="oracle.security.jps.internal.idstore.ldap.LdapIdentityStoreProvider"> <description>Prototype LDAP 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
で指定されるプロバイダと一致する必要があります。
特に指定のないかぎり、この項の情報は、Java EEアプリケーションとJava SEアプリケーションの両方に適用され、ログイン・モジュールのコールに使用するAPIは両種類のアプリケーションに共通します。
ログイン・モジュールは、ユーザーを認証し、サブジェクトにプリンシパルを移入するコンポーネントです。ログイン・モジュールでは、名前とパスワードまたはその他のデータを要求した後にユーザーを認証します。認証が成功すると、モジュールによって関連するプリンシパルがサブジェクトに割り当てられます。
サポートされているログイン・モジュールで、次のプロパティを設定します。
enable.anonymous (default: false) remove.anonymous.role (default: true) add.application.roles (default: true) add.authenticated.role (default: true)
サポートされているログイン・モジュールは次のとおりです。
Java SEアプリケーションでは、ユーザー認証のログイン・モジュールとユーザー・アサーションのログイン・モジュールがデフォルトのアイデンティティ・ストア・サービスでサポートされています。
ユーザー認証のログイン・モジュールは、指定されたユーザー名およびパスワードによってユーザーを認証するために、Java EEアプリケーションとJava SEアプリケーションの両方で使用します。このログイン・モジュールの構成はすぐに使用でき、ドメイン・アイデンティティ・ストアに対して認証します。
次の例では、プログラムによる認証に対するこのモジュールの使用方法を示します。
import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; public class MyCallbackHandler extends CallbackHandler { private String name = null; private char[] password = null; public MyCallbackHandler(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 ncb = (NameCallback) callback; ncb.setName(name); } else if (callback instanceof PasswordCallback) { PasswordCallback pcb = (PasswordCallback) callback; pcb.setPassword(password); } else { throw UnsupportedCallbackException(callback); } } } } JpsLoginModuleFactory factory = JpsLoginModuleFactory.getLoginModuleFactory(); CallbackHandler cbh = new MyCallbackHandler("name", "password".toCharArray()); LoginContext ctx = factory.getLoginContext(JpsLoginModuleType.USER_AUTHENTICATION, null, cbh); ctx.login(); Subject s = ctx.getSubject();
ユーザー認証のログイン・モジュールは、アイデンティティ・ストア内のユーザー・アイデンティティをアサートするために、Java EEアプリケーションとJava SEアプリケーションの両方で使用します。これには、次の各項で説明しているように、oracle.security.jps.JpsPermission
パーミッションのプロビジョニングと、oracle.security.jps.callback.IdentityCallback
コールバックの実装が必要です。
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> <action>execute</action> </permission> </permissions> </grant>
関連項目:
CallbackHandlerの実装
次の例では、コールバック・ハンドラの実装を示します。
import oracle.security.jps.callback.IdentityCallback; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import java.io.IOException; public class AssertCallbackHandler implements CallbackHandler { private String name = null; public AssertCallbackHandler(String name) { this.name = name; } public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback callback : callbacks) { if (callback instanceof IdentityCallback) { IdentityCallback nc = (IdentityCallback) callback; nc.setIdentity(name); } else { throw new UnsupportedCallbackException(callback); } } } }
プログラムのアサーションの実装
次の例では、ユーザーのアサート方法を示します。
import oracle.security.jps.callback.IdentityCallback; import oracle.security.jps.internal.api.jaas.module.JpsLoginModuleFactory; import oracle.security.jps.internal.api.jaas.module.JpsLoginModuleType; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.login.LoginContext; import java.io.IOException; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; Subject subject = AccessController.doPrivileged(new PrivilegedExceptionAction<Subject>() { public Subject run() throws Exception { JpsLoginModuleFactory f = JpsLoginModuleFactory.getLoginModuleFactory(); CallbackHandler cbh = new AssertCallbackHandler(name); LoginContext c = f.getLoginContext(JpsLoginModuleType.USER_ASSERTION, null, cbh); c.login(); return c.getSubject(); } });
Java SEアプリケーションでは、ログイン・モジュールのスタックを使用してユーザーを認証できます。各モジュールではスタック内の他のモジュールとは無関係に独自の計算を実行でき、これらのモジュールはjps-config-jse.xml
ファイルに指定されています。
認証アルゴリズムでは、コンテキストがスタック内のログイン・モジュールをリストする順序を考慮して計算を実行するため、この順序は重要です。すぐに使用できる状態では、アイデンティティ・ストア・サービスはsystem-jazn-data.xml
ファイルに指定されています。サービスは、LDAPストアを使用するように再構成できます。
OPSS APIには、oracle.security.jps.service.login.LoginService
インタフェースが組み込まれており、これを使用するとJava SEアプリケーションでは、スタック内のすべてのログイン・モジュールだけでなく、その一部も所定の順序でコールできます。このインタフェースのLoginContext
に渡されるコンテキストにより、アプリケーションで使用するログイン・モジュールのスタックが決まります。
アイデンティティ・ストアのログイン・モジュールに関連付けられているクラスは、oracle.security.jps.internal.jaas.module.idstore.IdStoreLoginModule
クラスです。
このログイン・モジュールに固有のプロパティには、remove.anononymous.role
およびadd.application.role
があります。
このモジュールのインスタンスは、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>
次の各項では、Java SEアプリケーションでのこのモジュールの使用方法について説明します。
認証のためのアイデンティティ・ストア・ログイン・モジュールの使用
この項では、基本的なユーザー名とパスワードの認証のためのアイデンティティ・ストアのログイン・モジュールの使用方法について説明します。
次の例では、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.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.callback.*; import java.io.IOException; Subject sub = new Subject(); CallbackHandler cbh = new YourCallbackHandler(); LoginContext context = new LoginContext(appName, subject, cbh); context.login();
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
メソッドを実行するためのパーミッションを指定し、oracle.security.jps.callback.IdentityCallback
クラスを使用するコールバック・ハンドラを実装する必要があります。
次の例では、アサーションのログイン・モジュールで、保護されたメソッドを実行するための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>t </permissions> </grant>
次の例では、アサーションのログイン・モジュールを実行するための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>
次の例では、コールバック・ハンドラの実装を示します。
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", "password".toCharArray())); System.out.println("asserted user subject = " + loginModuleExample.assertUser("testUser")); } catch (Exception e) { e.printStackTrace(); } } }
アプリケーションでは、みなし実行操作としてアクションを実行することが必要になる場合がよくあります。OPSSでは、アサートされたユーザーのサブジェクトを使用して、そのユーザーが実行するかのようにアプリケーション・ロジックを実行できます。
次の各項では、OPSS SubjectSecurity
クラスを使用してみなし実行操作を実装する方法について説明します。
SubjectSecurityクラス
次に、このクラスを使用するシナリオをいくつか示します。
UC1 - スケジューラにより、ジョブの送信および実行が可能になります。このようなジョブは一度に送信された後、ある時点で実行されるため、ユーザーのアイデンティティをアサートし、ユーザーのコンテキストでスケジュールされたジョブを実行する必要があります。
UC2 - スケジュールされたジョブが、ジョブを完了するために他のエンティティBeanをコールするエンティティBeanによって実行され、ジョブを完了するためのコードはすべて、ユーザーのコンテキストで実行する必要があります。したがって、このコンテキストはコール・パスを介してエンティティBean間で伝播される必要があります。
UC3 - スケジュールされたジョブを実行するためのパーミッションは、ユーザーのアプリケーション・ロールに基づいています。この場合は、エンティティBean間のコード・パスにかかわらず、ユーザーのコンテキストではユーザーに付与されたアプリケーション・ロールを認識する必要があります。
UC4 - 認証されていないユーザーがジョブを送信する場合、ジョブ・メタデータは匿名ユーザーを保持する必要があります。最終的に、ジョブは匿名ユーザーによって実行される必要があります。
UC5 - アプリケーションで実行されるMBeanは、MBeanサーバー経由でUIからコールされます。MBean操作により、特定のユーザーとして実行する必要のある一連の診断テストがコールされます。
UC6 - アイデンティティがアサートされており、そのユーザーとして操作を実行するために使用できるユーザー・コンテキストがアサーションで作成されています。
プログラミングのガイドラインおよび推奨事項
SubjectSecurity
クラスでは、事前に計算されたサブジェクトが使用可能な場合または最初にユーザーをアサートする必要がある場合、コードを実行できます。アプリケーション・コンテキストを設定していない場合は、SubjectSecurity
クラスを使用する前に、そのIDを設定します。
AppSecurityContext.setApplicationID(applicationID)
アプリケーション・コンテキストを設定した場合は、setApplicationID
へのコールはオプションです。
SubjectSecurity
クラスを使用したプログラミングでは、次のようにします。
サブジェクトをすでに取得しており、サブジェクトを使用して操作を実行する場合は、SubjectSecurity.getActionExecutor(subject)
を使用します。
SubjectUtil.getCurrentSubject
メソッドを使用してサブジェクトを取得した場合、そのサブジェクトはコンテナ・セキュリティおよびOPSSと連動し、アプリケーション・ロールが考慮されます。
JpsLoginModuleFactory
クラスを使用してプログラムでサブジェクトを取得した場合、そのサブジェクトはコンテナ・セキュリティおよびOPSSと連動します。
ユーザー名のみが使用可能で、そのユーザーとして操作を実行する場合は、SubjectSecurity.getActionExecutor(userName)
を使用します。このメソッドを使用するには、次のようにコードソース・パーミッションを指定します。
<grant> <grantee> <codesource> <url>file:${domain.home}/servers/${weblogic.Name}/myApp.ear/-</url> </codesource> </grantee> <permissions> <permission> <class>oracle.security.jps.JpsPermission</class> <name>IdentityAssertion</name> <actions>execute</actions> </permission> </permissions> </grant>
url
では、メソッドをコールするコードの場所を指定します。
ActionExecutor.execute(PrivilegedAction)
が、サブジェクトおよびアプリケーションのPrivilegedAction
を使用してSubject.doAs
をコールすることに注意します。
SubjectSecurity.executeAs(Subject subject, PrivilegedAction<T> action)
を使用して、アクションを即時に実行します。
SubjectSecurity.executeAs(Subject subject, PrivilegedExceptionAction<T> action)
を使用して、アクションを即時に実行します。このメソッドでは、getActionExecutor
メソッドを使用してアクション・エグゼキュータを取得し、アクションを実行します。
oracle.security.jps.runtime.SubjectSecurity
クラスおよびoracle.security.jps.runtime.ActionExecutor
インタフェースの詳細は、『Oracle Platform Security ServicesのJava APIリファレンス』を参照してください。
SubjectSecurityの使用
次の例では、SubjectSecurity
クラスを使用して、アサートされたjdoe
ユーザーとして実行する方法を示します。
// get a SubjectSecurity instance final SubjectSecurity subjectSecurity = SubjectSecurity.getInstance(); String username = "jdoe"; // create ActionExecutor with subjectSecurity getActionExecutor(String username) ActionExecutor executor = AccessController.doPrivileged(new PrivilegedExceptionAction<ActionExecutor>() { public ActionExecutor run() throws AssertionException { return subjectSecurity.getActionExecutor(username); } }, null); // When OPSS subjects are available, // create ActionExecutor with SubjectSecurity getActionExecutor(Subject subject) Subject opssSubject = SubjectUtil.getCurrentSubject(); ActionExecutor ececutor = subjectSecurity.getActionExecutor(opssSubject); //run privilegedAction PrivilegedAction action = new MyPrivilegedAction(); executor.execute(action); //run PrivilegedExceptionAction PrivilegedExceptionAction exceptionAction = new MyPrivilegedExceptionAction(); try { executor.execute(exceptionAction); } catch (PrivilegedActionException e) { // handle PrivilegedActionException }
Java SEアプリケーションでログイン・モジュールをコールするには、oracle.security.jps.service.login.LoginService
インタフェースのgetLoginContext
メソッドを使用します。
標準のJava Authorization and Authentication Services (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>
ファイル・ストア、LDAPストアまたはデータベース・ベースのストアをJava SEアプリケーションで使用して、すべてのサービスをjps-config-jse.xml
ファイルで構成します。このファイルでは、アプリケーションに適したシステム・プロパティも設定します。
次の各項では、ポリシー・ストアおよび資格証明ストアの構成について説明します。
関連項目:
ファイル・ポリシー・ストアは、system-jazn-data.xml
ファイルに指定されています。ファイル資格証明ストアは、cwallet.sso
ファイルに指定されています。
次の例では、ポリシーおよび資格証明の構成を示します。
<serviceProviders> <serviceProvider type="CREDENTIAL_STORE" name="credstoressp" class="oracle.security.jps.internal.credstore.ssp.SspCredentialStoreProvider"> <description>SecretStore-based CSF Provider</description> </serviceProvider> <serviceProvider type="POLICY_STORE" name="policystore.xml.provider" class="oracle.security.jps.internal.policystore.xml.XmlPolicyStoreProvider"> <description>XML-based PolicyStore Provider</description> </serviceProvider> </serviceProviders> <serviceInstances> <serviceInstance name="credstore" provider="credstoressp" location="./"> <description>File Credential Store Instance</description> </serviceInstance> <serviceInstance name="policystore.xml" provider="policystore.xml.provider" location="./system-jazn-data.xml"> <description>File Policy Store Service Instance</description> <property name="oracle.security.jps.policy.principal.cache.key" value="false"/> </serviceInstance> </serviceInstances> <jpsContexts default="TestJSE"> <jpsContext name="TestJSE"> <serviceInstanceRef ref="credstore"/> <serviceInstanceRef ref="policystore.xml"/> ... </jpsContext> </jpsContexts>
ポリシー・ストアのインスタンスでoracle.security.jps.policy.principal.cache.key
プロパティをfalse
に設定する必要があることに注意してください。
関連項目:
『インフラストラクチャ・セキュリティWLSTコマンド・リファレンス』のmodifyBootStrapCredentialおよびaddBootStrapCredential
この項の例では、ドメインでLDAPストアを使用することを前提としています。
次の例では、Java SEアプリケーション用のプロバイダ、インスタンスおよびコンテキストの構成を示しています。
<serviceProviders <serviceProvider type="POLICY_STORE" mame="ldap.policystore.provider" class=oracle.security.jps.internal.policystore.ldap.LdapPolicyStoreProvider"/> <serviceProvider type="CREDENTIAL_STORE" mame="ldap.credential.provider" class=oracle.security.jps.internal.credstore.ldap.LdapCredentialStoreProvider"/> </serviceProviders> <serviceInstances> <serviceInstance provider="ldap.policystore.provider" name="policystore.ldap"> <property value="OID" name="policystore.type"/> <property value="bootstrap" name="bootstrap.security.principal.key"/> <property value="cn=PS1domainRC3" name="oracle.security.jps.farm.name"/> <property value="cn=myTestNode" name="oracle.security.jps.ldap.root.name"/> <property value="ldap://myComp.com:1234" name="ldap.url"/> </serviceInstance> <serviceInstance provider="ldap.credential.provider" name="credstore.ldap"> <property value="bootstrap" name="bootstrap.security.principal.key"/> <property value="cn=PS1domainRC3" name="oracle.security.jps.farm.name"/> <property value="cn=myTestNode" name="oracle.security.jps.ldap.root.name"/> <property value="ldap://myComp.com:1234" name="ldap.url"/> </serviceInstance> </serviceInstances>
<serviceInstance location="./bootstrap" provider="credstoressp" name="bootstrap.cred"> <property value="./bootstrap" name="location"/> </serviceInstance>
<jpsContexts default="TestJSE"> <jpsContext name="TestJSE"> <serviceInstanceRef ref="policystore.ldap"/> <serviceInstanceRef ref="credstore.ldap"/> </jpsContext> <jpsContext name="bootstrap_credstore_context"> <serviceInstanceRef ref="bootstrap.cred"/> </jpsContext> </jpsContexts>
次の例では、セキュリティ・ストアへの参照をプログラムで取得する方法を示しますが、システム・プロパティoracle.security.jps.config
がjps-config-jse.xml
ファイルの場所に設定されていることを前提としています。
String contextName="TestJSE"; public static PolicyStore getPolicyStore(String contextName) { try-block JpsContextFactory ctxFact; ctxFact = JpsContextFactory.getContextFactory(); JpsContext ctx = ctxFact.getContext(contextName); return ctx.getServiceInstance(PolicyStore.class); catch-block ...
この項では、jps-config-jse.xml
ファイルでのデータベース・ベースのポリシー、資格証明およびキーストアの構成例を示します。この例では、次の点に注意してください。
jdbc.url
プロパティの値は、データ・ソース作成時に入力したJava Database Connectivity (JDBC)データ・ソースの名前と同じにする必要があります。
ブートストラップ資格証明(マップとキー)の値は、ブートストラップ資格証明の作成時にaddBootStrapCredential
WebLogic Scripting Tool (WLST)コマンドに渡した値と一致する必要があります。
<jpsConfig …> <propertySets> <propertySet name="props.db.1"> <property value="cn=myDomain" name="oracle.security.jps.farm.name"/> <property value="DB_ORACLE" name="server.type"/> <property value="cn=myRoot" name="oracle.security.jps.ldap.root.name"/> <property name="jdbc.url" value="jdbc:oracle:thin:@myhost.com:1521/srv_name"/> <property name="jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/> <property name="bootstrap.security.principal.key" value="myKeyName" /> <property name="bootstrap.security.principal.map" value="myMapName" /> </propertySet> </propertySets> <serviceProviders> <serviceProvider class="oracle.security.jps.internal.policystore.OPSSPolicyStoreProvider" type="POLICY_STORE" name="policy.rdbms"> <description>DBMS based PolicyStore</description> </serviceProvider> <serviceProvider class="oracle.security.jps.internal.credstore.rdbms.DbmsCredentialStoreProvider" type="CREDENTIAL_STORE" name="db.credentialstore.provider" > <serviceProvider class="oracle.security.jps.internal.keystore.KeyStoreProvider" type="KEY_STORE" name="keystore.provider" > <property name="provider.property.name" value="owsm"/> </serviceProvider> </serviceProviders> <serviceInstances> <serviceInstance name="policystore.rdbms" provider="db.policystore.provider"> <propertySetRef ref = "props.db.1"/> <property name="policystore.type" value="DB_ORACLE"/> </serviceInstance> <serviceInstance name="credstore.rdbms" provider="db.credstore.provider"> <propertySetRef ref = "props.db.1"/> </serviceInstance> <serviceInstance name="keystore.rdbms" provider="db.keystore.provider"> <propertySetRef ref = "props.db.1"/> <property name="keystore.provider.type" value="db"/> </serviceInstance> </serviceInstances> <jpsContexts default="default"> <jpsContext name="default"> <serviceInstanceRef ref="policystore.rdbms"/> <serviceInstanceRef ref="credstore.rdbms"/> <serviceInstanceRef ref="keystore.rdbms"/> </jpsContext> </jpsContexts> </jpsConfig>
ファイル・ストアでは、カスケード削除が含まれるメソッドはサポートされていません。サポートされているのは、単純な問合せのみです。
次の例では、表示名がMyDisplayName
に一致するパーミッションをすべて返す単純な問合せを示します。
PermissionSetSearchQuery query = new PermissionSetSearchQuery(); query.addQuery(PermissionSetSearchQuery.SEARCH_PROPERTY.DISPLAY_NAME, false, ComparatorType.EQUALITY, "MyDisplayName", BaseSearchQuery.MATCHER.EXACT); getPermissionSets(query);
カスケード削除は、シグネチャにブール型のcascadeDelete
引数が含まれるメソッドと関連があります。ファイル・ストアの場合に指定できる唯一の値は、false
です。
次の各項では、Oracle Platform Security Services共通監査フレームワークを使用してJava SEアプリケーションでイベントを監査する方法について説明し、一般的な監査使用シナリオをいくつか示します。
関連項目:
Java SEアプリケーションでは、監査構成を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>
監査により、アプリケーションではバスストップ・ファイルに記録される特定のランタイム・イベントを取得できます。監査ローダーは、データをバスストップ・ファイルから監査ストアに定期的に移動します。
バスストップ・ファイル名は、sample.myhost.com_12345_audit_1_0.log
のように、host_pid_audit_major_minor.log
形式で指定します。ホスト名、プロセスIDおよびバージョン番号がファイル名に組み込まれていることに注意してください。
Java SEアプリケーションでは、サービスが監査バスストップ・ファイルを書き込む、書込み可能なディレクトリを使用する必要があります。この場所を指定するには、setAuditRepository
WLSTコマンドを使用してaudit.logDirectory
プロパティを設定するか、システム・プロパティopss.audit.logDirectory
を設定します。実行時プロセスが書込み可能なディレクトリを特定できない場合、監査が機能しない可能性があります。
Java SEアプリケーションでは、audit.logDirectory
プロパティを使用して設定し、環境内のすべてのJava SEアプリケーションで同じjps-config-jse.xml
ファイルを使用するか、同じ値をすべてのJava SEアプリケーションにシステム・プロパティとして渡すと、バスストップ・ファイルを共有できます。
関連項目:
『インフラストラクチャ・セキュリティWLSTコマンド・リファレンス』のsetAuditRepository
監査ローダーは、バスストップ・ファイルからデータベースに監査データを移動するプロセスです。システム・プロパティaudit.loader.repositoryType
は、Java EEアプリケーションおよびJava SEアプリケーションで設定する必要があります。デフォルトでは、databaseに設定されています。
Java SEアプリケーションでは、次の2種類のローダーを使用できます。
監査ローダー: ランタイム監査によって開始されるスレッドです。すぐに使用できる状態では、監査ローダーは無効になっており、有効にするにはaudit.loader.enable=true
と設定します。
Java SEアプリケーション用のスタンドアロン監査ローダー: 特に共有ディレクトリを使用する場合にお薦めします。
関連項目:
次の各項では、Java SEアプリケーションで監査を実装する一般的なシナリオを説明します。WebLogic Serverが一緒に配置されている環境と一緒に配置されていない環境について考えます。一緒に配置されている環境とは、Java Required Files (JRF)がインストールされているWebLogic Serverドメインのことです。