@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Javaアプレット使用時のセキュリティに関して、お力をお貸しください。

投稿者投稿内容
BBQ
会議室デビュー日: 2006/02/08
投稿数: 7
投稿日時: 2006-02-08 14:48
今回使用するJavaアプレットはクライアントPC内のフォルダ・ファイルを読込みにいくのですが、
その段階で、java.security.AccessControlException が発生します。

これを回避するためには通常、ユーザーポリシーファイル(${user.home}/.java.policy)を編集し、
Javaアプレットに対して許可する権限と、そのアプレットのURLなどを指定します。
そこで、
http://msugai.fc2web.com/java/security/policy.html
などを参考に、試してみましたが、うまくいきません。


WEBアプリケーションの構成と、試してみたポリシーファイルの設定を簡単に説明します。

/webapp/
  ├ WEB-INF/
  │   ├ src/ ・・・Javaソースを配置
  │   ├ classes/ ・・・Javaクラスを配置
  │   └ jsp/ ・・・ JSPファイルを配置
  │
  └ applet/ ・・・ アプレットを配置(applet.jar)

上記の構成のJavaサーブレット・アプリケーションを
http://hogehoge.co.jp/
に配置し、
http://hogehoge.co.jp/webapp/
というURLでアクセスする状態です。

そこで、.java.policy には、

grant codeBase "http://hogehoge.co.jp/webapp/applet/-" {
permission java.security.AllPermission;
};

と記述してみましたが、やはりセキュリティエラーが発生します。
しかし、 codeBaseの指定を外し、

grant {
permission java.security.AllPermission;
};

としてみると、今度はエラーになりませんでした。

つまり、.java.policy自体は有効に働いているということです。

そこで、
grant codeBase "http://hogehoge.co.jp/webapp/-" {
permission java.security.AllPermission;
};

grant codeBase "http://hogehoge.co.jp/-" {
permission java.security.AllPermission;
};

など、少しずつ記述を変えて試しましたがどれもダメでした。

また、このアプレットをクライアントマシンの C:\直下に置いて、それを使用するようなHTMLを作成し、

grant codeBase "file:/C:/-" {
permission java.security.AllPermission;
};

grant codeBase "file://C:/-" {
permission java.security.AllPermission;
};

grant codeBase "file:///C:/-" {
permission java.security.AllPermission;
};

など、試しましたがどれもダメでした。

http://hogehoge.co.jp/webapp/ にあるアプレットにのみ一定の権限を認めるには
Javaポリシーファイルをどのように設定すればよろしいでしょうか?
加納正和
ぬし
会議室デビュー日: 2004/01/28
投稿数: 332
お住まい・勤務地: 首都圏
投稿日時: 2006-02-08 21:59
>http://hogehoge.co.jp/webapp/ にあるアプレットにのみ一定の権限を認めるには
>Javaポリシーファイルをどのように設定すればよろしいでしょうか?

#最近、どこまでを技術的理解の前提にすればいいか、よく分からない。
#java.policyの意味を理解しているのだろうか。
#最近は書いてあることをまんま鵜呑みにする奴が多くて「分かってる」のか「分かってない」
#のかが分からない。。

そもそも「Javaアプレット」について正確に理解していないようです。
なのでjava.policyなんぞ見ても無駄です。

それ以前に、おそらくHTMLファイルを良く分からずに適当に書いたかと思うので(推測)
「ちゃんと」記述しましょう。そっちのほうが重要です。

java.policyの「CodeBase」はその後です。

なぜなら、Java.policyの意味内容はあくまで「ある部分」を「許可する」
ですから。「ある部分」はjava.policyの前にすでに決まってるはずです。
CodeBaseではすでに決定してある(はず)の部分を記述します。

武澤
常連さん
会議室デビュー日: 2004/09/27
投稿数: 31
投稿日時: 2006-02-09 10:32
武澤です。

