7 Javaセキュリティを使用したWebLogicリソースの保護
Java EEセキュリティを使用したWebLogicリソースの保護
Java EEセキュリティを使用して、URL (Web)、Enterprise JavaBeans (EJB)、およびコネクタのコンポーネントを保護することができます。さらに、WebLogic Serverでは、デプロイメント記述子内の追加のセキュリティ・ポリシーを指定するコネクタ・モデルが、URLおよびEJBのコンポーネントに拡張されています。
コネクタ仕様では、すでに次の例のように<security-permission>
タグを使用して追加セキュリティ・ポリシーを指定するデプロイメント記述子に対応しています(例7-1を参照):
例7-1 security-permissionタグのサンプル
<security-permission> <description> Optional explanation goes here </description> <security-permission-spec> <!-- A single grant statement following the syntax of http://xmlns.jcp.org/j2se/1.4.2/docs/guide/security/PolicyFiles.html#FileSyntax without the "codebase" and "signedBy" clauses goes here. For example: --> grant { permission java.net.SocketPermission "*", "resolve"; }; </security-permission-spec> </security-permission>
rar.xml
ファイルでの<security-permission>
タグのサポートに加えて、WebLogic Serverではweblogic.xml
ファイルとweblogic-ejb-jar.xml
ファイルに<security-permission>
タグを追加しています。これらは、コネクタ・モデルを他の2つのアプリケーション・タイプ(WebアプリケーションとEJB)に拡張し、すべてのコンポーネント・タイプでセキュリティ・ポリシーへのインタフェースを統一すると共に、将来のJava EE仕様の変更に備えるためのものです。
ノート:
Java EEコネクタ・アーキテクチャ仕様と同じように、Java EEでは異なるアプリケーション・タイプ(Java EE仕様を参照)のJavaセキュリティのデフォルト・パーミッションに対する要件が規定されています。
Javaセキュリティ・マネージャを使用したWebLogicリソースの保護
WebLogic Serverと一緒に使用するようにJavaセキュリティ・マネージャを設定して、Java仮想マシン(JVM)内で実行されているリソースの保護を強化できます。また、Javaセキュリティ・マネージャの拡張であるセキュリティ・マネージャのプリントも使用することができます。
Javaセキュリティ・マネージャは、任意のセキュリティ・ステップです。以下の節では、WebLogic ServerでJavaセキュリティ・マネージャを使用する方法について説明します。
Javaセキュリティ・マネージャの詳細は、http://docs.oracle.com/javase/8/docs/technotes/guides/security/index.html
でJavaセキュリティに関するWebページを参照してください。
Javaセキュリティ・マネージャの設定
WebLogic Serverを実行する場合、WebLogic ServerはJavaセキュリティ・マネージャを使用して、信頼性のないコードがJavaセキュリティ・ポリシー・ファイルによって制限されているアクションを実行しないようにできます。
Java仮想マシン(JVM)には、Javaセキュリティ・ポリシー・ファイルでコードに制約を設定するセキュリティ・メカニズムが組み込まれています。Javaセキュリティ・マネージャは、Javaセキュリティ・ポリシー・ファイルを使用して一連の許可をクラスに強制的に付与します。これらの許可を使用すると、JVMのインスタンスで実行される指定されたクラスに特定の実行時処理を許可するかどうかを設定できます。多くの場合、脅威モデルでは悪意あるコードがJVMで実行されることを想定していないため、Javaセキュリティ・マネージャは必要ありません。しかし、信頼されていないサード・パーティがWebLogic Serverを使用し、信頼されていないクラスが実行される場合、Javaセキュリティ・マネージャが役立ちます。
WebLogic ServerでJavaセキュリティ・マネージャを使用するには、WebLogic Serverの起動時に-Djava.security.policy
引数と-Djava.security.manager
引数を指定します。-Djava.security.policy
引数は、Javaセキュリティ・ポリシーを格納するファイル名を、相対パス名または絶対パス名で指定します。WebLogic ServerでJavaセキュリティ・マネージャを使用している場合、java weblogic.Server
コマンドを使用してコマンド・ラインからWebLogic Serverを起動する際に、-Dweblogic.Name
引数も指定する必要があります。たとえば:
java -Dweblogic.Name=server-name
-Djava.security.manager
-Djava.security.policy[=]=filename
weblogic.Server
WebLogic Serverには、編集および使用可能なサンプルJavaセキュリティ・ポリシー・ファイルが用意されています。このファイルは、WL_HOME\server\lib\weblogic.policy
にあります。
ノート:
このサンプル・ポリシー・ファイルは完全なものではなく、修正を加えてからでないとWebLogic Serverを起動できません。特に、WLSやすべてのアプリケーションが適切に機能するには、構成に基づいて各種の許可を追加する必要があります。
パッチを適用する際、特に注意してください。システム権限のコードが含まれるパッチを適用する場合、使用するカスタムJavaポリシー・ファイルやweblogic.policy
に、関連する変更を行う必要が生じる場合があります。
たとえば、WebLogic Serverを正常に起動してWebLogic Server管理コンソールからアプリケーションをデプロイするには、weblogic.policyに次のように追加する必要があります。
permission java.util.PropertyPermission '*', 'read'; permission java.lang.RuntimePermission '*'; permission java.io.FilePermission ' <<ALL FILES>>', 'read,write'; permission javax.management.MBeanPermission '*', '*';
セキュリティ・ポリシー・ファイルを指定しないでJavaセキュリティ・マネージャを有効にする場合、Javaセキュリティ・マネージャでは、$JAVA_HOME\jre\lib\security
ディレクトリのjava.policy
ファイルに定義されるデフォルトのセキュリティ・ポリシーを使用します。
Javaセキュリティ・マネージャのセキュリティ・ポリシーは、以下のいずれかの方法で定義します。
全体的に使用するweblogic.policyファイルの修正
WebLogic ServerデプロイメントでJavaセキュリティ・マネージャのセキュリティ・ポリシー・ファイルを使用するには、WebLogic Serverの起動時にJavaセキュリティ・マネージャにweblogic.policy
ファイルの場所を指定する必要があります。これを行うには、サーバーの起動に使用するJavaコマンド・ラインで次の引数を設定します。
-
java.security.manager
は、JVMにJavaセキュリティ・ポリシー・ファイルを使用するよう指示します。 -
java.security.policy
は、JVMに使用するJavaセキュリティ・ポリシー・ファイルの場所を指示します。この引数は、Javaセキュリティ・ポリシーの完全修飾名(この場合はweblogic.policy
)です。
たとえば:
java...-Djava.security.manager \ -Djava.security.policy==c:\weblogic\weblogic.policy
ノート:
java.security.policy引数を指定するときには、Javaセキュリティ・マネージャによってweblogic.policyファイルだけが使用されるよう、= のかわりに == を使用します。== を使用すると、weblogic.policyファイルはデフォルトのセキュリティ・ポリシーをオーバーライドします。単一の等号記号(=)を使用すると、ポリシー・ファイルは既存のセキュリティ・ポリシーに付加されます。
CLASSPATH
に追加のディレクトリがある場合、または追加のディレクトリにアプリケーションをデプロイしている場合は、それらのディレクトリに対する特定の許可をweblogic.policy
ファイルに追加します。
weblogic.policy
ファイルを使用する際には、次のような注意事項を考慮することをお薦めします。
-
weblogic.policy
ファイルのバックアップを作成し、安全な場所に保管します。 -
オペレーティング・システムを通じて、WebLogic Serverデプロイメントの管理者は読み書き権限を持ち、それ以外のユーザーはアクセス権を持たないように、
weblogic.policy
ファイルに許可を設定します。ノート:
Javaセキュリティ・マネージャは、管理サーバーと管理対象サーバーの起動時に部分的に無効にされます。起動シーケンス中は、現在のJavaセキュリティ・マネージャが無効化され、checkRead()メソッドが無効化されたJavaセキュリティ・マネージャに置き換えられます。このメソッドを無効化した場合、起動シーケンスのパフォーマンスは飛躍的に向上しますが、セキュリティは最低レベルに下がります。WebLogic Serverのスタート・アップ・クラスは、この部分的に無効にされたJavaセキュリティ・マネージャと一緒に実行されます。このため、スタート・アップ・クラスを十分にチェックして、セキュリティ(ファイルの読取りなど)を検討する必要があります。
Javaセキュリティ・マネージャの詳細は、java.lang.SecurityManagerクラス(http://docs.oracle.com/javase/8/docs/api/java/lang/SecurityManager.html
)のJavadocを参照してください。
アプリケーション型のセキュリティ・ポリシーの設定
サーブレット、EJBおよびJava EEコネクタ・アーキテクチャ・リソース・アダプタのデフォルト・セキュリティ・ポリシーを、Javaセキュリティ・ポリシー・ファイルで設定します。サーブレット、EJBおよびリソース・アダプタのデフォルト・セキュリティ・ポリシーは、次のコード・ベースでJavaセキュリティ・ポリシーに定義します。
-
サーブレット -
"file:/weblogic/application/defaults/Web"
-
EJB -
"file:/weblogic/application/defaults/EJB"
-
リソース・アダプタ -
"file:/weblogic/application/defaults/Connector"
ノート:
これらのセキュリティ・ポリシーは、WebLogic Serverの特定のインスタンスにデプロイされるすべてのサーブレット、EJBおよびリソース・アダプタに適用されます。
アプリケーション固有のセキュリティ・ポリシーの設定
特定のサーブレット、EJBまたはリソース・アダプタのセキュリティ・ポリシーを設定するには、セキュリティ・ポリシーをそれらのデプロイメント記述子に追加します。デプロイメント記述子は、以下のファイルに定義されます。
-
サーブレット -
weblogic.xml
-
EJB -
weblogic-ejb-jar.xml
-
リソース・アダプタ -
rar.xml
ノート:
リソース・アダプタのセキュリティ・ポリシーはJava EE仕様に準拠し、サーブレットおよびEJBのセキュリティ・ポリシーはWebLogic ServerのJava EE仕様拡張に準拠します。
例7-2は、セキュリティ・ポリシーをデプロイメント記述子に追加するための構文です:
ノート:
現時点では、<security-permission-spec>タグはweblogic-application.xmlファイルに追加できません。このタグを使用できるのは、weblogic-ejb-jar.xml、rar.xml、またはweblogic.xmlファイルの中だけです。また、<security-permission-spec>属性では変数はサポートされていません。
例7-2 セキュリティ・ポリシーの構文
<security-permission> <description> Allow getting the J2EEJ2SETest4 property </description> <security-permission-spec> grant { permission java.util.PropertyPermission "welcome.J2EEJ2SETest4","read"; }; </security-permission-spec> </security-permission>
セキュリティ・マネージャのプリントの使用
セキュリティ・マネージャのプリントは、Javaセキュリティ・マネージャの拡張です。セキュリティ・マネージャをプリントすることにより、Javaセキュリティ・マネージャで実行しているJavaアプリケーションに対して必要となる許可のすべてを識別するために使用できます。一度に1つずつ必要な許可を識別するJavaセキュリティ・マネージャと異なり、セキュリティ・マネージャのプリントによって、介入せずに必要な許可のすべてを識別することができます。
Javaセキュリティ・マネージャの詳細は、http://docs.oracle.com/javase/8/docs/technotes/guides/security/overview/jsoverview.html
でJavaセキュリティに関するWebページを参照してください。
ノート:
本番環境でセキュリティ・マネージャのプリントを使用しないでください。不足している許可を識別するための開発のみを目的としています。
信頼性のないコードの処理は防止されません。
セキュリティ・マネージャのプリントの起動引数
WebLogic ServerでJavaセキュリティ・マネージャを使用するには、WebLogic Serverの起動時に次の2つの引数を指定します。
-
-Djava.security.manager=weblogic.security.psm.PrintingSecurityManager
-Djava.security.manager
引数は、どのJavaセキュリティ・マネージャを起動するかをWebLogic Serverに指示します。この場合、セキュリティ・マネージャのプリントを使用します。 -
-Djava.security.policy
-Djava.security.policy
引数は、Java 2セキュリティ・ポリシーを格納するファイル名を、相対パス名または絶対パス名で指定します。WebLogic Serverには、編集および使用可能なサンプルJavaセキュリティ・ポリシー・ファイルが用意されています。このファイルは、WL_HOME
\server\lib\weblogic.policy
にあります。デフォルトでは、
startWebLogic
スクリプトに-Djava.security.policy
プロパティ(WL_HOME
/server/lib/weblogic.policy
に設定)が含まれているので、別のJavaセキュリティ・ポリシー・ファイルを使用しないかぎり、指定する必要はありません。
ノート:
このサンプル・ポリシー・ファイルは完全なものではなく、修正を加えてからでないとWebLogic Serverを起動できません。特に、WLSやすべてのアプリケーションが適切に機能するには、構成に基づいて各種の許可を追加する必要があります。
次の項を参照してください。
セキュリティ・マネージャのプリントを使用するWebLogic Serverの起動
セキュリティ・マネージャのプリントを使用するWebLogic ServerをUNIXシェルから起動するには、DOMAIN_HOMEにおけるstartWebLogic.shスクリプトに次の引数を渡します。この例は、startWeblogic.shからのデフォルトweblogic.policyのJavaポリシー・ファイルを使用します。
startWeblogic.sh -Djava.security.manager=weblogic.security.psm.PrintingSecurityManager
UNIXシェルなしWindowsシステムのためにまず、JAVA_OPTIONSに起動オプションを設定し、DOMAIN_HOME
のstartWebLogic.cmdスクリプトを使用して、WebLogic Serverを起動します。この例は、startWeblogic.cmd
からのデフォルトのweblogic.policyのJavaポリシー・ファイルを使用します。
$ set JAVA_OPTIONS=-Djava.security.manager=weblogic.security.psm.PrintingSecurityManager $ DOMAIN_HOME\startWeblogic.cmd
出力ファイルの書込み
セキュリティ・マネージャのプリントは、コード・ソースおよびそれに関する許可をリストする出力を生成します。また、ポリシー・ファイルにコピー・アンド・ペーストするためのアクセスを付与するポリシーも発生します。
デフォルトで、System.outに出力します。次の2つの引数で出力ファイルを構成することができます。
-
-Doracle.weblogic.security.manager.printing.file=psm_perms.txt
-
-Doracle.weblogic.security.manager.printing.generated.grants.file=psm_grants.txt
最初のシステム引数の値は、セキュリティ・マネージャをプリントすることにより、不足している許可のメッセージのすべてを書き込むファイルです。2番目の引数の値は、セキュリティ・マネージャをプリントすることにより、不足しているポリシー付与を書き込むファイルです。
たとえば、UNIXシェルなしWindowsシステムのために、引数をJAVA_OPTIONSに追加します。
$ set JAVA_OPTIONS=-Djava.security.manager=weblogic.security.psm.PrintingSecurityManager -Doracle.weblogic.security.manager.printing.file=psm_perms.txt $ startWeblogic.cmd
出力ファイルのフルパスを指定しない場合、DOMAIN_HOMEに作成されます。
Java Authorization Contract for Containersの使用
Java Authorization Contract for Containers (JACC)は、WebLogic Serverドメイン内のEJBおよびサーブレット・コンテナに代替認可メカニズムを提供します。特定のシステム・プロパティと値のペアを指定することで、WebLogic JACCプロバイダを使用可能にできます。
JACCはJava EEの一部です。JACCは、EJBおよびサーブレットに対するJavaパーミッション・ベースのセキュリティ・モデルです。JACCは、JSR-115(http://www.jcp.org/en/jsr/detail?id=115
)によって定義されます。
表7-2に示すように、JACCが構成されていると、WebLogicセキュリティ・フレームワークのアクセス決定、裁決、およびロール・マッピング機能は、EJBおよびサーブレットの認可判定には使用されません。
WebLogic Serverは、JSR-115に完全に準拠しているものの、WebLogic認可プロバイダほどには最適化されていないJACCプロバイダを実装します。Java JACCクラスは、アクセス決定を下す際に使用します。JSR-115はロール・マッピングに対処する方法を定義しないので、ロールとプリンシパルの間のマッピングにはWebLogic JACCクラスが使用されます。
ノート:
WebLogic Serverで使用されるJACCクラスには、決定を下すためのポリシー・オブジェクトの実装は含まれません。かわりに、JACCクラスは、java.security.Policy
(http://docs.oracle.com/javase/8/docs/api/java/security/Policy.html
)オブジェクトに依存します。
この節では、以下のトピックを取り上げます。
表7-2には、JACCを有効にした場合に、どのプロバイダがロール・マッピングに使用されるかを示します。
表7-1 JACCを有効にした場合
ステータス | EJB/サーブレットの認可とロール・マッピングに使用されるプロバイダ | その他のすべての認可とロール・マッピングに使用されるプロバイダ | EJB/サーブレットのロールとポリシーをWebLogic Server管理コンソールで表示および変更できるかどうか |
---|---|---|---|
JACCは有効です |
JACCプロバイダ |
WebLogicセキュリティ・フレームワーク・プロバイダ |
いいえ |
JACCは有効ではありません |
WebLogicセキュリティ・フレームワーク・プロバイダ |
WebLogicセキュリティ・フレームワーク・プロバイダ |
設定によっては、はい |
ノート:
JACCは、ドメイン内のすべてのサーバーで有効にするか、またはすべてのサーバーで無効にしてください。これは、WebLogicセキュリティ・フレームワークがレルム/ドメイン固有であるのに対し、JACCはサーバー固有であるためです。WebLogic JACCを使用するか、独自のJACCプロバイダを作成(こちらを推奨)してJACCを有効にした場合は、EJBとServletの認可ポリシーをドメイン内で同期させる必要があります。たとえば、アプリケーションは、サーバーを起動するたびに再デプロイされます。JACCが構成されたサーバーを、コマンド・ラインにJACCオプションを指定せずに起動すると、EJBやServletのロール・マッピングおよび認可判定にデフォルトのWebLogic認可プロバイダが使用されます。
WebLogic JACCプロバイダとWebLogic認可プロバイダの比較
WebLogic JACCプロバイダは、JSR-115に完全に準拠していますが、動的ロール・マッピングをサポートしておらず、EJBおよびサーブレット以外のリソースの認可判定は行いません。セキュリティ機能のパフォーマンスと柔軟性を向上させるため、SSPIベースのプロバイダを使用することをお薦めします。
表7-2では、WebLogic JACCプロバイダとWebLogic認可プロバイダの機能を比較します。
表7-2 WebLogic JACCプロバイダとWebLogic認可プロバイダの比較
WebLogic JACCプロバイダ | WebLogic認可プロバイダ |
---|---|
JACC仕様(JSR-115)を実装します |
付加価値の高いセキュリティ・フレームワーク |
EJBおよびサーブレットのみデプロイメント/認可判定を行います |
デプロイメント/認可判定を行います |
|
複数の認可/ロール・プロバイダで使用可能です |
デプロイメント時の静的ロール・マッピング |
動的ロール・マッピング |
Java EE許可でアクセスを制御します |
資格エンジンでアクセスを制御します |
ロール・マッピングおよびロール/プリンシパル・マッピングは、デプロイメント記述子でのみ変更可能です |
ロール・マッピングおよびロール/プリンシパル・マッピングは、デプロイメント記述子およびWebLogic Server管理コンソールで変更可能です |
WebLogic JACCプロバイダの有効化
WebLogic Serverを起動するコマンドに、次のシステム・プロパティと値のペアを指定して、WebLogic JACCプロバイダを有効化できます。
-
プロパティ:
javax.security.jacc.PolicyConfigurationFactory.provider
値:
weblogic.security.jacc.simpleprovider.PolicyConfigurationFactoryImpl
-
プロパティ:
javax.security.jacc.policy.provider
値:
weblogic.security.jacc.simpleprovider.SimpleJACCPolicy
-
プロパティ:
weblogic.security.jacc.RoleMapperFactory.provider
値:
weblogic.security.jacc.simpleprovider.RoleMapperFactoryImpl
ノート:
システム・プロパティ-Djavax.security.jacc.PolicyConfigurationFactory.provider
および-Djavax.security.jacc.policy.provider
が指定されている場合、WebLogic Serverでは、自動的にデフォルトのRoleMapperFactory
プロパティを初期化します。したがって、weblogic.security.jacc.RoleMapperFactory.provider
システム・プロパティを指定して、WebLogic JACCプロバイダを有効化する必要はありません。
たとえば、適切に構成されたweblogic.policy
ファイルがあれば、次のコマンド・ラインでWebLogic JACCプロバイダが有効になります。
# ./startWebLogic.sh -Djavax.security.jacc.policy.provider=\ weblogic.security.jacc.simpleprovider.SimpleJACCPolicy \ -Djavax.security.jacc.PolicyConfigurationFactory.provider=\ weblogic.security.jacc.simpleprovider.PolicyConfigurationFactoryImpl \