目次

Java セキュリティモデル と Java Service Wrapper を理解する

Java Service Wrapper は、パーミッション(アクセス権限)のシリーズを実装しており、 標準 Java セキュリティモデルを採用している Wrapper API へのアクセスを 完全に制限するために利用されます。

以下のセクションで説明するように、ユーザーは Java コーディングなしでポリシーファイルに必要な権限を定義できます。 このポリシーファイルは、Security Manager クラスを介してプログラムによって使用されます。

警告

Java 17 は、Security Manager を非推奨にします。 このセキュリティモデルの使用は推奨されなくなりました。

Java アプリケーション内から別のサービスを制御する

Wrapper では、適切なコントロールコードを送信することで、 システム上のいかなるサービス上で、開始、停止、 問い合わせ(interrogate)、 その他の運用の管理をすることが可能です。 これはとてもパワフルに強力でありますが、不正に利用されると、 サーバー上に深刻なセキュリティ問題を開けることにもなります。 この理由のため、デフォルトで、 [WrapperManager.sendServiceControlCode(...)] メソッドへのアクセスは無効になっています。 これを利用をするためには、JVM にセキュリティマネージャーをインストールして、 特定のパーミッション(アクセス権限)が与えられていることが必要です。

セキュリティマネージャーを設定する行為は、 セキュリティエラーでアプリケーション開始の失敗など、 多くの問題を引き起こすことになりますのでご注意ください。 アプリケーションに適切なパーミッション(アクセス権限)を 許可するために、様々な設定に入る必要があります。 セキュリティマネージャーに関する詳しい情報は、オラクルの チュートリアル(英語)をご覧ください: http://docs.oracle.com/javase/tutorial/essential/environment/security.html

セキュリティマネージャーを設定する

ご利用のJVMにセキュリティマネージャーをセットアップする一番簡単な方法は、 ご利用の[wrapper.conf] ファイルに次のプロパティを追加することです。

コンフィギュレーション設定例:
wrapper.java.additional.1=-Djava.security.manager
wrapper.java.additional.2=-Djava.security.policy=../conf/java.policy

java.security.manager:

最初のシステムプロパティ [java.security.manager (J2SE 5.0) (JavaSE6)] は、JVM が作成されるときにセキュリティマネージャーを 作成するよう、Java に指示します。

java.security.policy:

2つ目のシステムプロパティ [java.security.policy (J2SE 5.0) (JavaSE6)]は、 アプリケーション内部で許可されるべきアクセス権限を 示すファイルの配置を指示します。

ポリシーファイルは、シンプルなテキストファイルです。

ポリシーファイル設定例:
// Give Wrapper classes full permissions
grant codeBase "file:../lib/wrapper.jar" {
        permission java.security.AllPermission;
};

// Grant various permissions to a specific service.
grant codeBase "file:../lib/-" {
        permission org.tanukisoftware.wrapper.security.WrapperServicePermission
"myservice", "interrogate,start,stop";
};

最初のブロックは、クラス[wrapper.jar]に完全なアクセス権を与えます。 これは、Wrapper がアプリケーション全体を制御できるように、 つまりアプリケーションがすることは何でも全て Wrapper から制御できるようになります。 Wrapper はアプリケーション全体を起動できる必要があるため、 これをお勧めします。つまり、アプリケーションが行うことは すべて Wrapper から発信されます。

2つ目のブロックは、特定のサービスにアクセス権を与えます。 ご利用の「lib」ディレクトリーの「jar」ファイルにある、 いかなる他のクラスが、 Wrapper 経由で「myservice」 サービスの開始、 停止、問い合わせ(interrogate)を コールにさせることができることを意味しています。 もし、これがない場合には、コールは結果として 「SecurityExceptions」(セキュリティ例外)が投げられることになります。

WrapperManager.fireUserEvent API

Wrapper バージョン 3.5.8 で、 WrapperManager API を通してユーザー定義イベントを コールする機能が追加されました。 これはディベロッパー(開発者)にとって、ユーザーイベントの 利用を簡易にするには強力な機能でありますが、 もしプログラムが全てのユーザーイベントを自らコールするのを 許可されるとするならば、 そこにはセキュリティの懸念もあることでしょう。

その懸念の解消を提供するには、 API で、SecurityManager のポリシーファイルで定義できる WrapperUserEventPermissionクラスを利用します。

ポリシーファイルの例:
grant codeBase "file:../lib/some.jar" {
        permission org.tanukisoftware.wrapper.security.WrapperUserEventPermission "fireUserEvent", "-10, 50, 100-200, 555-";
}

上記の例は、次のユーザーイベント(userEvents)を コールする許可がある ライブラリ「../lib/some.jar」を装備しています:

  • -10」: もし、ある範囲の「開始番号」が省略されている場合、最初の値が例えば「1」で始まるシーケンスとして解釈します。

  • 50」: 単一の番号は個別に定義することができます

  • 100-200」: 範囲指定で「100〜200」間の全ての番号(100と200を含む)

  • 555-」: 範囲指定で「555〜」から、上限は有効なイベントナンバーまで。(555以上〜例:32767)

注意

一貫性を保つために、番号は並び替えされていなければなりません。 つまり、次のような並び 「5, -4」、「1, 8-10, 7」、「9-, 7」などは無効です。 設定ミスでアクセス違反エラーが発生します。