アプレット起動しているときに参照しているポリシーファイルが違うなんてことはないでしょうか?
アプレットのJavaコンソールを見て、動作しているJavaのバージョンを確認して見てはどうでしょう?

参考までにJ2SDK1.4.2_0Xでアプレットが参照するポリシーファイルは以下の順になりますよ。
<user.home>¥.java.policy ←先頭にドットが入りますので注意
C:¥Program Files¥Java¥j2re1.4.2_X¥lib¥security¥java.policy

BBQ
会議室デビュー日: 2006/02/08
投稿数: 7
投稿日時: 2006-02-09 10:33
返答ありがとうございます。
HTMLでは、

<APPLET CODEBASE="http://hogehoge.co.jp/webapp/applet/"
CODE="com.xxxx.yyyy.MyApplet"
archive="applet.jar"
width="0" height="0"
name="MyApplet">
</APPLET>

と記述して正しく読込めています。
これがまずいのでしたらご指摘ください。

そして、codeBase 〜 の部分を削除すれば、問題なく動作します。
本当は permission に関して、ファイル読み取り権限をどのディレクトリに対して
許可する、とかこまごまと設定することは分かっています。
が、今回お尋ねしたいのは、
「なぜ、codeBase 〜 を指定すると、エラーになるのか?」
だけなのです。
動作検証の際に記述的なミスを減らすために
『permission java.security.AllPermission; 』
ということにしてお尋ねしています。

ですから、
「こういう配置」で「HTMLにこう記述」すれば、「codeBaseの指定」は
こうなるはずで、○○○の部分がまずいから上手くいかないのでは?
というアドバイスがいただきたいのです。
確かにきちんと理解できていない部分が多々あり、
答える側の皆様もやりにくいとは思いますが、何卒宜しくお願いいたします。
BBQ
会議室デビュー日: 2006/02/08
投稿数: 7
投稿日時: 2006-02-09 10:40
書き込みのタイミングが入れ違いになってしまいました。

>アプレット起動しているときに参照しているポリシーファイルが違うなんてことはな>いでしょうか?
>アプレットのJavaコンソールを見て、動作しているJavaのバージョンを確認して見て>はどうでしょう?

>参考までにJ2SDK1.4.2_0Xでアプレットが参照するポリシーファイルは以下の順になり>ますよ。
><user.home>¥.java.policy ←先頭にドットが入りますので注意
>C:¥Program Files¥Java¥j2re1.4.2_X¥lib¥security¥java.policy

はい。
これはそれぞれのファイルを交互に編集して何度も確認しました。

その上で、現在は、<user.home>¥.java.policy の方を対象に、
codeBase指定の有り/無しで、上手く動いたりエラーになったりする、
その原因を探っている次第です。

武澤
常連さん
会議室デビュー日: 2004/09/27
投稿数: 31
投稿日時: 2006-02-09 10:45
私も<user.home>¥.java.policyを良く使っているのですが、

grant codeBase "http://hogehoge:80/webappname/hogehoge.jar" {
permission java.security.AllPermission;
};

というような書き方をしています。
または、jarを直接指定しない場合はアスタリスクで指定しています。
ハイフンは使ったことがないのでよく分かりません。
一度、直接jar指定、アスタリスク指定にしてみてはいかがでしょうか?
BBQ
会議室デビュー日: 2006/02/08
投稿数: 7
投稿日時: 2006-02-09 20:30
返答ありがとうございます。

jarの直接指定も試してみましたが、やはりダメでした。
状況を分かりやすくするために、以下のようにして検証してみました。

(1)ローカルマシンのフォルダをダイアログで開くアプレットを
 作成し、FolderSelectApplet.class として作成。
 また、アプレットの初期化処理の部分で
 System.out.println(getCodeBase());
 と記述。

(2)FolderSelectApplet.class を C:/ 直下に配置

