ヘッダーをスキップ

Oracle Containers for J2EE セキュリティ・ガイド
10g(10.1.3.4.0)

B50832-01
目次
目次
索引
索引

戻る 次へ

5 OC4Jでの認可

第2章「Javaプラットフォームのセキュリティ」では、3つの主要なJavaセキュリティ・モデルであるJ2EEロールベース・セキュリティ、Java 2コードベース・セキュリティおよびJAASサブジェクトベース・セキュリティの概要を説明しました。

この章では、これらの各モデルで認可機能を使用する方法について説明します。これらの機能は、単独でも組み合せても使用できます。章の最後に、セキュリティ・モデルの選択方法について説明します。

内容は次のとおりです。

Java 2セキュリティおよびコードベースのポリシー管理

この項では、Java 2(コードベース)セキュリティのセキュリティ・マネージャとポリシー・ファイルについて説明します。この項の内容は次のとおりです。

Java 2セキュリティ・マネージャおよびポリシー・ファイルの指定

OC4Jおよび基礎となるJDKによってJava 2(コードベース)セキュリティ・ポリシーを強制するには、セキュリティ・マネージャ(java.lang.SecurityManagerインスタンス)を有効にする必要があります。これにより、たとえば、クラス・ローダーへのアクセス、JDKリソースへのアクセス、JDK APIの実行、JAAS APIの実行(Subject.doAs()またはSubject.doAsPrivileged()メソッドを実行できるかどうかなど)が影響を受ける可能性があります。セキュリティ・マネージャを有効にすると、Java 2ポリシー・ファイルに指定されたポリシーによって、実行元のコードがアクセス可能なリソースが判別されます。

セキュリティ・マネージャは、次のいずれかの方法で指定できます。

デフォルト・セキュリティ・マネージャとともにOC4Jを起動する例を次に示します。

% java -Djava.security.manager ... -jar oc4j.jar

次の例は、セキュリティ・マネージャを指定したものです。

% java -Djava.security.manager=com.abc.MySecurityManager ... -jar oc4j.jar


注意

  • 通常、OC4Jではセキュリティ・マネージャを使用する必要はありません。Oracle Application Serverのインストールでは、OC4Jインスタンスは、デフォルトではセキュリティ・マネージャなしで実行されます。セキュリティ・マネージャをインストールすると、パフォーマンスに重大な影響が出ることがあります。カスタム・セキュリティ・マネージャを使用する場合は、OC4Jの機能に影響しないことを確認してください。

  • AccessController(Sun JDK付属)のデフォルトの実装を使用する場合は、「checkPermission()メソッドの使用」で説明するAccessController.checkPermission()をコールすることにより、セキュリティ・マネージャが有効かどうかに関係なく、アプリケーションに対してJava 2セキュリティ・ポリシーが強制的に適用されます。

 

デフォルト・セキュリティ・マネージャによって特定のクラスに付与されるパーミッションは、ポリシー・ファイルを読み取ることで決定されます。デフォルト・ポリシー・ファイルが、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


注意

  • このjava2.policyファイルには、セキュリティ・マネージャとともにOC4Jを実行するために必要なパーミッションが含まれていることに注意してください。別のポリシー・ファイルを使用する場合は、そのファイルに同じパーミッションが含まれていることを確認してください。

  • .policyファイルは、Java 2(コードベース)ポリシー専用です。OracleAS JAAS Providerの場合、JAAS(サブジェクトベース)ポリシーは、system-jazn-data.xmlファイルの<jazn-policy>要素内またはOracle Identity Managementセキュリティ・プロバイダを使用している場合はOracle Internet Directory内で宣言されます(「OracleAS JAAS Provider ポリシー構成」を参照)。

 

関連項目

 

必要なJava 2パーミッションを判別する際のPrintingSecurityManagerの使用

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


注意

PrintingSecurityManagerはOC4Jとは無関係のため、OC4Jの外部でも使用できます。 


Java 2ポリシー・ファイルの作成または更新

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ファイルに手動で追加のエントリを作成します。(現在、この操作を行うためのツールはありません。)必要なパーミッションは、アプリケーションの詳細に依存し、必要なコードベースは、インストールの詳細に依存します。


注意

${oracle.home}を使用して、ORACLE_HOMEの場所を指定している点に注意してください。この環境変数は、デフォルトで適切に設定されます。 


関連項目

  • ポリシー・ファイルの構文の詳細は、次のURLを参照してください。

    http://java.sun.com/j2se/1.5.0/docs/guide/security/
    PolicyFiles.html
 

OC4J環境における認可API、JAASモードおよびJACC

この項では、OC4Jの次の認可機能について説明します。

JAAS認可およびOracleAS JAAS ProviderのJAASモード

