ポリシーファイルにおけるパーミッションの記述例 【はじめに】 ポリシーファイルは個々のjavaプログラム実行中に,処理の遂行をチェックしなければ危険がある と思われる機能について,それを遂行してよいか否かの権限(パーミッション)を事前に与えるものです. チェックしなければならない機能としては,ファイルアクセス,ネットワーク接続,プロパティ(後述)等, 様々あります. 空のポリシーファイル下では,そのようなチェックしなければならない機能に全てに対して, パーミッションが与えられていない状態です. 機能を提供するクラスファイル(コード)の個々の出所に基づき, パーミッションを与えることで,特定の機能の遂行を許可することができます. 【基本的な文法】 // コメントです grant codeBase "コードの出所を示すURL"{ // コメントだゾ permission パーミッション毎の許可記述; }; というブロックの繰り返しがポリシーファイルには記述されます. 尚,Java同様「//」以降はコメント文として無視されます. 【コードを出所を示すURL】 ブラウザに使う通常のURLとほぼ同じです.httpだけでなく,ftp等もプロトコルとして使えます. 基本的にはディレクトリ(フォルダ)を指定しますが,jarも指定できます. http://kaiya.cs.shinshu-u.ac.jp/codes/ ftp://ftp.jaist.ac.jp/java/dl/ http://newfs.xfs.org/java/tool/Newfs.jar また,クライアントマシン内のローカルディレクトリもURLとして以下のように指定します. (以下はWindows系システムの場合の例) file:. file:C:\\Temp\\Java\\ 【パーミッション毎の許可記述】 基本的には, ・パーミッションを表すクラス名 ・ターゲット名 ・アクション の三つの対で記述されます. パーミッションの種類によって,微妙に違うので,下記でそれぞれ説明します. 【ファイルに関するパーミッション】 ・パーミッションを表すクラス名 java.io.FilePermission ・ターゲット名 パス名 ・アクション read, write, execute, delete 等の組み合わせ パス名に関しては以下の特殊な文法が使えます. ・あるディレクトリ直下のファイル全て dir\\* ・あるディレクトリより下の全てのファイル dir\\- ・現在のディレクトリ直下のファイル全て * ・現在のディレクトリより下の全てのファイル - ・現ドライブ内の全てのファイル <> 以下に例を示します. // 現在のディレクトリ内のファイルすべてを読み書きできる java.io.FilePermission "*", "read,write"; // C:\FOO.TXT を読むだけはできる. java.io.FilePermission "C:\\FOO.TXT", "read"; // C:\TMP\以下は全て読み書きできる. java.io.FilePermission "C:\\TMP\\-", "read,write"; 【ネットワーク接続に関するパーミッション】 ・パーミッションを表すクラス名 java.net.SocketPermission ・ターゲット名 ホスト名 (ポート番号も指定できるが本演習では扱わない) ・アクション accept, connect, listen, resolve ターゲット名について: ホスト名,IPアドレスは*を使ってドメイン指定等ができます.また,""と"*"は以下のような特別な意味があります. ・"" ローカルホスト(クライアントPC自体)を指します. ・"*" 全てのマシンを指します,要は無制限です. アクションの意味 ・connect 外部に接続要求を行う処理 (主にクライアント) ・listen 外部からの接続要求を待つ処理 (主にサーバー) ・accept 外部からの接続要求を受諾する処理 (主にサーバー) ・resolve ホスト名からIPアドレスを検索する処理 詳細は以下等,参照してください http://www.ueda.info.waseda.ac.jp/~toyama/network/example1.html 実際的には, ・他に接続する処理(クライアント) "resolve,connect" ・接続を待つ処理(サーバー) "resolve,listen,accept" といった組み合わせが一般的でしょう. 例 // 全てのマシンからのアクセスを許可するサーバープログラムのためのもの java.net.SocketPermission "*", "resolve,listen,accept" // 信州大学情報にあるサーバーのみに接続できるクライアントプログラムのもの java.net.SocketPermission "*.cs.shinshu-u.ac.jp", "resolve,connect" 【プロパティに関するパーミッション】 プロパティとはプログラム実行中にプログラムからアクセスできる一種のグローバル変数のようなものです. 主にインストールされているjava自身の情報,OSの情報,利用している言語(英語,日本語・・・)等の情報が プロパティとしてアクセスできます.プロパティはものによって読み出しだけでなく書き込み(更新)もできます. 以下プロパティの名前の例 user.language 使っている言語(ja等) user.name ユーザーの名前 user.dir プログラム実行時のカレントディレクトリ os.name OSの名前 (Linux, Windows XP) java.version javaの内部バージョン (1.5.0_01等) ・パーミッションを表すクラス名 java.util.PropertyPermission ・ターゲット名 プロパティの名前 ・アクション read, write 例 // すべてのプロパティを読める java.util.PropertyPermission "*", "read"; // user.* にマッチするプロパティのみ読める java.util.PropertyPermission "user.*", "read"; // "user.language"というプロパティの変更を許可する. java.util.PropertyPermission "user.language", "write"; 【全許可と全不許可】 // とにかく全部不許可 non.txt grant { }; // どこからロードしたコードにも全ての権限を与える all.txt grant { permission java.security.AllPermission "", ""; }; 【本演習に特化した話】 以下の二つのパーミッションは必ず封入してください. // カレントディレクトリからロードしたコードには全権限を与える grant codeBase "file:."{ permission java.security.AllPermission "", ""; }; // コードのロード元を表示するため該当する情報へのアクセスを許可する grant { permission java.lang.RuntimePermission "getProtectionDomain"; }; 【その他注意事項】 本演習ではデジタル著名に基づくパーミッション許可の方式は扱いません. $Id: permissions.txt,v 1.3 2005-12-14 09:39:23+09 kaiya Exp kaiya $