エンタープライズ:特集 2003/08/24 23:01:00 更新

[JAVA Developer特別企画]
Tomcatで試すJava 2 セキュリティ (3/6)

JAVA Developer 2003年10月号より転載

●セキュリティポリシーの指定
 セキュリティマネージャをインストールしたプログラムは、セキュリティポリシーの指定が必須です。ポリシーにはシステムポリシーとユーザーポリシー、アプリケーションポリシーの3種類があり、存在するすべてが適用されます。

・システムポリシー
 システムポリシーは、Java実行環境をインストールしたディレクトリであるJRE_HOME(※3)にあります。具体的には、JRE_HOME/lib/security/ディレクトリにjava.policyというファイル名で保存されています。このポリシーファイルでは、システムプロパティ(たとえばjava.versionのような)を読み取ることを許可するポリシーが記述されています。

・ユーザーポリシー
 ユーザーポリシーは、各ユーザーのホームディレクトリに「.java.policy」というファイル名で保存されていることが想定されています(※4)。なければ利用しません。

・アプリケーションポリシー
 最後のアプリケーションポリシーが、プログラムごとに準備するポリシーファイルです。本稿でいうポリシーとはアプリケーションポリシーを指します。
 アプリケーション単位で設定するセキュリティポリシーは次のようにしてJava仮想マシンの起動時にプロパティで与える必要があります。


> java -Djava.security.policy=policy.
txt MyApp

 もちろん、これに加えて前述のようにセキュリティマネージャの記述も行います(必要なら)。

※3 以下、JREをインストールしたディレクトリをJRE_HOMEと表記します。
※4 ホームディレクトリは、UNIXの場合「~」ディレクトリ、Windows 2000の場合は「%USERPROFILE%」ディレクトリです。

・Tomcatの場合
 Tomcatの場合、「-security」オプションをつけて起動するだけで、セキュリティマネージャのインストールやポリシーファイルの指定を意識する必要はありません。
 これにより、セキュリティポリシーに記述された内容がデータベースとしてセキュリティマネージャに登録され、ポリシーに沿って実行内容を逐一チェックするようになります。
 TomcatのセキュリティポリシーファイルはCATALINA_HOME/conf/catalina.policyというファイルにテキストで記述します。
 このファイルは、あらかじめTomcatのインストールと同時にコピーされていますので、お手元の環境で確認してみてください。デフォルトで与えられる各種のパーミッションが記述されています。

●セキュリティポリシーの記述
 セキュリティポリシーはUTF-8エンコーディングで記述されたテキストファイルです。図4のような記述が最もシンプルなものになります。ポリシーファイルは、処理の過程でさまざまな前処理が入ります。また、設定に柔軟性を持たせるためのクラスを利用して、独自のワイルドカードが使えます。

図4 シンプルなポリシーの例

grant codeBase "file:///c:/app/" …(A)
{
permission java.io.FilePermission
"c:${/}app${/}-", "read";
 …(B)

};

Aは実行するコードを特定する情報
Bはパーミッションを表現する内容
「AがBすることを許す」という意味合いになる。

 前処理は、まずStreamTokenizerによるパース処理があります。そのため、バックスラッシュ(¥)によるエスケープやC++スタイルのコメントが許容されます。
 さらにその後、プロパティによる展開が行われます。そのため、2重引用符で囲まれた文字列にはプロパティを示す${java.home}などの記述が利用できます。
 独自のワイルドカードに関しては、後述するBasicPermissionの項目で説明します。また、プロパティの展開については最後の応用で利用法を紹介します。

・grantエントリ
 図4ではあくまでも一般化していますが、この記述1つをgrantエントリと呼びます。grantエントリを複数ならべてポリシーを構成します。
 Aには、一般にはコードベース、署名者の情報を記述しますが、なくてもかまいません。ない場合は、すべてのコードを意味します。
 コードベースというのは、そのコード(クラスファイル)を得た場所のことです。Tomcatなどで考えるとハードディスク上と考えるのが一般的ですが、アプレットやRMIオブジェクトはネットワーク上のURLでしか表現できません。そのため、コードベースは(仮にローカルのハードディスクであっても)URLで記述します。
 署名者は、だれが署名したクラスに対するパーミッションなのかを示す情報です。今回は、コードベースについてのみ例をあげて説明します。
 図4のBはパーミッションを列挙したものです。「ファイルAの読み込み」、「ファイルBの読み込み」……といった具合に列挙すれば、それらがORの関係で追加されていきます。

・パーミッションエントリ
 コードを絞り込んだら、そのコードに与えるパーミッションを記述します。パーミッションは前述のとおりクラスですので、クラスの完全修飾名(FQCN)を書くことによって許可するカテゴリを示し、パラメータとして対象と動作をそれぞれ文字列で示します(図5)。

図5 パーミッションの記述

grant
{
パーミッションクラスの完全修飾名
 ターゲット, アクション;
};

 パラメータのうち対象をターゲットと呼び(または単に「名前」と呼ぶこともあります)、動作をアクションと呼びます。アクションのないものもありますが、多くのものはターゲットとアクションをセットにして1エントリを記述します。エントリの末尾にセミコロンが必要です。

[JAVA Developer特別企画]
Tomcatで試すJava 2 セキュリティ
・Tomcatとプラットフォームセキュリティ
・パーミッションクラス
・Tomcatにおけるポリシー設定例

関連リンク
▼JAVA Developer
▼定期購読のご案内
▼バックナンバー販売協力店

JAVA Developer10月号表紙 JAVA Developer 10月号

大特集
再入門 J2SE

特集2 Oracle9i Application Server
[特別企画]
・例外処理のメカニズム
・データベース移行術(2)
 「Oracle→DB2編」
・Tomcatで試すJava2セキュリティ

前のページ | 1 2 3 4 5 6 | 次のページ

[水沢典行,JAVA Developer]