OracleAS JAAS Providerにより、Javaパーミッションを使用して任意の保護リソースをモデル化できます。Javaパーミッション・モデル(および関連java.security.Permissionクラス)は拡張可能であり、密なアクセス制御を柔軟に定義できます。

OracleAS JAAS ProviderはJ2SE標準に基づいており、標準のAPIを使用して密な認可に関連する次の機能をサポートします。

JAASモードの概要

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はアプリケーション・レベルのorion-application.xmlファイルで設定されるので、アプリケーション内のすべてのWebモジュールまたはEJBに影響します。


重要

  • jaas-modeorion-application.xmlのみで設定し、jazn.xmlでは設定しません。

  • Application Server Controlを介して任意の時点で任意のアプリケーションに対してファイルベース・プロバイダからOracle Identity Managementに切り替えると、そのアプリケーションのorion-application.xml内にある<jazn>要素が次のように置き換えられます。以前の<jazn>の設定はすべて失われるため、設定をやりなおす必要があります。

    <jazn provider="LDAP" />
    
 


注意

JAASモードは、以前のリリースでorion-application.xmlまたはorion-web.xml<jazn-web-app>要素に含まれていたrunas-modeおよびdoasprivileged-mode設定に取ってかわるものです。

これらの設定は、OC4J 10.1.3.x実装では非推奨ですが、下位互換性を維持するために引き続きサポートされています。

設定jaas-mode="null"runas-mode="false"と等価であり、jaas-mode="doas"doasprivileged-mode="false"付きのrunas-mode="true"と等価であり、jaas-mode="doAsPrivileged"doasprivileged-mode="true"付きのrunas-mode="true"と等価です。 


関連項目

 

OracleAS JAAS ProviderのレルムAPIとポリシーAPI

この項では、JAAS認可と関連するOracleAS JAAS Providerのクラスとメソッドについて説明します。

oracle.security.jazn.JAZNConfigクラスのインスタンスは、<jazn>要素の構成を表します。このクラスには、次のメソッドが含まれています。

oracle.security.jazn.realm.RealmManagerクラスには、次のインスタンス・メソッドが含まれています。

oracle.security.jazn.realm.Realmクラスのインスタンスでは、特定レルムのユーザーおよびロールのストアへのアクセスが提供されます。realmパッケージでは、ユーザー管理はUserManagerインタフェース、ロール管理はRoleManagerインタフェースによって定義されます。Realmクラスには、次のインスタンス・メソッドが含まれています。

レルム内のユーザーの管理(追加、取得、削除)には、oracle.security.jazn.realm.UserManagerインスタンスを使用します。このインタフェースには、次のメソッドが含まれています。

パーミッションの付与または取消しを行うOracleAS JAAS Provider API

前述の項で説明したJAZNConfigクラスには、次のメソッドもあります。

JAZNPolicyインタフェースには、次のメソッドが含まれています。

Granteeクラスには、Principalインスタンスを入力として取るコンストラクタが含まれています。

表5-1に、Oracle提供のパーミッション・クラスを示します。


注意

ロールにパーミッションを付与する機能は、非推奨のcom.evermind.security.Groupクラスの機能に取ってかわるものです。 


関連項目

  • これらのクラスの詳細は、OracleAS JAAS Providerの『Oracle Containers for J2EE Security Java API Reference』(Javadoc)を参照してください。

 

表5-1    OracleAS JAAS Providerのパーミッション・クラス 
パーミッション  パッケージ部分  説明 

AdminPermission 

oracle.security.jazn.policy 

パーミッションを管理する(つまり、他のユーザーのパーミッション割当てを付与または取り消す)ための権利を表します。 

RoleAdminPermission 

oracle.security.jazn.policy 

このパーミッションの受領者には、ターゲット・ロールをさらに付与または取り消すための権利が付与されます。 

JAZNPermission 

oracle.security.jazn 

認可パーミッションの場合。JAZNPermissionには、名前(ターゲット名)が含まれますが、アクション・リストはありません。指定のパーミッションがある場合とない場合があります。 

RealmPermission 

oracle.security.jazn.realm 

レルムに対するパーミッションのアクション(createRealmおよびdropRealmなど)を表します。java.security.Permissionの拡張であり、通常のJavaパーミッションと同様に使用されます。RealmPermissionインスタンスでは、レルム名(ターゲット名)がアクションのリストと関連付けられます。 

RMIPermission 

com.evermind.server.rmi 

このパーミッションは、ORMIプロトコルを介してEJBにアクセスする際に必要です。通常は、RMIPermission login(OracleAS JAAS Provider Admintoolからなど)のように使用します。 

これらのパーミッション・クラスのインスタンスは、次のようにして構築します。

標準的なパーミッション・クラスのインスタンスも、必要に応じて構成できます。

