この章では、全般的なセキュリティ対策を有効にする方法について説明します。ここで説明する対策は、Oracle Coherence APIおよびシステム・リソースの無許可の使用を防ぐのに役立ちます。また、クラスタへの無許可の接続も防ぎます。
この章には次の項が含まれます:
Javaには、明示的なパーミッションを使用してシステム・リソースへのアクセスを制御するセキュリティ・マネージャがあります。COHERENCE_HOME/lib/security/security.policyポリシー構成ファイルでは、Oracle Coherenceの最小限のパーミッションのセットが指定されています。提供されているファイルを使用するか、追加のパーミッションを設定するようにファイルを変更します。
この項の内容は次のとおりです。
Javaセキュリティ・マネージャを有効にし、COHERENCE_HOME/lib/security/security.policyファイルを使用するには、クラスタ・メンバーで次のプロパティを設定します。
java.security.managerプロパティを、Javaセキュリティ・マネージャを有効にするように設定します。例:
-Djava.security.manager
java.security.policyプロパティをポリシー・ファイルの場所に設定します。例:
-Djava.security.manager -Djava.security.policy=/coherence/lib/security/security.policy
coherence.homeシステム・プロパティをCOHERENCE_HOMEに設定します。例:
-Djava.security.manager -Djava.security.policy=/coherence/lib/security/security.policy -Dcoherence.home=/coherence
|
注意: セキュリティ・ポリシー・ファイルでは、デフォルトのJava Runtime Environment (JRE)セキュリティ・パーミッションが付与されていることが想定されています。そのため、java.security.policyシステム・プロパティを設定するときは、2つの等号(==)ではなく、1つの等号(=)を使用するように注意してください。 |
必要に応じて追加のパーミッションを含むようにCOHERENCE_HOME/lib/security/security.policyファイルを変更します。ファイル形式および構文の詳細は、Java SEセキュリティ・ガイドを参照してください。
http://download.oracle.com/javase/7/docs/technotes/guides/security/permissions.html
security.policyファイルで追加のパーミッションを指定するには:
security.policyファイルを編集し、リソースに対するパーミッションを追加します。たとえば、次のパーミッションでは、coherence.jarライブラリへのアクセスが付与されます。
grant codeBase "file:${coherence.home}/lib/coherence.jar"
{
permission java.security.AllPermission;
};
バイナリを宣言する場合は、JDK jarsignerツールを使用してバイナリに署名します。次の例では、前の手順で宣言されたcoherence.jarリソースに署名します。
jarsigner -keystore ./keystore.jks -storepass password coherence.jar admin
パーミッション宣言に署名者を追加します。たとえば、元のパーミッションを次のように変更して、admin署名者を追加します。
grant SignedBy "admin" codeBase "file:${coherence.home}/lib/coherence.jar"
{
permission java.security.AllPermission;
};
オペレーティング・システム・メカニズムを使用して、関連するすべてのファイルを悪質な変更から保護します。
ホストベースの認可は、指定されたホスト(ホスト名またはIPアドレス・ベース)のみがクラスタに接続できるようにするタイプのアクセス制御です。この機能は、クラスタ・メンバー接続とExtendクライアント接続の両方で使用できます。
この項の内容は次のとおりです。
ホストベースの認可では、クラスタ・メンバーまたはExtendクライアントのホスト名およびIPアドレスを使用して、クラスタへの接続が許可されるかどうかを決定します。特定のホスト名、アドレスおよびアドレス範囲を定義できます。カスタム処理では、カスタム・フィルタを作成してホストの検証ができます。
ホストベースの認可は、相対的な静的ネットワーク・アドレスを持つ既知のホストがクラスタに参加またはアクセスしている環境に適しています。動的な環境の場合、またはDNSサーバーの更新中の場合は、IPアドレスが変わり、クラスタ・メンバーまたはExtendクライアントが認可に失敗する可能性があります。クラスタ・メンバーまたはExtendクライアントが認可されない場合、キャッシュ操作が完了しないことがあります。Extendクライアントは、一時的な性質が原因となるアクセスの問題が起きる可能性があります。
ホストベースの認可を使用する場合、ネットワーク環境の動的性質を考慮します。認可されるホストのリストを再構成するという要求は、現実的ではない場合があります。可能な場合、特定のホスト名を使用するかわりに、常にIPアドレスの範囲を使用します。または、変更されたアドレスを解決できるカスタム・フィルタを作成します。ホストベースの認可が実行不可能な場合、ExtendクライアントのIDトークン(「IDトークンを使用したクライアント接続の制限」を参照)、またはSSL(第5章「SSLを使用した通信の保護」)の使用を考慮します。
クラスタのデフォルトの動作では、いずれのホストもクラスタに接続し、クラスタ・メンバーになることができます。ホストベースの認可は、この動作を変更して、特定のホスト名またはIPアドレスを持つホストのみがクラスタに接続できるようにします。
<cluster-config>要素内の<authorized-hosts>要素を使用して、オペレーション・オーバーライド・ファイルで認可済のホストを構成します。<host-address>要素を使用して特定のアドレスを入力するか、<host-range>要素を使用してアドレスを範囲を入力します。<host-address>要素および<host-range>要素は、複数の要素を一意に識別するid属性をサポートします。
次の例では、IPアドレスが192.168.0.5か192.168.0.6であるか、または192.168.0.10から192.168.0.20および192.168.0.30から192.168.0.40の範囲内であるクラスタ・メンバーのみを受け入れるようにクラスタを構成します。
<?xml version='1.0'?>
<coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
xsi:schemaLocation="http://xmlns.oracle.com/coherence/
coherence-operational-config coherence-operational-config.xsd">
<cluster-config>
<authorized-hosts>
<host-address id="1">192.168.0.5</host-address>
<host-address id="2">192.168.0.6</host-address>
<host-range id="1">
<from-address>192.168.0.10</from-address>
<to-address>192.168.0.20</to-address>
</host-range>
<host-range id="2">
<from-address>192.168.0.30</from-address>
<to-address>192.168.0.40</to-address>
</host-range>
</authorized-hosts>
</cluster-config>
</coherence>
拡張プロキシ・サーバーのデフォルトの動作では、いずれのExtendクライアントもクラスタに接続できます。ホストベースの認可は、この動作を変更して、特定のホスト名またはIPアドレスを持つホストのみがクラスタに接続できるようにします。
プロキシ・スキーム定義の<tcp-acceptor>要素内の<authorized-hosts>要素を使用して、キャッシュ構成ファイルで認可済のホストを構成します。<host-address>要素を使用して特定のアドレスを入力するか、<host-range>要素を使用してアドレスを範囲を入力します。<host-address>要素および<host-range>要素は、複数の要素を一意に識別するid属性をサポートします。
次の例では、IPアドレスが192.168.0.5か192.168.0.6であるか、または192.168.0.10から192.168.0.20および192.168.0.30から192.168.0.40の範囲内であるクライアントからの接続のみを受け入れるように拡張プロキシを構成します。
<proxy-scheme>
<service-name>ExtendTcpProxyService</service-name>
<thread-count>5</thread-count>
<acceptor-config>
<tcp-acceptor>
...
<authorized-hosts>
<host-address id="1">192.168.0.5</host-address>
<host-address id="2">192.168.0.6</host-address>
<host-range id="1">
<from-address>192.168.0.10</from-address>
<to-address>192.168.0.20</to-address>
</host-range>
<host-range id="2">
<from-address>192.168.0.30</from-address>
<to-address>192.168.0.40</to-address>
</host-range>
</authorized-hosts>
...
</tcp-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>
フィルタ・クラスは、特定のホスト接続を受け入れるかどうかを決定します。Extendクライアント接続とクラスタ・メンバー接続の両方とも、フィルタ・クラスの使用をサポートしています。フィルタ・クラスでは、com.tangosol.util.Filterインタフェースを実装する必要があります。インタフェースのevaluate()メソッドに、ホストのjava.net.InetAddressが渡されます。実装は、trueを返して接続を受け入れます。
フィルタ・クラスを有効にするには、<host-filter要素内の<class-name要素を使用して、完全修飾クラス名を入力します。<init-params要素を使用して、初期化パラメータを設定します。Filterインタフェースの詳細は、Oracle Coherence Java APIリファレンスを参照してください。
次の例では、MyFilterという名前のフィルタを構成します。このフィルタは、ホスト接続が許可されるかどうかを決定します。
<authorized-hosts>
<host-address id="1">192.168.0.5</host-address>
<host-address id="2">192.168.0.6</host-address>
<host-range id="1">
<from-address>192.168.0.10</from-address>
<to-address>192.168.0.20</to-address>
</host-range>
<host-filter>
<class-name>package.MyFilter</class-name>
<init-params>
<init-param>
<param-name>sPolicy</param-name>
<param-value>strict</param-value>
</init-param>
</init-params>
</host-filter>
</authorized-hosts>
不正なクライアントとは、許容範囲外で動作するExtendクライアントです。不正なクライアントは、応答の遅いクライアントや、サービス拒否攻撃の場合のようにプロキシを過剰に使用しようとする悪質なクライアントです。いずれの場合も、プロキシがメモリーを使い果たし、応答しない状態になる可能性があります。サスペクト・プロトコルは、このような悪用を防ぎます。
サスペクト・アルゴリズムを使用してクライアント接続をモニターし、異常に遅い、または悪用されているクライアントを探します。不正なクライアント接続が検出されると、プロキシ・サーバーがメモリー不足になることを防ぐために、アルゴリズムによって接続が閉じられます。プロトコルは、クライアントの送信接続バッファ・バックログのサイズ(バイト数)と長さ(メッセージ数)の両方をモニタリングすることによって機能します。様々なレベルによって、クライアントが疑わしいとき、正常に戻ったとき、または不正と見なされるときが判断されます。
サスペクト・プロトコルは、プロキシ・スキーム定義の<tcp-acceptor要素内で構成します。<tcp-acceptor要素の使用方法の詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。疑いのあるプロトコルはデフォルトで有効です。
次の例は、サスペクト・プロトコルの構成方法を示しており、デフォルト設定に類似しています。クライアントの送信接続バッファ・バックログが10MBまたはメッセージ数が10000個に達すると、クライアントは疑わしいと見なされ、モニターされます。クライアントの接続バッファ・バックログが2MBまたはメッセージ数が2000個まで戻ると、クライアントは安全と見なされ、モニターされなくなります。クライアントの接続バッファ・バックログが95MBまたはメッセージ数が60000個に達すると、クライアントは安全でないと見なされ、プロキシは接続を閉じます。
<proxy-scheme>
<service-name>ExtendTcpProxyService</service-name>
<thread-count>5</thread-count>
<acceptor-config>
<tcp-acceptor>
...
<suspect-protocol-enabled>true</suspect-protocol-enabled>
<suspect-buffer-size>10M</suspect-buffer-size>
<suspect-buffer-length>10000</suspect-buffer-length>
<nominal-buffer-size>2M</nominal-buffer-size>
<nominal-buffer-length>2000</nominal-buffer-length>
<limit-buffer-size>95M</limit-buffer-size>
<limit-buffer-length>60000</limit-buffer-length>
</tcp-acceptor>
</acceptor-config>
<autostart>true</autostart>
</proxy-scheme>