Oracle Containers for J2EE セキュリティ・ガイド 10g(10.1.3.1.0) B31857-01 |
|
第2章「Javaプラットフォームのセキュリティ」では、3つの主要なJavaセキュリティ・モデルであるJ2EEロールベース・セキュリティ、Java 2コードベース・セキュリティおよびJAASサブジェクトベース・セキュリティの概要を説明しました。
この章では、これらの各モデルで認可機能を使用する方法について説明します。これらの機能は、単独でも組み合せても使用できます。章の最後に、セキュリティ・モデルの選択方法について説明します。
内容は次のとおりです。
この項では、Java 2(コードベース)セキュリティのセキュリティ・マネージャとポリシー・ファイルについて説明します。この項の内容は次のとおりです。
OC4Jおよび基礎となるJDKによってJava 2(コードベース)セキュリティ・ポリシーを強制するには、セキュリティ・マネージャ(java.lang.SecurityManager
インスタンス)を有効にする必要があります。これにより、たとえば、クラス・ローダーへのアクセス、JDKリソースへのアクセス、JDK APIの実行、JAAS APIの実行(Subject.doAs()
またはSubject.doAsPrivileged()
メソッドを実行できるかどうかなど)が影響を受ける可能性があります。セキュリティ・マネージャを有効にすると、Java 2ポリシー・ファイルに指定されたポリシーによって、実行元のコードがアクセス可能なリソースが判別されます。
セキュリティ・マネージャは、次のいずれかの方法で指定できます。
java.lang.System
クラスの静的なsetSecurityManager(SecurityManager)
メソッドをコールして、目的のセキュリティ・マネージャを指定します。
java.security.manager
を使用します。このときに、デフォルトのセキュリティ・マネージャを使用する設定を解除するか、または任意のセキュリティ・マネージャを指定する設定を行います。
デフォルト・セキュリティ・マネージャとともにOC4Jを起動する例を次に示します。
% java -Djava.security.manager ... -jar oc4j.jar
次の例は、セキュリティ・マネージャを指定したものです。
% java -Djava.security.manager=com.abc.MySecurityManager ... -jar oc4j.jar
注意
|
デフォルト・セキュリティ・マネージャによって特定のクラスに付与されるパーミッションは、ポリシー・ファイルを読み取ることで決定されます。デフォルト・ポリシー・ファイルが、J2SEの一部として提供されます。目的のポリシー・ファイルを指定するには、システム・プロパティ java.security.policy
を目的のファイルのフルパスに設定します。次の例では、デフォルトのセキュリティ・マネージャとOC4J付属のポリシー・ファイルを指定してOC4Jを起動しています。
% java -Doracle.home=$ORACLE_HOME -Djava.security.manager \ -Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy \ -jar oc4j.jar
注意
|
関連項目
|
OC4J上で動作するアプリケーションに必要となるすべてのパーミッションを識別できるように、Oracleは、セキュリティ例外をスローしないカスタム・セキュリティ・マネージャPrintingSecurityManager
を提供しています。このセキュリティ・マネージャは、デフォルトのセキュリティ・マネージャがスローする例外を指定するメッセージを出力します。また、PrintingSecurityManager
は、セキュリティ例外を回避するポリシー権限を生成します。
PrintingSecurityManager
を、次の例のように実行します。ここでは、OC4JをORACLE_HOME
/j2ee/home
から実行するものと想定しています。
% java -Xbootclasspath/p:lib/oc4j-psm.jar -Doracle.home=$ORACLE_HOME \ -Djava.security.manager=oracle.oc4j.security.PrintingSecurityManager \ -Djava.security.policy=$ORACLE_HOME/j2ee/home/config/java2.policy \ -jar oc4j.jar
(-Xbootclasspath
により、PrintingSecurityManager
をブート・クラスパスに追加することで、このセキュリティ・マネージャがすべてのパーミッション付きで実行されます。)
PrintingSecurityManager
により、次の情報をリストした出力が生成されます。
デフォルトでは、出力先はSystem.out
ですが、次のシステム・プロパティで出力ファイルを指定できます。1番目のプロパティでは不足しているパーミッションに関するメッセージ、2番目のプロパティではポリシー権限に関するメッセージの出力ファイルを指定します。
-Doracle.oc4j.security.manager.printing.file=filenamepath -Doracle.oc4j.security.manager.printing.generated.grants.file=filenamepath
Java 2ポリシー・ファイルは、信頼コードやアプリケーションにパーミッションを付与することで、それらが環境内で正しく動作するための適切なアクセス権を割り当てます。
事前構成済のJava 2ポリシー・ファイルjava2.policy
は、ORACLE_HOME
/j2ee/home/config
に格納されています。このファイルは、必要に応じて変更できます。または、代替のポリシー・ファイルを作成して指定することもできます。ただし、Oracle提供のjava2.policy
ファイルには、セキュリティ・マネージャとともにOC4Jを実行する際に必要なパーミッションが含まれていることに注意してください。別のポリシー・ファイルを使用する場合は、そのファイルに同じパーミッションが含まれていることを確認してください。
次のポリシー・ファイルの例では、システム・ファイルを開く操作や、ソケットやポートを開く操作に対するすべてのパーミッションを、トラステッドjazn.jar
(OracleAS JAAS Provider Admintool)に付与しています。
/* grant the JAAS library AllPermission */ grant codebase "file:${oracle.home}/j2ee/home/jazn.jar" { permission java.security.AllPermission; };
同様に次の例では、すべてのパーミッションをwssecurity.jar
(Webサービスのセキュリティ機能用)に付与しています。
/* grant the WSSecurity AllPermission */ grant codebase "file:${oracle.home}/webservices/lib/wssecurity.jar" { permission java.security.AllPermission; };
次の例では、ORACLE_HOME
/appdemo
ディレクトリで稼働しているすべてのアプリケーションに特定のパーミッションを付与しています。
/* Assuming you are running your application demo in $ORACLE_HOME/appdemo/, */ /* Grant JAAS permissions to the demo to run JAAS APIs*/ grant codebase "file:/${oracle.home}/appdemo/-" { permission oracle.security.jazn.JAZNPermission "getPolicy"; permission oracle.security.jazn.JAZNPermission "getRealmManager"; permission oracle.security.jazn.policy.AdminPermission; }
ユーザーのアプリケーション・コードやOC4Jに生成されたクラスに対し、必要に応じて追加のパーミッションを付与できます。そのためには、.policy
ファイルに手動で追加のエントリを作成します。(現在、この操作を行うためのツールはありません。)必要なパーミッションは、アプリケーションの詳細に依存し、必要なコードベースは、インストールの詳細に依存します。
この項では、OC4Jの次の認可機能について説明します。
OracleAS JAAS Providerにより、Javaパーミッションを使用して任意の保護リソースをモデル化できます。Javaパーミッション・モデル(および関連java.security.Permission
クラス)は拡張可能であり、密なアクセス制御を柔軟に定義できます。
OracleAS JAAS ProviderはJ2SE標準に基づいており、標準のAPIを使用して密な認可に関連する次の機能をサポートします。
Subject.doAs()
の機能およびSubject.doAsPrivileged()
の機能と関連があります。
関連項目
http://java.sun.com/j2se/1.4.2/docs/guide/security/jaas/JAASRefGuide.html
java.security.*
パッケージおよびjavax.security.auth.*
パッケージを参照してください。
http://java.sun.com/j2se/1.4.2/docs/api/
http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html
OC4J 10.1.3.x実装では、JAASモードと呼ばれる密な認可機能が提供されます。この機能は、Subject
クラスに属する静的メソッドdoAs()
およびdoAsPrivileged()
の標準機能と関連しています(「JAAS認可: サブジェクト・メソッドdoAs()およびdoAsPrivileged()」を参照)。
これらのメソッドは、アプリケーションではJAASモードの設定に従って使用されます。JAASモードは、アプリケーションのorion-application.xml
ファイルに含まれる<jazn>
要素のjaas-mode
属性で設定します。JAASモードでは、doAs()
またはdoAsPrivileged()
のどちらを使用するかは次のように決定されます。
jaas-mode="doAs"
となっている場合は、アプリケーション・モジュール(WebモジュールおよびEJB)がOC4JによってSubject.doAs()
ブロック内で実行されます。 このモードは、サブジェクトベース・セキュリティとともにコードベース・セキュリティが必要な場合に便利です。
jaas-mode="doAsPrivileged"
となっている場合は、アプリケーション・モジュールがSubject.doAsPrivileged()
ブロック内でnullアクセス制御コンテキストを使用して実行されます。このモードは、サブジェクトベース・セキュリティのみが必要な場合に便利です。
jaas-mode="null"
(デフォルト)と設定している場合は、どちらのメソッドも使用されずにモジュールが実行されます。このモードは、コードベース・セキュリティのみが必要な場合に便利です。
jaas-mode
はアプリケーション・レベルのorion-application.xml
ファイルで設定されるので、アプリケーション内のすべてのWebモジュールまたはEJBに影響します。
関連項目
|
この項では、JAAS認可と関連するOracleAS JAAS Providerのクラスとメソッドについて説明します。
oracle.security.jazn.JAZNConfig
クラスのインスタンスは、<jazn>
要素の構成を表します。このクラスには、次のメソッドが含まれています。
JAZNConfig getJAZNConfig()
JAZNConfig
クラスのこの静的メソッドでは、JAZNConfig
インスタンスが戻されます。
RealmManager getRealmManager()
JAZNConfig
クラスのこのインスタンス・メソッドでは、レルムの管理に使用されるRealmManager
インスタンスが戻されます。
oracle.security.jazn.realm.RealmManager
クラスには、次のインスタンス・メソッドが含まれています。
oracle.security.jazn.realm.Realm
クラスのインスタンスでは、特定レルムのユーザーおよびロールのストアへのアクセスが提供されます。realm
パッケージでは、ユーザー管理はUserManager
インタフェース、ロール管理はRoleManager
インタフェースによって定義されます。Realm
クラスには、次のインスタンス・メソッドが含まれています。
UserManager getUserManager()
このメソッドでは、UserManager
インスタンスが戻されます。このインスタンスは、このレルムのユーザーの管理に使用できます。
RoleManager getRoleManager()
このメソッドでは、RoleManager
インスタンスが戻されます。これは、このレルムのロールの管理に使用できます。
レルム内のユーザーの管理(追加、取得、削除)には、oracle.security.jazn.realm.UserManager
インスタンスを使用します。このインタフェースには、次のメソッドが含まれています。
RealmUser getUser(String)
このメソッドでは、レルムに含まれる指定名ユーザーのユーザー・オブジェクトが戻されます。
関連項目
|
前述の項で説明したJAZNConfig
クラスには、次のメソッドもあります。
JAZNPolicy getPolicy()
このメソッドでは、oracle.security.jazn.policy.JAZNPolicy
インスタンスが戻されます。このインスタンスは、JAAS(サブジェクトベース)認可ポリシーのリポジトリを表しています。
JAZNPolicy
インタフェースには、次のメソッドが含まれています。
void grant(Grantee, Permission)
このメソッドでは、oracle.security.jazn.policy.Grantee
インスタンスおよびjava.security.Permission
インスタンスが入力として使用されて、指定された受領者に指定のパーミッションが付与されます。
void revoke(Grantee, Permission)
このメソッドでは、指定された受領者の指定パーミッションが取り消されます。
boolean hasPermission(Grantee, Permission)
このメソッドでは、指定された受領者が指定パーミッションを持っているかどうかが判別されます。
Grantee
クラスには、Principal
インスタンスを入力として取るコンストラクタが含まれています。
表5-1に、Oracle提供のパーミッション・クラスを示します。
これらのパーミッション・クラスのインスタンスは、次のようにして構築します。
new AdminPermission(String)
new AdminPermission(Permission)
AdminPermission
コンストラクタは、エンコードされたパーミッション文字列やjava.security.Permission
インスタンスを取ります。
new RoleAdminPermission(String)
new RoleAdminPermission(RealmRole)
RoleAdminPermission
コンストラクタは、次のいずれかを取ります。
new JAZNPermission(String)
JAZNPermission
コンストラクタは、パーミッションのシンボリック名を取ります(getRealmManager
、getPolicy
、getProperty
.propertyname
など)。
new RealmPermission(String realm, String actions)
RealmPermission
コンストラクタは、レルム名の文字列と、レルムに適用されるアクションのカンマ区切りリストで構成される文字列を取ります。
new RMIPermission(String param, String actions)
RMIPermission
コンストラクタは、RMIPermission
パラメータの文字列(login
など)と、適用されるアクションのカンマ区切りリストで構成される文字列を取ります。
標準的なパーミッション・クラスのインスタンスも、必要に応じて構成できます。
new Permission(String permname)
java.security.Permission
コンストラクタでは、パーミッションの名前を指定するために文字列を取ります。
new BasicPermission(String permname)
java.security.BasicPermission
コンストラクタは、パーミッションの名前を指定するために文字列を取ります。
new FilePermission(String path, String actions)
java.security.FilePermission
コンストラクタは、該当ファイルのパスを指定するために1つの文字列を取り、許容アクションのカンマ区切りリストとしてもう1つの文字列を取ります。サポートされているアクションは、read、write、executeおよびdeleteです。
new AllPermission()
java.security.AllPermission
クラスのインスタンスは、その他すべてのパーミッションを表すパーミッションです。このインスタンスのコンストラクタにはパラメータはありません。
パーミッションのチェックなど、アクセス制御の概要は、「Java 2認可: セキュリティ・マネージャおよびアクセス・コントローラ」を参照してください。パーミッションの取得とチェックに関係する可能性があるAPIは、次のとおりです。
java.security.AccessController
クラスには、次のメソッドが含まれています。
AccessControlContext getContext()
このメソッドは、現行スレッドの継承されたアクセス制御コンテキストを含んでいる現在の呼び出しコンテキストを検査し、そのコンテキストをjava.security.AccessControlContext
インスタンスとして表します。
void checkPermission(Permission)
java.security.Permission
インスタンスの場合、この静的メソッドは、そのパーミッションによって指定されるアクセス・リクエストを許可するかどうかをチェックし、リクエストを拒否する必要がある場合にAccessControlException
をスローします。このメソッドは、デフォルトのアクセス制御コンテキストを使用します。
このメソッドを使用すると、セキュリティ・マネージャを有効にすることなく、Java 2ポリシーをチェックできます。
java.security.AccessControlContext
クラスには、次のメソッドが含まれています。
void checkPermission(Permission)
このメソッドは、AccessController.checkPermission()
メソッドと同じ機能を備えていますが、そのアクセス制御コンテキストを使用する際には特定のAccessControlContext
インスタンス上でコールされます。(AccessControlContext
インスタンスは、ProtectionDomain
インスタンスの配列から構築できます。)
このメソッドを使用すると、セキュリティ・マネージャを有効にすることなく、Java 2ポリシーをチェックできます。
java.lang.SecurityManager
クラスには、次のメソッドが含まれています。
void checkPermission(Permission)
このメソッドは、AccessController
クラスとAccessControlContext
クラスのcheckPermission()
メソッドと同じ機能を備えていますが、セキュリティ・マネージャを有効にした状態で使用され、セキュリティ・マネージャ・インスタンスに対してコールされます。また、アクセスを拒否する必要がある場合、SecurityException
をスローします。
javax.security.auth.Subject
クラスには、次のメソッドが含まれています。
Subject getSubject(AccessControlContext)
この静的メソッドでは、指定のアクセス制御コンテキストに関連付けられたサブジェクトが戻されます。デフォルトのアクセス制御コンテキストは、次のように指定できます。
mysubject = Subject.getSubject(AccessController.getContext());
抽象クラスjavax.security.auth.Policy
には、次のメソッドが含まれています。
Policy getPolicy()
この静的メソッドでは、Policy
インスタンスが戻されます。
PermissionCollection getPermissions(Subject, CodeSource)
javax.security.auth.Subject
インスタンス、java.security.CodeSource
インスタンスまたはその両方(入力はnullにできます)の場合、このメソッドは、許容されるパーミッションのセットを示すjava.security.PermissionCollection
インスタンスを戻します。codesourceフィールドはnull
にできます。
PermissionCollection
クラスには、次のメソッドが含まれています。
boolean implies(Permission)
この抽象メソッドでは、指定したパーミッションがパーミッション・コレクション内のパーミッション・セットによって暗黙的に定義されるかどうかが示されます。たとえば、パーミッション・コレクションがサブジェクトのパーミッションで構成される場合は、次の例のように、指定のパーミッションがサブジェクトにあるかどうかがこのメソッドによって通知されます。
jaaspolicy = javax.security.auth.Policy.getPolicy(); jaaspolicy.getPermissions(mysubject,null).implies(perm);
OC4J 10.1.3.x実装では、JSR-115の規約に従って、Java Authorization Contract for Containers(JACC)がサポートされます。これは、コンテナと認可サービス・プロバイダの間の規約で、認可をコンテナから切り離せるようにします。OC4Jの認可機能は、標準のJACCプロバイダに委任されています。
JACC規約に準拠するため、J2EEセキュリティ制約はJava 2パーミッションに変換され、J2EEセキュリティ・モデルでJ2SEセキュリティ・モデルを完全に利用できるようになります。ただし、JACCは、J2EEセキュリティAPIのみでなく既存のJ2EEの宣言によるセキュリティ・モデルも引き続き完全に保持しています。基本的には、JACCを有効にすることで、アプリケーションで使用する認可の構成とコードを変更することなく、J2EE認可の拡張バージョンを使用できます。
通常、JACCは開発時ではなくデプロイ時に考慮されます。
JSR-115に定義されている規約は、アプリケーション・サーバー・コンテナ、デプロイメント・ツールおよびポリシー・プロバイダとの関連で、次のサブ規約に分割されます。
JACCでは、J2EE認可モデルに準拠した新しいjava.security.Permission
クラス実装が用意されています。JACCでは、コンテナによるアクセスの決定は、これらのPermission
クラスのインスタンスでの操作に従って行われます。JACCでは、J2EE認可モデルの要件に対応するためにポリシー・プロバイダが新しいパーミッション・クラスを活用する方法が、次のように定義されています。
関連項目
http://java.sun.com/j2ee/javaacc/
http://www.jcp.org/en/jsr/detail?id=115
サブジェクトベースのポリシー管理には規定の標準がないため、実装は各ベンダーに任されています。この項では、サブジェクトベースのポリシー管理に対するOracleAS JAAS Providerの機能の使用方法として、パーミッションの付与、結果の構成、パーミッションのチェック、OracleAS JAAS Providerポリシー・プロバイダの明示的な指定(必要な場合)について説明します。
OracleAS JAAS Provider Admintoolでは、system-jazn-data.xml
またはOracle Internet Directoryをポリシー・リポジトリとして、grantperm
、revokeperm
、listperm
の各コマンドを使用して、パーミッションを付与、取消し、リスト表示を行うことができます。(または、実行時に次項の「OracleAS JAAS Providerポリシー管理APIの使用」で説明するAPIを使用する方法もあります。)これらのコマンドの完全な構文については、「パーミッションの付与と取消し」および「パーミッションのリスト表示」を参照してください。
パーミッションを付与する対象は、ユーザー(grantperm -user
オプションを使用)、ロール(-role
オプションを使用)、プリンシパルです。
たとえば、RMIパーミッションloginをレルムmyrealm
内のロールdevelopers
に付与するには、次のように入力します。
% java -jar jazn.jar -grantperm myrealm -role developers \ com.evermind.server.rmi.RMIPermission login
(RMIパーミッションloginは、EJB/RMIアクセスを許可するために頻繁に付与する必要があるパーミッションです)
同じパーミッションをユーザーJDOE_ENDUSER
に付与するには、次のように入力します。
% java -jar jazn.jar -grantperm myrealm -user JDOE_ENDUSER \ com.evermind.server.rmi.RMIPermission login
このパーミッションをLDAPプリンシパルhobbes
に付与する(外部LDAPプロバイダを使用する場合)には、次のように入力します。
% java -jar jazn.jar -grantperm oracle.security.jazn.realm.LDAPPrincipal hobbes \ com.evermind.server.rmi.RMIPermission login
ファイルsample.txt
とアクションread, write
を指定して、レルムfoo
のユーザーmartha
にFilePermission
を付与するには、次のように入力します。
% java -jar jazn.jar -grantperm foo -user martha java.io.FilePermission sample.txt read,write
grantperm
コマンドによって生成される構成については、「OracleAS JAAS Provider ポリシー構成」を参照してください。
system-jazn-data.xml
またはOracle Internet Directoryをポリシー・リポジトリとして、OracleAS JAAS Providerポリシー管理APIを使用してパーミッションの付与または取消しを行うことができます。(または、非実行時に前項の「OracleAS JAAS Provider Admintoolを介したパーミッションの付与」で説明したOracleAS JAAS Provider Admintoolのコマンドを使用する方法もあります。)次の例では、「J2EE認可APIの使用」で示したdoGet()
メソッドを拡張し、OracleAS JAAS Providerポリシー管理APIを使用してユーザーにファイル権限を付与します。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); response.setContentType("text/html"); out.println("<HTML><BODY bgcolor=\"#FFFFFF\">"); out.println("Time stamp: " + new Date().toString()); out.println("request.isUserInRole('ar_developers') = " + request.isUserInRole("ar_developers") + "<br>"); try { //Grant Permissions to a user developer //get JAZNConfiguration related info JAZNConfig jc = JAZNConfig.getJAZNConfig(); //create a Grantee for "developer" RealmManager realmmgr = jc.getRealmManager(); Realm realm = realmMgr.getRealm("jazn.com"); UserManager userMgr = realm.getUserManager(); final RealmUser user = userMgr.getUser("developer"); //grant developer file permission JAZNPolicy policy = jc.getPolicy(); if ( policy != null) { Grantee gtee = new Grantee( (Principal) user); java.io.FilePermission fileperm = new java.io.FilePermission("foo.txt", "read"); policy.grant( gtee, fileperm); } } catch (Exception e) { /* print stack trace */ } out.println("</BODY>"); out.println("</HTML>"); }
関連項目
|
この項では、これまでの各項で説明したように、OracleAS JAAS Provider Admintoolまたはポリシー管理APIを使用してパーミッションを付与した結果生成されるサブジェクトベースのポリシー構成について説明します。OC4Jでは、この構成がセキュリティ・プロバイダに応じてsystem-jazn-data.xml
ファイルまたはOracle Internet Directoryに配置されます。
内容は次のとおりです。
ここで説明する構成は、サブジェクトベース・セキュリティ専用です。コードベース・セキュリティは、Java 2ポリシー・ファイル(
注意
.policy
)で構成されます(「Java 2セキュリティ・マネージャおよびポリシー・ファイルの指定」および「Java 2ポリシー・ファイルの作成または更新」を参照)。
OC4Jインスタンスのセキュリティ・ポリシーに使用されるポリシー・リポジトリは、jazn.xml
ファイルで指定されたプロバイダです。これは、次のように<jazn>
要素のprovider
設定で指定されます。
system-jazn-data.xml
を使用する場合は、provider="XML"
provider="LDAP"
デフォルトでは、jazn.xml
のprovider
がXML
に設定され、system-jazn-data.xml
がポリシー・リポジトリとして使用されます。Oracle Identity Managementを使用し、Oracle Internet DirectoryインスタンスをOC4Jインスタンスに関連付けると、jazn.xml
のプロバイダ設定がLDAP
に変更され、Oracle Internet Directoryがポリシー・リポジトリとして使用されます。
(同様に、orion-application.xml
のprovider
設定の場合、アプリケーションのセキュリティ・プロバイダが指定されます。ファイルベースのプロバイダの場合、これがXML
に設定され、Oracle Identity Managementの場合はLDAP
に設定されます。また、規則上、外部LDAPプロバイダ、カスタム・ログイン・モジュールまたはOracle Access Managerの場合も、XML
に設定されます)
ファイルベースのプロバイダ、Oracle Access Manager、外部LDAPプロバイダ、カスタム・ログイン・モジュールの場合、ポリシー構成がsystem-jazn-data.xml
ファイルの<jazn-policy>
要素に配置されます。
例として、「OracleAS JAAS Provider Admintoolを介したパーミッションの付与」で使用したgrantperm
の例の1つをもう一度示します。
% java -jar jazn.jar -grantperm myrealm -role developers \ com.evermind.server.rmi.RMIPermission login
これにより、次の例のような<jazn-policy>
構成が生成されます。
<jazn-data> ... <jazn-policy> <grant> <grantee> <principals> <principal> <realm-name>myrealm</realm-name> <type>role</type> <class>oracle.security.jazn.XMLRealmRole</class> <name>developers</name> </principal> </principals> </grantee> <permissions> <permission> <class>com.evermind.server.rmi.RMIPermission</class> <name>login</name> </permission> </permissions> </grant> ... </jazn-policy> ... </jazn-data>
Oracle Identity Management(LDAPベースのプロバイダ)の場合、ポリシー構成はOracle Internet Directoryに配置されます。system-jazn-data.xml
と同様に、Oracle Internet Directoryに保存されているポリシー情報には、OracleAS JAAS Provider Admintoolまたはポリシー管理APIを介してアクセスできます。
Oracle Application Serverに同梱のJava Virtual Machineを使用する場合は、OracleAS JAAS Provider付属のJAASポリシー・プロバイダが、OC4Jで使用するポリシー・プロバイダとして自動的に指定されます。他のJVMを使用する場合(つまりOC4Jの外部でアプリケーションを実行する場合)は、ポリシー・プロバイダとしてOracle JAASポリシー・プロバイダoracle.security.jazn.spi.PolicyProvider
を明示的に指定する必要があります。(デフォルトでは、Oracle以外のJVMによってSun社のJAAS Providerが使用されます。)
Oracle固有のJAASプロパティ(ポリシー・プロバイダなど)をセキュリティ・プロパティ・ファイルに指定し、OC4Jの起動時にJVMに渡すことができます。Oracleが提供するデフォルトのセキュリティ・プロパティ・ファイルORACLE_HOME
/j2ee/home/config/jazn.security.props
により、OC4Jで使用するポリシー・プロバイダとしてoracle.security.jazn.spi.PolicyProvider
指定されます。構成は次のとおりです。
auth.policy.provider=oracle.security.jazn.spi.PolicyProvider
前述のOracle JAASポリシー・プロバイダの指定を含めたデフォルトのOracle固有セキュリティ・プロパティ設定を既存のセキュリティ・プロパティに追加する場合は、次のようにjava.security.properties
システム・プロパティを設定します。
-Djava.security.properties=ORACLE_HOME/j2ee/home/config/jazn.security.props
すべてのセキュリティ・プロパティをOracleプロパティで置き換える場合は、次のようにします。等号が2つ(==)であることに注意してください。
-Djava.security.properties==ORACLE_HOME/j2ee/home/config/jazn.security.props
この項では、実行時に認可をチェックする次の手順について説明し、その例を示します。
ここで示すサンプルではサーブレット・メソッドを使用しますが、その基本機能はEJBの基本機能と同じです。
次のサンプル・サーブレットのdoGet()
メソッドでは、標準のJ2EE認可メソッドを使用してユーザーとプリンシパルが取得され、ユーザーが指定のロールに定義されているかどうかが判別されます。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); response.setContentType("text/html"); out.println("<HTML><BODY bgcolor=\"#FFFFFF\">"); out.println("Time stamp: " + new Date().toString()); out.println("request.isUserInRole('ar_developers') = " + request.isUserInRole("ar_developers") + "<br>"); out.println("</BODY>"); out.println("</HTML>"); }
コード内で認可を実行するには、多くの場合、リソースにアクセスしようとする認証対象ユーザーのSubject
インスタンスを取得する必要があります。そのためには、標準のJAAS機能を介して静的なSubject.getSubject()
メソッドを使用し、アクセス制御コンテキストを指定します。
通常は、デフォルトのアクセス制御コンテキストを使用します。
mysubject = Subject.getSubject(AccessController.getContext());
または、特定のアクセス制御コンテキスト(一連の保護ドメインから構築したものなど)を指定することもできます。
mysubject = Subject.getSubject(acc);
JAASモードを使用すると、OC4Jによって認証済サブジェクトとそのパーミッションがデフォルトのアクセス制御コンテキストとそのパーミッションに関連付けられることに注意してください。
通常、認可コードではcheckPermission(Permission)
コールを使用します。このメソッドでは、現在有効なセキュリティ・ポリシーに基づいて、指定のパーミッションで指定されるアクセス・リクエストを許可するかどうかがチェックされ、許可しない場合は例外がスローされます。
このメソッドは、AccessController
クラスとAccessControlContext
クラスで使用できます。デフォルト実装(Sun JDK付属)を使用する場合、セキュリティ・マネージャが有効かどうかに関係なく、いずれかのクラスのcheckPermission()
メソッドにより、アプリケーション内でJava 2(コードベース)ポリシーを強制できます。
セキュリティ・マネージャを使用する場合、SecurityManager
クラスでもこのメソッドを使用できますが、checkPermission()
のデフォルトのSecurityManager
実装では、AccessController.checkPermission()
がコールされます。
通常は、静的なAccessController.checkPermission()
メソッドを使用します。このコールでは、デフォルトのアクセス制御コンテキスト(スレッド作成時に継承されたコンテキスト)が使用されます。ただし、他のコンテキストについてパーミッション・チェックを行う必要がある場合、特定のAccessControlContext
インスタンス上でインスタンス・メソッドcheckPermission()
をコールできます。次の例では、AccessController
メソッドを使用しています。
//create permission FilePermission perm = new FilePermission("/home/developer/foo.txt","read"); //check permission AccessController.checkPermission(perm);
OC4Jでは、AccessController.checkPermission()
がコールされる際に、アクセス制御コンテキストの構成内容とJAASモードの設定が次のように関係します。
jaas-mode="null"
)、Java 2ポリシー・ファイルで指定されているように、checkPermission()
が有効なセキュリティ・ポリシーに基づいてコードベース・セキュリティを強制します。サブジェクトベース・セキュリティの場合、条件はありません。
doAs
JAASモード(jaas-mode="doas"
)の場合、OC4Jによってアプリケーション・コードが実行されるdoAs()
ブロックを介して作成された新しいアクセス制御コンテキストに従って、checkPermission()
がコードベース・セキュリティとサブジェクトベース・セキュリティの組合せを強制します。OC4Jにより、デフォルトのアクセス制御コンテキストのパーミッションにサブジェクトのパーミッションが追加されます。
doAsPrivileged
JAASモード(jaas-mode="doasprivileged"
)の場合、checkPermission()
はdoAs
モードの場合と同じように機能しますが、OC4Jは、doAsPrivileged()
をコールする際に、指定に従ってnullアクセス制御コンテキストを使用します。これは、サブジェクトベース・セキュリティのみを使用するためです。次の例では、「J2EE認可APIの使用」に示すdoGet()
メソッドが拡張され、パーミッションの作成とチェックが行われます。さらに、JAASモードdoAsPrivileged
を使用します。これは、アプリケーションのorion-application.xml
ファイルで次のような構成によって設定されます。
<orion-application ... > ... <jazn ... jaas-mode="doAsPrivileged" /> ... </orion-application>
次のコードでは、説明のために2つの方法でパーミッションをチェックしています。JAASモード設定のため、アクション・メソッド(この場合doGet()
)が、OC4JによってSubject.doAsPrivileged()
ブロック内で、認証サブジェクトに対して実行されます。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); response.setContentType("text/html"); out.println("<HTML><BODY bgcolor=\"#FFFFFF\">"); out.println("Time stamp: " + new Date().toString()); out.println("request.isUserInRole('ar_developers') = " + request.isUserInRole("ar_developers") + "<br>"); //create Permission FilePermission perm = new FilePermission("/home/developer/foo.txt","read"); { // CHECK PERMISSION VIA ACCESS CONTROLLER AccessController.checkPermission(perm); // CHECK PERMISSION VIA JAAS POLICY //get current AccessControlContext AccessControlContext acc = AccessController.getContext(); javax.security.auth.Policy currPolicy = javax.security.auth.Policy.getPolicy(); // Query policy now out.println("Policy permissions for this subject are " + currPolicy.getPermissions(Subject.getSubject(acc),null)); //Check Permissions out.println("Policy.implies permission: "+ perm +" ? " + currPolicy.getPermissions(Subject.getSubject(acc),null).implies(perm)); } out.println("</BODY>"); out.println("</HTML>"); }
この項では、OC4JでOracle JACCプロバイダを有効にする方法について説明します。JACCを有効にすると、アプリケーションで使用する認可の構成とコードを変更することなくJ2EEセキュリティ制約がJava 2パーミッションに変換され、効率的にJ2EE認可の拡張バージョンが提供されます。
内容は次のとおりです。
デフォルトでは、JACCはOC4Jで無効になっています。JACCを有効にするには、OC4J起動時に次のシステム・プロパティが設定されるようにします。
-Doracle.oc4j.security.jacc=true
JACCプロバイダを使用するには、アプリケーション・サーバー起動時に、表5-2に示すシステム・プロパティが適切に設定されるようにする必要があります。Oracle JACCプロバイダの場合は、JACCを有効にすると、適切な設定であるカッコ内のプロパティが自動的に設定されます。
この項では、これまでに説明した主要なJavaセキュリティ・モデル(J2EE、Java 2、JAAS)それぞれについて、使用に適した環境とその仕組みを説明します。操作上の詳細は、このマニュアルの各所(ほとんどはこの章)で説明されています。
J2EE(静的なロールベース)セキュリティは、WebアプリケーションやEJBにアクセスできるセキュリティ・ロールを指定する粗密なモデルです。
J2EEアプリケーションでは、これが最も単純かつ基本的な形式のセキュリティです。ほぼすべてのJ2EEアプリケーションで使用され、多くの場合、このセキュリティで十分です。このセキュリティは標準であるため、プラットフォームに依存しません。
ただし、このセキュリティには制限があるため、他のセキュリティ・モデルと併用される場合があります。J2EEセキュリティのみでは、特定のリソースへのアクセスを制限したり、ロールに対して特定のパーミッションを定義できないことに注意してください。また、特定のコード・エンティティでアクセスを制御することもできません。さらに、J2EEセキュリティ・モデルは静的なモデルであるため、実行時にポリシーを変更できません。
J2EEセキュリティの設定は、OC4J固有のディスクリプタ(orion-application.xml
など)を介したロールマップの指定に加えて、web.xml
およびejb-jar.xml
ファイルでのセキュリティ・ロール、ロールリンクおよびセキュリティ制約の標準的な指定を介して行います。
J2EEセキュリティのみを使用する場合、JAASモードは不要です(jaas-mode="null"
)。
J2EEセキュリティは、J2EEコンテナ(OC4J)によって強制されます。
Java 2(コードベース)セキュリティでは、実行元コードの場所またはコード署名者に基づいてリソースへのアクセスが制御されます。
アプリケーションでコードベースのパーミッションをチェックする必要がある場合、Java 2セキュリティにアクセスしようとするユーザーやロールに関係なく、Java 2セキュリティを使用します。Java 2セキュリティを使用すると、管理者がセキュリティ・マネージャを有効化または無効化することで、セキュリティ・マネージャがセキュリティ・チェックを実行するタイミングを制御できます。
通常、コードベース・セキュリティとセキュリティ・マネージャの使用が必要となるのは、信頼できないコードがアプリケーション・サーバーを参照している場合に限られます。また、セキュリティ・マネージャを使用すると、パフォーマンスに影響が出る可能性があることにも注意してください。
Java 2セキュリティは、J2EEセキュリティまたはJAASセキュリティ(あるいはその両方)と併用できます。
標準の.policy
ファイル(通常はjava.policy
またはjava2.policy
)を介してJava 2ポリシーを指定します。ポリシー・ファイルORACLE_HOME
/j2ee/home/config/java2.policy
は、OC4Jによって提供されます。このファイルには、セキュリティ・マネージャによってOC4Jを実行する際に必要なパーミッションが格納されています。
Java 2ポリシー・ファイルを保守するOracleツールは提供されていないため、この操作は手動で行うか、またはJDKベンダーやサード・パーティ・ベンダーが提供するツールを使用する必要があります。
Java 2セキュリティを単独で使用する場合またはJ2EEセキュリティのみと併用する場合、JAASモードは不要です(jaas-mode="null"
)。
Java 2セキュリティ・ポリシーをアプリケーション・サーバーおよび基礎となるJDKによって強制するには、セキュリティ・マネージャを有効にする必要があります。
アプリケーション内でJava 2セキュリティ・ポリシーを強制するには、次のようにします。
SecurityManager
インスタンスのcheckPermission()
メソッドを使用します。 このシナリオの場合、セキュリティ・マネージャを有効にしてJVMを起動する必要があることに注意してください。
AccessController.checkPermission()
メソッドを使用してパーミッションをチェックします。このシナリオの場合、セキュリティ・マネージャを使用しないと環境全体がセキュアにならないことに注意する必要があります。JDKクラスを含めた環境内のその他のコードは、セキュア・モードでは実行されません。
ProtectionDomain
インスタンスの配列からAccessControlContext
インスタンスを構築し、AccessControlContext
インスタンスでcheckPermission()
メソッドをコールします。(ただし、このシナリオは一般的ではありません。)
JAAS(サブジェクトベース)セキュリティは、認証済サブジェクトの特定のパーミッションに従ってリソースへのアクセスを制御する、比較的密なモデルです。
通常は、J2EEモデルの粗密なセキュリティで十分です。JAASセキュリティは管理とデプロイがより複雑ですが、次のようにリソースをより密に制御する場合に有効です。
これとは対照的に、J2EEセキュリティはより静的で、アクセス制御は実行時に変更できません。
通常、JAASセキュリティはJ2EEセキュリティと併用されます。Java 2セキュリティと併用されることもあります。
パーミッションの付与(または取消し)は、OracleAS JAAS Provider Admintoolを使用して事前に行うか(「OracleAS JAAS Provider Admintoolを介したパーミッションの付与」を参照)、または実行時にOracleAS JAAS Provider APIを介して行うことができます(「OracleAS JAAS Providerポリシー管理APIの使用」を参照)。これにより生成されるJAAS(サブジェクトベース)ポリシーは、system-jazn-data.xml
に反映されます。Oracle Identity Managementをセキュリティ・プロバイダとして使用する場合は、Oracle Internet Directoryに反映されます。
JAASモードをどのように設定するかも関係します。Java 2(コードベース)認可なしでJAAS認可を使用するには、jaas-mode="doasprivileged"
を設定することによってdoAsPrivileged
JAASモードを使用し、Policy.implies()
メソッドを使用してパーミッションをチェックします。
JAAS認可をJava 2認可と併用するには、次の操作を行います。
jaas-mode="doas"
を設定することにより、doAs
JAASモードを使用します。
.policy
ファイル(通常はOracle提供のjava2.policy
ファイル)を介してJava 2ポリシーを指定します。JAASセキュリティは、AccessController.checkPermission()
メソッドまたはPolicy.implies()
メソッドを介して強制できます。
Java 2セキュリティを併用している場合にセキュリティ・マネージャを有効にすると、SecurityManager.checkPermission()
メソッドも使用できるようになります。
(Java 2ポリシーの強制に関する前述の説明も参照してください。)
|
Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|