パーミッションをチェックするAPI

パーミッションのチェックなど、アクセス制御の概要は、「Java 2認可: セキュリティ・マネージャおよびアクセス・コントローラ」を参照してください。パーミッションの取得とチェックに関係する可能性があるAPIは、次のとおりです。

java.security.AccessControllerクラスには、次のメソッドが含まれています。

java.security.AccessControlContextクラスには、次のメソッドが含まれています。

java.lang.SecurityManagerクラスには、次のメソッドが含まれています。

javax.security.auth.Subjectクラスには、次のメソッドが含まれています。

抽象クラスjavax.security.auth.Policyには、次のメソッドが含まれています。

PermissionCollectionクラスには、次のメソッドが含まれています。

OC4Jコンテナへのサブジェクトの設定

JAASベースの認証は、Java EEと十分に統合されていません。JAAS認証では、通常、ログイン・モジュールを使用する必要があります。ただし、ログイン・モジュール(カスタム・ログイン・モジュールを含む)では、コンテナにサブジェクトがアサートされません。この動作により、アプリケーションでは認証サブジェクトが使用されません。この問題を解決するために、OC4JではAPIが提供されます。このAPIを使用すると、コンテナ管理セキュリティ(宣言によるセキュリティ)のかわりに使用できるOC4Jコンテナへのサブジェクトのアサートが可能になります。

このAPIは、oracle.oc4j.securityパッケージに含まれており、次のように使用されます。

Security.setSubject(Subject subject, Longevity longevity);

setSubjectメソッドにより、このリクエストおよびWebコンテナに関連付けられているその他のすべてのリクエストについて、サブジェクト・アイデンティティがコンテナにアサートされます。現在のアプリケーション・コンテキストにWebコンポーネントが含まれていない場合、現在のアプリケーション・サーバーのスレッド・コンテキストのみによってサブジェクトが活用され、プールへ戻される際に消去されます。このAPIは、クライアント側のアプリケーション・コードには関連せず、サーバー側の実行のみに関連します。

Java Authorization Contract for Containersの実装

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認可モデルの要件に対応するためにポリシー・プロバイダが新しいパーミッション・クラスを活用する方法が、次のように定義されています。

OracleAS JAAS Providerポリシー管理

サブジェクトベースのポリシー管理には規定の標準がないため、実装は各ベンダーに任されています。この項では、サブジェクトベースのポリシー管理に対するOracleAS JAAS Providerの機能の使用方法として、パーミッションの付与、結果の構成、パーミッションのチェック、OracleAS JAAS Providerポリシー・プロバイダの明示的な指定(必要な場合)について説明します。

OracleAS JAAS Provider Admintoolを介したパーミッションの付与

OracleAS JAAS Provider Admintoolでは、system-jazn-data.xmlまたはOracle Internet Directoryをポリシー・リポジトリとして、grantpermrevokepermlistpermの各コマンドを使用して、パーミッションを付与、取消し、リスト表示を行うことができます。(または、実行時に次項の「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のユーザーmarthaFilePermissionを付与するには、次のように入力します。

% java -jar jazn.jar -grantperm foo -user martha java.io.FilePermission
     sample.txt read,write

grantpermコマンドによって生成される構成については、「OracleAS JAAS Provider ポリシー構成」を参照してください。

関連項目

 

OracleAS JAAS Providerポリシー管理APIの使用

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 ポリシー構成

この項では、これまでの各項で説明したように、OracleAS JAAS Provider Admintoolまたはポリシー管理APIを使用してパーミッションを付与した結果生成されるサブジェクトベースのポリシー構成について説明します。OC4Jでは、この構成がセキュリティ・プロバイダに応じてsystem-jazn-data.xmlファイルまたはOracle Internet Directoryに配置されます。

内容は次のとおりです。

jazn.xmlでのポリシー・リポジトリ設定

OC4Jインスタンスのセキュリティ・ポリシーに使用されるポリシー・リポジトリは、jazn.xmlファイルで指定されたプロバイダです。これは、次のように<jazn>要素のprovider設定で指定されます。

デフォルトでは、jazn.xmlproviderXMLに設定され、system-jazn-data.xmlがポリシー・リポジトリとして使用されます。Oracle Identity Managementを使用し、Oracle Internet DirectoryインスタンスをOC4Jインスタンスに関連付けると、jazn.xmlのプロバイダ設定がLDAPに変更され、Oracle Internet Directoryがポリシー・リポジトリとして使用されます。

(同様に、orion-application.xmlprovider設定の場合、アプリケーションのセキュリティ・プロバイダが指定されます。ファイルベースのプロバイダの場合、これがXMLに設定され、Oracle Identity Managementの場合はLDAPに設定されます。また、規則上、外部LDAPプロバイダ、カスタム・ログイン・モジュールまたはOracle Access Managerの場合も、XMLに設定されます。)


注意

jazn.xmlでのポリシー・リポジトリ構成(<jazn>要素のprovider属性やlocation属性の設定など)は、OC4Jインスタンス・レベルの構成です。アプリケーションをOC4Jインスタンスにデプロイする場合にアプリケーションで別のプロバイダを構成すると、orion-application.xmlで構成されたプロバイダが認証に使用されるアイデンティティ・ストアになり、jazn.xmlで指定されたプロバイダが認可に使用されるポリシー・ストアになるという混在した状態になります。 


system-jazn-data.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 Internet Directoryでのポリシー構成

Oracle Identity Management(LDAPベースのプロバイダ)の場合、ポリシー構成はOracle Internet Directoryに配置されます。system-jazn-data.xmlと同様に、Oracle Internet Directoryに保存されているポリシー情報には、OracleAS JAAS Provider Admintoolまたはポリシー管理APIを介してアクセスできます。

Oracleポリシー・プロバイダの指定

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

認可のコーディングと構成

この項では、実行時に認可をチェックする次の手順について説明し、その例を示します。

  1. J2EE認可APIの使用

  2. サブジェクトの取得

  3. checkPermission()メソッドの使用

  4. JAASモードの構成と使用

  5. Java Authorization Contract for Containersの有効化(J2EE認可のオプションの拡張機能)

ここで示すサンプルではサーブレット・メソッドを使用しますが、その基本機能はEJBの基本機能と同じです。

関連項目

 

J2EE認可APIの使用

次のサンプル・サーブレットの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()メソッドの使用

通常、認可コードでは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モードの構成と使用

次の例では、「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>");
   }