(3)アプレットを起動するHTMLを作成し、その中に、
<APPLET CODEBASE="file:/C:/"
CODE="FolderSelectApplet.class"
width="0" height="0"
name="FolderSelectApplet">
<param name="scriptable" value="true">
<param name="mayscript" value="true">
</APPLET>
 と記述。

(4)HTMLをブラウザ(IE6.0 SP2)で開き、アプレットの起動を確認。
 ※getCodeBase() の出力結果は、「file:/C:/」 でした。

(5)まず、${user.home}/.java.policy に
 grant {
permission java.security.AllPermission;
};
 と記述して、アプレットを動かしてみました。
 問題なくローカルフォルダを開くことができました。
 (※実際には AllPermission ではなく、もっと細やかな権限設定が必要なのですが、
  まず、AllPermissionで上手くいかなければ、それより低位の権限はなおさら
  無理だと考えられるためです。)
       ↓
 ${user.home}/.java.policy への記述が有効であることを確認。

(6)次に、
 grant {
permission java.security.AllPermission;
};
 を
 grant codeBase "file:/C:/-" {
permission java.security.AllPermission;
};
 と書き換えテストしてみました。

(7)AccessControlExceptionが発生。
 コンソールへの出力は、
-----------------------------------------
java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at java.io.Win32FileSystem.getUserPath(Unknown Source)
at java.io.Win32FileSystem.resolve(Unknown Source)
at java.io.File.getAbsolutePath(Unknown Source)
at sun.awt.shell.Win32ShellFolder2.<init>(Unknown Source)
at sun.awt.shell.Win32ShellFolder2.listFiles(Unknown Source)
at sun.awt.shell.ShellFolder.listFiles(Unknown Source)
at sun.awt.shell.Win32ShellFolderManager2.get(Unknown Source)
at sun.awt.shell.ShellFolder.get(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI.updateUseShellFolder(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI.installComponents(Unknown Source)
at javax.swing.plaf.basic.BasicFileChooserUI.installUI(Unknown Source)
at javax.swing.plaf.metal.MetalFileChooserUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JFileChooser.updateUI(Unknown Source)
at javax.swing.JFileChooser.setup(Unknown Source)
at javax.swing.JFileChooser.<init>(Unknown Source)
at javax.swing.JFileChooser.<init>(Unknown Source)
at FolderSelectApplet.startSelectFolder(FolderSelectApplet.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.invoke.JSInvoke.invoke(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
at sun.plugin.com.MethodDispatcher.invoke(Unknown Source)
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
java.lang.Exception: java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source)
at sun.plugin.com.DispatchImpl$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.plugin.com.DispatchImpl.invoke(Unknown Source)
-----------------------------------------

(その他にも、
 grant codeBase "file:///C:/-" {
permission java.security.AllPermission;
};
 grant codeBase "file:/C:/*" {
permission java.security.AllPermission;
};
 grant codeBase "file:/C:/" {
permission java.security.AllPermission;
};
など、いろいろ記述を変えてみましたが、どれも同じ結果になりました。


◆結果、やはり、codeBase〜 の記述の有無で例外の有無が決定している状態です。
 しかし、アプレットの配置場所、HTMLのCODEBASE指定を見る限り、
 私にはどこがいけないのか分かりません。
 今、私の中にある疑問としては、

 @CLASS_PATHが何か関係ある?
 A.java.policyを編集するだけではだめで、アプレットのソースの方で
  SecurityManagerもしくはAccessControllerあたりを使用した記述で
  コントロールする必要がある?

 といったところですが、どうなんでしょうか?

つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 2006-02-09 22:22
例外のスタックトレースで
> at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
というのが見受けられましたが、
Javascriptからjavaのメソッドを読んでいるようなプログラム
ではないですか?

もしそうであれば、セキュリティの関係上ポリシーファイルのコード
ベースはききません。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5011139

はずしていたら、ごめんなさい。

スキルアップ/キャリアアップ(JOB@IT)