Oracle Containers for J2EE
セキュリティ・ガイド
10g(10.1.3.4.0) B50832-01 |
|
OC4J 10.1.3.x実装は、様々なアイデンティティ管理リポジトリにあるユーザーとロールの情報にアクセスするための新しいプラッガブルなアイデンティティ管理APIフレームワークを提供します。これは、第13章で説明するプラッガブルなアイデンティティ管理フレームワークとは無関係です。そこで、このフレームワークとの混同を避けるため、この章ではこのAPIを「ユーザーおよびロールAPI」と呼びます。
このAPIには、com.evermind.security
パッケージの非推奨クラスであるUserManager
、User
およびGroup
にかわる機能が含まれています。
この章の内容は次のとおりです。
ユーザーおよびロールAPIフレームワークを使用すると、基礎となるアイデンティティ・リポジトリの種類に関係なく、一貫した移植可能な方法でアプリケーションがアイデンティティ情報(ユーザーおよびロール)にアクセスできます。基礎となるリポジトリは、Oracle Internet Directory、Active Directory(Microsoft社提供)、Sun Java System Directory Server(Sun社提供)などのLDAPディレクトリ・サーバー、データベース、フラット・ファイルまたは他のカスタム・リポジトリのいずれでも可能です。
このAPIフレームワークは、移植可能な方法でプログラムからリポジトリにアクセスするための便利な手段を提供します。その結果としてアプリケーション開発者は、個々のアイデンティティ・ソースの複雑さを考慮するという困難な作業から解放されます。このフレームワークにより、様々なリポジトリに対してアプリケーションがシームレスに動作するようになります。アプリケーションは、コードを一切変更することなく、各種アイデンティティ・リポジトリ間の切替えができます。
サポートされている操作には、ユーザーとロールの作成、更新、削除、ユーザーとロールの属性の検索、関連情報の検索があります。たとえば、特定のロールに属するすべてのユーザーの電子メール・アドレスを検索できます。これらのAPIは、認証または認可機能用ではありません。
基本使用モデル(OC4J統合なし)またはコードを移植可能にするOC4J統合の使用モデルが使用できます。
ユーザーおよびロールAPIには、非推奨のcom.evermind.security.UserManager
、User
、Group
の各クラスの機能にかわる機能が含まれています。
UserManager
機能は、アイデンティティ・リポジトリ内でユーザーとロールを作成、変更、取得するユーザーおよびロールAPIの機能によって置き換えられます。
User
機能は、ユーザー・ロールを取得または変更(ロールへのユーザーの割当てなど)するユーザーおよびロールAPIの機能によって置き換えられます。(User
クラスの認証機能は、DBTableOraDataSourceLoginModule
(「DBTableOraDataSourceLoginModule」を参照)によって置き換えられます。)
Group
機能は、ロールを取得するユーザーおよびロールAPIの機能によって置き換えられます。(ロールにパーミッションを付与するGroup
クラスの機能は、OracleAS JAAS Providerポリシー管理APIの機能(「パーミッションの付与または取消しを行うOracleAS JAAS Provider API」を参照)によって置き換えられます。)
ユーザーおよびロールAPIは、JNDIに似たフレームワークとプロバイダ・モデルに基づいています。
このフレームワークは、アイデンティティ情報にアクセスするための汎用的なメカニズムを規定し、Javaインタフェースのみで構成されます。実装の詳細は提供しません。
各プロバイダ(OC4J付属)は、特定のリポジトリの情報にアクセスする(Active Directoryからアイデンティティ情報を読み取る場合など)ための特定の実装クラスにより、フレームワーク・インタフェースを実装します。アイデンティティ・リポジトリのタイプごとに、対応するプロバイダが存在します。
アプリケーション開発者は、汎用フレームワークに基づいてコードを作成します。その後の構成手順で、アプリケーションは目的のアイデンティティ・リポジトリに対する適切なプロバイダにプラグインされます。別のリポジトリを使用するよう、後からアプリケーションを更新することができます。その場合、対応するプロバイダを使用するようにアプリケーションを再構成するだけです。アプリケーション・コードを変更する必要はありません。
OC4Jには、Oracle Internet Directory、Active Directory、Sun Java System Directory Server(以前のiPlanet)、Novell eDirectory、OpenLDAP(オープン・ソースのLDAPディレクトリ)用の各プロバイダが付属しています。次の図12-1は、数個の特定のプロバイダに対するフレームワークを表しています。
この項では、ユーザーおよびロールAPIパッケージoracle.security.idm
のインタフェースとクラスの概要を説明します。
この項では、oracle.security.idm
パッケージのインタフェースの概要を説明します。
アイデンティティ・リポジトリに対するインタフェースは次のとおりです。
IdentityStore
: IdentityStore
インスタンスは、アイデンティティ・リポジトリへのハンドルを表します。次の機能に対してメソッドが指定されます。
IdentityStoreFactory
: IdentityStoreFactory
インスタンスは、基礎となるアイデンティティ・リポジトリを表します。また、IdentityStore
インスタンスを取得するメソッドを含んでおり、このインスタンスの生成に必要なプロバイダ固有のプロパティから構成されるハッシュテーブルを入力として取ります。
アイデンティティ・リポジトリ内のユーザー・エントリに対するインタフェースは次のとおりです。
User
: User
インスタンスは、アイデンティティ・ストア内のユーザーを表します。これはIdentity
のサブインタフェースであり、ユーザー・プロファイルを取得するメソッドを指定します。このインタフェースは、UserProfile
のスーパーインタフェースでもあります。
UserProfile
: UserProfile
インスタンスは、ユーザーに関する詳細情報を表し、アクセス頻度の高いプロパティ(名前、肩書き、従業員番号、上司、住所、電子メール・アドレス、電話番号、FAX番号、携帯電話番号など)の定数を格納します。これは、User
のサブインタフェースです。このインタフェースは、これらの一般的なプロパティを取得および設定するメソッドと、さらに一般的なメソッドであるgetProperty()
、getProperties()
、setProperty()
、setProperties()
を指定します。setProperty()
メソッドとsetProperties()
メソッドは、oracle.security.idm.ModProperty
クラス(後述)のインスタンスを取ります。
UserManager
: UserManager
インスタンスは、ユーザーに関係する操作の実行など、リポジトリ内のユーザー・コミュニティの管理に使用されます。これには、ユーザーの作成、認証、削除などがあります。
アイデンティティ・リポジトリ内のロールに対するインタフェースは次のとおりです。
Role
: Role
インスタンスは、アイデンティティ・ストア内のロールを表します。これはIdentity
のサブインタフェースであり、ロール・プロファイルを取得するメソッドを指定します。このインタフェースは、RoleProfile
のスーパーインタフェースでもあります。
RoleProfile
: RoleProfile
インスタンスは、ロールに関する詳細情報を表します。これはRole
のサブインタフェースであり、ロールの所有者を追加、削除、取得するメソッド、ロールが直接的または間接的に付与されたすべての権限受領者を取得するメソッド、ロールがアプリケーション・ロールかエンタープライズ・ロールかを判別するメソッドを指定します。
RoleManager
: RoleManager
インスタンスは、ロールに関係する操作の実行など、リポジトリ内のロール・コミュニティの管理に使用されます。これには、ロールの作成、ロールの削除、指定されたプリンシパルに対するロールの付与と取消しなどがあります。
この項では、oracle.security.idm
パッケージ内の主要なクラスの概要を説明します。
IdentityStoreFactoryBuilder
: このクラスのインスタンスは、アイデンティティ・ストア・ファクトリを構築する際に使用します。このクラスには、IdentityStoreFactory
インスタンスを取得するための、オーバーロードされたgetIdentityStoreFactory()
メソッドが含まれます。
この項では、基本的なAPIフレームワークとOC4J統合機能を使用するための手順を説明し、そのサンプルを示します。この項の内容は次のとおりです。
この項では、基本的なAPIフレームワークを使用する手順を説明します。手順1と2は主に構成に関連し、使用されるプロバイダとその構成を判別します。この2つの手順で示すコードは、アイデンティティ・リポジトリとプロバイダによって異なります。手順3でリポジトリに対して実行される操作は、汎用的な操作です。別のリポジトリに変更しても、このコードには影響しません。
関連項目
|
IdentityStoreFactory
インスタンスを取得します。このファクトリ・インスタンスはアイデンティティ・リポジトリを表し、IdentityStoreFactoryBuilder
インスタンスでgetIdentityStoreFactory()
コールを使用して作成されます。このコールは、特定のアイデンティティ・リポジトリに接続する際に使用されるプロバイダの名前を受け取ります。また、このプロバイダが必要とする構成情報も指定します。 たとえば、アプリケーションでOracle Internet Directoryに接続する必要があるとします。Oracle Internet Directoryのプロバイダ名は次のとおりです。
oracle.security.idm.providers.oid.OIDIdentityStoreFactory
Oracle Internet DirectoryなどのLDAPプロバイダには、LDAPのURL、セキュリティ・プリンシパル、資格証明などの構成情報が必要です。次に例を示します。
IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder(); IdentityStoreFactory oidFactory = null; Hashtable factEnv = new Hashtable(); // creating the factory instance // set the configuration information factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL, "cn=orcladmin"); factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS, "welcome1"); factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL, "ldap://ilinabc10.us.oracle.com:3060/"); factEnv.put(OIDIdentityStoreFactory.ST_LOGGING,"false"); factEnv.put(OIDIdentityStoreFactory.ST_LOG_LEVEL, java.util.logging.Level.ALL); oidFactory = builder.getIdentityStoreFactory( "oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv);
IdentityStore
インスタンスを取得し、リポジトリで操作を実行します。これを取得するには、IdentityStoreFactory
インスタンスでgetIdentityStoreInstance()
コールを使用します。このコールは、アイデンティティ・ストア・インスタンスの作成に必要な構成情報を受け取ることができます。たとえばOracle Internet Directoryの場合、次の例で示すように、操作が実行されるサブスクライバまたはレルムの名前を指定する必要があります。
Hashtable storeEnv = new Hashtable(); // creating the store instance storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME, "dc=us,dc=oracle,dc=com"); oidStore = oidFactory.getIdentityStoreInstance(storeEnv);
IdentityStore
インスタンスを使用して、エントリの検索、更新、作成、削除などの操作をアイデンティティ・リポジトリで実行します。たとえば次のコードでは、名前がjohn
で始まるすべてのユーザーが検索されます。
// search filter for users whose name begins with "john" SimpleSearchFilter sf = oidStore.getSimpleSearchFilter( UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null); // Add the wildcard character sf.setValue("john"+sf.getWildCardChar()); // generate the search parameter instance and set the search filter SearchParameters params = new SearchParameters(); params.setFilter(sf); // Searching for users // search on the IdentityStore instance SearchResponse resp = oidStore.searchUsers(params); System.out.println("Searched users are:"); // Iterate on the search results while (resp.hasNext() { User usr = (User) resp.next(); System.out.println("Name: "+usr.getName()); }
前項の「手順説明: 基本の使用モデル」で説明したように、構成に関連するコードはアイデンティティ・リポジトリとそれに関連するプロバイダによって制限されるため、アプリケーションで使用するアイデンティティ・リポジトリを変更する場合は、コードも必ず変更する必要があります。
コードを移植可能にするには、APIフレームワークのOC4J統合機能を使用します。この機能は、アプリケーションのOC4Jログイン・モジュールにあるセキュリティ・プロバイダ情報を使用するため、アプリケーションでリポジトリやプロバイダの構成を指定する必要がなくなります。その結果、アプリケーション・コードは汎用的になり、ログイン・モジュール構成でセキュリティ・プロバイダ情報を変更するだけで、アプリケーションで使用するアイデンティティ・ソースを変更できるようになります。
重要
OC4J統合機能はセキュリティに関連する操作であるため、アプリケーションに必要なパーミッションが設定されている必要があります。 |
OC4J統合機能は、次の手順で使用します。
userrole.properties
)へのパスを、次のようにJavaシステム・プロパティとして指定する必要があります。
System.setProperty("oracle.userrole.properties", "/home/jdoe/userrole.properties");
プロパティ・ファイルには、フレームワークでOC4Jログイン・モジュール情報へアクセスする際に必要な設定が格納されています。プロパティ・ファイルの形式は、「ユーザーおよびロール・プロパティ・ファイル」で示しています。
IdentityStoreFactory
インスタンスの作成は権限を必要とする操作であり、次のようにAccessController.doPrivileged()
ブロック内で実行する必要があります。
IdentityStoreFactory factory = null; try { factory = (IdentityStoreFactory) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws IMException { IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder(); return builder.getIdentityStoreFactory(); } }); }catch (PrivilegedActionException e) { e.getException().printStackTrace(out); } catch (Exception e) { e.printStackTrace(out); }
IdentityStore
インスタンスは簡単に取得できます。
IdentityStore store = factory.getIdentityStoreInstance();
OC4J統合機能はセキュリティに関連する操作であるため、アプリケーション・コードに一定のパーミッションが必要となります。具体的には、IdentityStoreFactoryBuilder
クラスのgetIdentityStoreFactory()
メソッドで、一定のパーミッションを必要とするAPIコールが行われます。
OC4Jのjava2.policy
ファイルで、次のパーミッションをアプリケーション・コードベースに付与します。
grant codebase "file:${oracle.home}/application_code_base" { permission oracle.security.jazn.JAZNPermission "*"; };
Java 2ポリシーを使用するには、セキュリティ・マネージャを有効にする必要があることに注意してください(「Java 2セキュリティ・マネージャおよびポリシー・ファイルの指定」を参照)。
OC4J統合機能を使用するには、Javaシステム・プロパティとして表されているユーザー/ロール・プロパティ・ファイルへのパスを、APIフレームワークが認識する必要があります。プロパティ・ファイルには、必要なOC4Jログイン・モジュール情報へアクセスする際にフレームワークが必要とするプロパティが格納されています。このファイルには任意の名前を指定できますが、ファイル形式は次のようにする必要があります。
# This line should not be changed. configurationsourceclass=oracle.security.idm.util.OC4JConfigurationSource # This property specifies the JMX Mbean URL for the OC4J container in which the # application is deployed. # For OPMN-managed OC4J, uncomment the URL that follows; comment out all others. # format: service:jmx:rmi:///opmn://opmnhost[:opmnport]/oc4jInstance jmxserviceurl=service:jmx:rmi:///opmn://localhost:6008/home # For standalone OC4J, uncomment the URL that follows; comment out all others. # format: service:jmx:rmi:///opmn://oc4jhost:rmiport/oc4jContextRoot #jmxserviceurl=service:jmx:rmi://localhost:23791/oc4j/
この項では、「手順説明: 基本の使用モデル」で説明した手順に対応する完全な例を示します。
import oracle.security.idm.*; import oracle.security.idm.providers.oid.*; import java.util.*; import java.io.*; public class BasicSampleOID { public static void main(String args[]) { IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder(); IdentityStoreFactory oidFactory = null; IdentityStore oidStore = null; try { Hashtable factEnv = new Hashtable(); Hashtable storeEnv = new Hashtable(); // creating the factory instance factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL, "cn=user,...."); factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS, "password"); factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL, "ldap://johnmc.us.oracle.com:3060/"); factEnv.put(OIDIdentityStoreFactory.ST_LOGGING,"false"); factEnv.put(OIDIdentityStoreFactory.ST_LOG_LEVEL, java.util.logging.Level.ALL); oidFactory = builder.getIdentityStoreFactory( "oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv); // creating the store instance storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME, "dc=us,dc=oracle,dc=com"); oidStore = oidFactory.getIdentityStoreInstance(storeEnv); // search filter (cn=a*) SimpleSearchFilter sf = oidStore.getSimpleSearchFilter( UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null); sf.setValue("john"+sf.getWildCardChar()); SearchParameters params = new SearchParameters(); params.setFilter(sf); // Searching for users SearchResponse resp = oidStore.searchUsers(params); System.out.println("Searched users are:"); while (resp.hasNext()) { User usr = (User) resp.next(); System.out.println("Name: "+usr.getName()); } }catch (IMException e) { e.printStackTrace(); } } }
この項では、「手順説明: OC4J統合の使用モデル」で説明した手順に対応する完全な例を示します。
import java.io.*; import java.util.*; import java.security.AccessController; import java.security.PrivilegedExceptionAction; import java.security.PrivilegedActionException; // Packages for Servlets import javax.servlet.*; import javax.servlet.http.*; import oracle.security.idm.*; public class UserSearch extends HttpServlet { private String USERROLEPROPFILE = "UserRolePropFile"; IdentityStore store = null; public void init(ServletConfig config) throws ServletException { super.init(config); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = ""; String searchType = "usersearch"; try { name = request.getParameter("name"); searchType = request.getParameter("searchtype"); } catch (Exception e) { e.printStackTrace(); } String filter = (name != null)? name: ""; response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>UserSearch</title></head>"); out.println("<body>"); out.println( "<label for=\"fld\"><b>User name begining with</b></label>"); out.println( "<form action=\"usersearch\">"+ "<P><select name=\"searchtype\" size=\"1\">"+ "<option value=\"usersearch\">Search Users</option>"+ "<option value=\"rolesearch\">Search Roles</option>"+ "<option value=\"membershipsearch\">Search Membership details"+ "<option value=\"membersearch\">Searchs Members of role"+ "</option></select></P>"+ "<input name=\"name\" id=\"fld\" value=\"" + filter + "\"type=\"text\"/><input type=\"SUBMIT\" value=\"Search\"/></form>"); out.println("<br><br><br>"); // Create the IdentityStore instance required for searching configureAPI(out); // Carries out the actual search using IdentityStore instance obtained // above doSearch(out, searchType, name); out.println("</body></html>"); out.close(); } public void configureAPI(PrintWriter out) { IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder(); // Set the following system property to specify the location of // "userrole.properties" file. This file is used by user-role apis for // reading the configuration from OC4J // Get the file location from the servlet init parameters System.setProperty("oracle.userrole.properties", getServletConfig().getInitParameter(USERROLEPROPFILE)); IdentityStoreFactory factory = null; try { factory = (IdentityStoreFactory) AccessController.doPrivileged( new PrivilegedExceptionAction() { public Object run() throws IMException { IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder(); return builder.getIdentityStoreFactory(); } }); store = factory.getIdentityStoreInstance(); }catch (PrivilegedActionException e) { e.getException().printStackTrace(out); } catch (Exception e) { e.printStackTrace(out); } } public void doSearch(PrintWriter out, String searchType, String name) { System.out.println("Inside doSearch"); if (name == null) return; if (searchType.equals("usersearch")) searchUsers(out, name); else if (searchType.equals("rolesearch")) searchRoles(out, name); else if (searchType.equals("membershipsearch")) searchMembership(out, name); else if (searchType.equals("membersearch")) searchMembers(out, name); } public void searchMembers(PrintWriter out, String name) { System.out.println("Inside searchMembers"); if (name == null) return; out.println("Results: <br>"); try { Role rle = store.searchRole(IdentityStore.SEARCH_BY_NAME, name); out.println("Members of role \""+rle.getName()+ "\" are:<br>"); SearchResponse resp = rle.getRoleProfile().getGrantees(null, false); while (resp.hasNext()) { Identity idy = resp.next(); out.println("Unique name: " + idy.getUniqueName() + "<br>"); } } catch (IMException e) { e.printStackTrace(out); } } public void searchMembership(PrintWriter out, String name) { System.out.println("Inside searchMembership"); if (name == null) return; out.println("Results: <br>"); try { User usr = store.searchUser(name); out.println("Membership details for user \""+usr.getName()+ "\" are:<br>"); SearchResponse resp = store.getRoleManager().getGrantedRoles(usr.getPrincipal(), false); while (resp.hasNext()) { Identity idy = resp.next(); out.println("Unique name: " + idy.getUniqueName() + "<br>"); } } catch (IMException e) { e.printStackTrace(out); } } public void searchRoles(PrintWriter out, String name) { System.out.println("Inside searchRoles"); if (name == null) return; out.println("Results: <br>"); try { SimpleSearchFilter sf = store.getSimpleSearchFilter( RoleProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null); sf.setValue(name + sf.getWildCardChar()); SearchParameters params = new SearchParameters(); params.setFilter(sf); // Searching for users SearchResponse resp = store.searchRoles(0, params); out.println("Searched roles are:<br>"); while (resp.hasNext()) { Identity idy = resp.next(); out.println("Unique name: " + idy.getUniqueName() + "<br>"); } } catch (IMException e) { e.printStackTrace(out); } } public void searchUsers(PrintWriter out, String name) { System.out.println("Inside searchUsers"); if (name == null) return; out.println("Results: <br>"); try { SimpleSearchFilter sf = store.getSimpleSearchFilter( UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null); sf.setValue(name + sf.getWildCardChar()); SearchParameters params = new SearchParameters(); params.setFilter(sf); // Searching for users SearchResponse resp = store.searchUsers(params); out.println("Searched users are:<br>"); while (resp.hasNext()) { Identity idy = resp.next(); out.println("Unique name: " + idy.getUniqueName() + "<br>"); } } catch (IMException e) { e.printStackTrace(out); } } }
|
Copyright © 2003, 2008 Oracle Corporation. All Rights Reserved. |
|