関連項目

 

Java Authorization Contract for Containersの有効化

この項では、OC4JでOracle JACCプロバイダを有効にする方法について説明します。JACCを有効にすると、アプリケーションで使用する認可の構成とコードを変更することなくJ2EEセキュリティ制約がJava 2パーミッションに変換され、効率的にJ2EE認可の拡張バージョンが提供されます。

内容は次のとおりです。

JACC機能を有効にするシステム・プロパティ

デフォルトでは、JACCはOC4Jで無効になっています。JACCを有効にするには、OC4J起動時に次のシステム・プロパティが設定されるようにします。

-Doracle.oc4j.security.jacc=true

JACCプロバイダを指定するシステム・プロパティ

JACCプロバイダを使用するには、アプリケーション・サーバー起動時に、表5-2に示すシステム・プロパティが適切に設定されるようにする必要があります。Oracle JACCプロバイダの場合は、JACCを有効にすると、適切な設定であるカッコ内のプロパティが自動的に設定されます。

表5-2    JACCプロバイダのシステム・プロパティ 
プロパティ  説明 

javax.security.jacc.policy.provider 

ポリシー・プロバイダのクラス名(oracle.security.jacc.provider.J2SEPolicy) 

javax.security.jacc.policy.PolicyConfigurationFactory.provider 

ポリシー・マッピング構成ファクトリのクラス名(oracle.security.jacc.provider.JACCPolicyConfigurationFactory) 

oracle.security.jacc.provider.RoleMappingConfigurationFactory.provider 

ロール・マッピング構成ファクトリのクラス名(oracle.security.jacc.provider.JACCRoleMappingConfigurationFactoryImpl) 

認可の方法

この項では、これまでに説明した主要なJavaセキュリティ・モデル(J2EE、Java 2、JAAS)それぞれについて、使用に適した環境とその仕組みを説明します。操作上の詳細は、このマニュアルの各所(ほとんどはこの章)で説明されています。

関連項目

 

J2EEセキュリティについて

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セキュリティを使用すると、管理者がセキュリティ・マネージャを有効化または無効化することで、セキュリティ・マネージャがセキュリティ・チェックを実行するタイミングを制御できます。

通常、コードベース・セキュリティとセキュリティ・マネージャの使用が必要となるのは、信頼できないコードがアプリケーション・サーバーを参照している場合に限られます。また、セキュリティ・マネージャを使用すると、パフォーマンスに影響が出る可能性があることにも注意してください。

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セキュリティ・ポリシーを強制するには、次のようにします。

JAASセキュリティについて

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セキュリティは、AccessController.checkPermission()メソッドまたはPolicy.implies()メソッドを介して強制できます。

Java 2セキュリティを併用している場合にセキュリティ・マネージャを有効にすると、SecurityManager.checkPermission()メソッドも使用できるようになります。

(Java 2ポリシーの強制に関する前述の説明も参照してください。)


戻る 次へ
Oracle
Copyright © 2003, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引