|
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
定期購読のご案内
バックナンバー販売協力店
|
JAVA Developer 10月号
大特集
再入門 J2SE
特集2 Oracle9i Application Server
[特別企画]
・例外処理のメカニズム
・データベース移行術(2) 「Oracle→DB2編」
・Tomcatで試すJava2セキュリティ
|
|