24 OPSSを使用するためのJava SEアプリケーションの構成
この章の内容は次のとおりです。
- Java SEアプリケーションでのOPSSの使用
- Java SEアプリケーションでのセキュリティ・サービスの実装
- Java SEアプリケーションでの認証
- Java SEアプリケーションでの認可
- Java SEアプリケーションでの監査
親トピック: OPSS APIを使用した開発
Java SEアプリケーションでのOPSSの使用
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クラス
次の各項では、JpsStartupクラスの状態、ランタイム・オプションおよび使用例について説明します。
親トピック: Java SEアプリケーションでのOPSSの使用
JpsStartup.startの状態
JpsStartup.startメソッドの遷移状態は、次の定数で定義されます。
-
UNINITIALIZED-JpsStartup.startをコールする前の状態。 -
INITIALIZING-JpsStartup.startがコールされた後、この状態に遷移します。 -
FAILURE-INITIALIZING状態でエラーが発生した場合、この状態に遷移します。 -
ACTIVE-INITIALIZING状態が正常に完了した場合、この状態に遷移します。 -
INACTIVE-JpsStatup.stopメソッドがコールされた後、この状態に遷移します。
JpsStartup.getStateメソッドは、現在のOPSSの状態を返します。
親トピック: JpsStartupクラス
JpsStartupのコンストラクタ
クラスには次のコンストラクタが含まれます。
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クラス
JpsStartupのランタイム・オプション
次の表は、jpsStartupメソッドで使用するオプションの説明をまとめたものです。
表24-1 JpsStartupのランタイム・オプション
| オプション | 値 | デフォルト値 | 説明 |
|---|---|---|---|
|
|
アクティブなコンテキストの名前。 |
default |
指定されたコンテキストを使用します。それ以外の場合は、デフォルトのコンテキストを使用します。 |
|
|
|
|
ポリシー・プロバイダを使用する場合は |
|
|
|
|
サービスの起動時に監査モニタリングおよび監査ローダーを起動する場合は |
|
|
|
|
ポリシー変更とともにポリシー配布ポイント(PDP)を起動する場合は |
|
|
|
|
デプロイメント・ハンドラを作成する場合は |
|
|
|
|
次のオプションを
それ以外の場合は、 |
|
|
|
指定されたパスを使用します。それ以外の場合は、デフォルトのパスを使用します。 |
親トピック: JpsStartupクラス
OPSS起動例
この項では、一般的なシナリオでの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();親トピック: JpsStartupクラス
Java SEアプリケーションでの認証
次の各項では、Java SEアプリケーションでのアイデンティティ・ストアのサポートについて説明します。
Java SEアプリケーションでのLDAPアイデンティティ・ストアの構成
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 SEアプリケーションでの認証
Javaアプリケーションでのログイン・モジュールの使用
特に指定のないかぎり、この項の情報は、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 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アプリケーションでのログイン・モジュールの使用
ユーザー・アサーションのログイン・モジュール
ユーザー認証のログイン・モジュールは、アイデンティティ・ストア内のユーザー・アイデンティティをアサートするために、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アプリケーションでのログイン・モジュールの使用
アイデンティティ・ストアのログイン・モジュール
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();
}
}
}親トピック: Javaアプリケーションでのログイン・モジュールの使用
アサートされたユーザー
アプリケーションでは、みなし実行操作としてアクションを実行することが必要になる場合がよくあります。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アプリケーションでのログイン・モジュールの使用
Java SEアプリケーションでのログイン・モジュールの使用
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>親トピック: Java SEアプリケーションでの認証
Java SEアプリケーションでの認可
ファイル・ストア、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
親トピック: Java SEアプリケーションでの認可
ポリシーおよび資格証明のLDAPストアの構成
この項の例では、ドメインで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 ...
親トピック: Java SEアプリケーションでの認可
データベース・ベースのセキュリティ・ストアの構成
この項では、jps-config-jse.xmlファイルでのデータベース・ベースのポリシー、資格証明およびキーストアの構成例を示します。この例では、次の点に注意してください。
-
jdbc.urlプロパティの値は、データ・ソース作成時に入力したJava Database Connectivity (JDBC)データ・ソースの名前と同じにする必要があります。 -
ブートストラップ資格証明(マップとキー)の値は、ブートストラップ資格証明の作成時に
addBootStrapCredentialWebLogic 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>
親トピック: Java SEアプリケーションでの認可
ファイル・ストアでサポートされていないメソッド
ファイル・ストアでは、カスケード削除が含まれるメソッドはサポートされていません。サポートされているのは、単純な問合せのみです。
次の例では、表示名がMyDisplayNameに一致するパーミッションをすべて返す単純な問合せを示します。
PermissionSetSearchQuery query = new PermissionSetSearchQuery(); query.addQuery(PermissionSetSearchQuery.SEARCH_PROPERTY.DISPLAY_NAME, false, ComparatorType.EQUALITY, "MyDisplayName", BaseSearchQuery.MATCHER.EXACT); getPermissionSets(query);
カスケード削除は、シグネチャにブール型のcascadeDelete引数が含まれるメソッドと関連があります。ファイル・ストアの場合に指定できる唯一の値は、falseです。
親トピック: Java SEアプリケーションでの認可
Java SEアプリケーションでの監査
次の各項では、Oracle Platform Security Services共通監査フレームワークを使用してJava SEアプリケーションでイベントを監査する方法について説明し、一般的な監査使用シナリオをいくつか示します。
関連項目:
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>
監査により、アプリケーションではバスストップ・ファイルに記録される特定のランタイム・イベントを取得できます。監査ローダーは、データをバスストップ・ファイルから監査ストアに定期的に移動します。
親トピック: Java SEアプリケーションでの監査
監査のバスストップ・ディレクトリの構成
バスストップ・ファイル名は、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
親トピック: Java SEアプリケーションでの監査
監査ローダーの構成
監査ローダーは、バスストップ・ファイルからデータベースに監査データを移動するプロセスです。システム・プロパティaudit.loader.repositoryTypeは、Java EEアプリケーションおよびJava SEアプリケーションで設定する必要があります。デフォルトでは、databaseに設定されています。
Java SEアプリケーションでは、次の2種類のローダーを使用できます。
-
監査ローダー: ランタイム監査によって開始されるスレッドです。すぐに使用できる状態では、監査ローダーは無効になっており、有効にするには
audit.loader.enable=trueと設定します。 -
Java SEアプリケーション用のスタンドアロン監査ローダー: 特に共有ディレクトリを使用する場合にお薦めします。
関連項目:
親トピック: Java SEアプリケーションでの監査
Java SEアプリケーションでの一般的な監査シナリオ
次の各項では、Java SEアプリケーションで監査を実装する一般的なシナリオを説明します。WebLogic Serverが一緒に配置されている環境と一緒に配置されていない環境について考えます。一緒に配置されている環境とは、Java Required Files (JRF)がインストールされているWebLogic Serverドメインのことです。
WebLogic Serverが一緒に配置されていない場合の監査の構成
次のタスクでは、ミドルウェア・ホームが使用できますが、WebLogic Serverが実行されていないため、Fusion Middleware ControlもsetAuditRepository WLSTコマンドも使用できないことを前提としています。
この場合、監査を設定するには、次の手順を実行します。
関連項目:
親トピック: Java SEアプリケーションでの一般的な監査シナリオ