22

問題:
Javaアプリケーション(アプレットではない)で、特定のファイル操作を、制限されるべきではないクラスのリスト/グループ/パッケージを除くすべてのクラスに制限したいと思います。

具体的には、制限したいのですが…

  • ファイル読み取り
  • ファイル書き込み
  • ファイルの作成
  • ファイルの削除

...制限のないクラスを除くすべてのクラスについて、現在の作業ディレクトリ内でのみ実行できるようにします。

SecurityManagerの試み:
この動作を実装するSecurityManagerクラスのサブクラスを実装しようとしましたが、チェックが行われると、提供されるファイル情報はファイル名だけではないようです(何かが不足している場合を除く)。

また、この場合、呼び出しが行われているクラスを見つけて、操作を許可するか例外をスローするかを判断する方法がよくわかりません。このアプローチが機能するために必要なすべての情報を取得する方法はありますか?

ポリシーベースの試み:
Javaポリシーは、ファイル操作などのクラスのアクションを制限することを目的としていることも認識しています。ただし、 .policyファイルを使用して問題を解決する方法を学ぶための優れたリソースを見つけるのに本当に苦労しました。

質問の要約:

1)私が言及したものよりも好ましいかもしれない代替アプローチはありますか?

2)これはSecurityManagerを使用して可能ですか?私は実際にそのようなアプローチをどのように実装すべきかを見逃していますか?

3)これはポリシーファイルを使用して可能ですか?この面で私が見逃した良いリソースはありますか?

私はこれを達成するために投資する必要のあるハードワークの量に実際に不利になることはありません-私はそれに適切にアプローチする方法がわからないだけです。また、私が言及した2つの可能なアプローチについて十分に教えてくれ、自分でそれを実装できるようにするための優れたリソースが非常に不足しています。とりわけ、私は必要に応じて重要な読書を恐れていません!

事前にご協力いただきありがとうございます。

4

1 に答える 1

16

ポリシーファイルを使用してこれを行う方法は次のとおりです。

特権で動作できるJavaファイルを作成します。

package egPriv;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.security.AccessController;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;

public class PrivCat {
    /** Cat a file with no privileges */
    public void cat(String file) throws IOException {
        cat(new FileReader(file));
    }

    private void cat(Reader r) throws IOException {
        int c;
        while( (c = r.read()) != -1 ) {
            System.out.print((char) c);
        }
        r.close();
    }

    /** Cat a file WITH privileges */
    public void catPriv(final String file) throws IOException {
        Reader r;
        try {
            r = AccessController.doPrivileged(new PrivilegedExceptionAction<Reader>() {
                public Reader run() throws IOException {
                    return new FileReader(file);
                }
            });
        } catch (PrivilegedActionException e) {
            throw (IOException) e.getCause();
        }
        cat(r);
    }
}

デモンストレーション用の通常のファイルを作成します

package eg;

import egPriv.PrivCat;

import java.io.IOException;

public class Cat extends PrivCat {
    public static void main(String[] args) throws IOException {
        Cat eg2 = new Cat();
        System.out.println("Processing with privilege:");
        eg2.catPriv(args[0]);

        System.out.println("Processing normally");
        eg2.cat(args[0]);
    }
}

sample.policyファイルを作成します。

/* anyone can read write and execute within current working dir */
grant {
  permission java.io.FilePermission "${user.dir}", "read,write,execute";
};

grant {
  permission java.io.FilePermission "${user.dir}/*", "read,write,execute,delete";
};


/* Only code from this jar can work outside of CWD */
grant codebase "file:egPriv.jar" {
  permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
};

コンパイルしてからテストします。

jar cvf egPriv.jar egPriv
jar cvf eg.jar eg


echo 'Restricted' > ..\file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy  eg.Cat ..\file.txt

echo 'Open' > file.txt
java -cp eg.jar;egPriv.jar -Djava.security.manager -Djava.security.policy=sample.policy  eg.Cat file.txt
于 2011-04-03T01:26:49.783 に答える