【问题标题】:Limiting file access in Java在 Java 中限制文件访问
【发布时间】:2011-07-28 09:57:29
【问题描述】:

问题:
在我的 Java 应用程序(不是小程序)中,我希望将某些文件操作限制为所有类,但不应限制的类的列表/组/包除外。

具体来说,我想限制...

  • 文件读取
  • 文件写入
  • 文件创建
  • 文件删除

...这样它们只能在当前工作目录中完成,但不受限制的类除外。

SecurityManager 尝试:
我试图实现实现此行为的 SecurityManager 类的子类,但是似乎在进行检查时提供的 file 信息不仅仅提供文件名(除非我遗漏了什么? )。

另外,我不太明白在这种情况下我如何找出调用的类,以允许我确定是允许操作还是抛出异常。有什么方法可以让我获得让这种方法发挥作用所需的所有信息?

基于策略的尝试:
我还知道 Java 策略旨在限制类的操作,包括文件操作等。但是,我真的很难找到一个好的资源来学习如何使用 .policy 文件解决我的问题。

问题总结:

1)是否有任何替代方法可能比我提到的方法更可取?

2) 这可以使用 SecurityManager 吗?我是否错过了我应该如何实际实施这种方法?

3) 这可以使用策略文件吗?在这方面我错过了什么好的资源吗?

我真的不反对为了实现这一目标而需要投入的任何努力——我只是不确定我应该如何正确地处理它。我也非常缺乏好的资源来教我足够的关于我提到的两种可能的方法,让我自己实现它。最重要的是,我不怕需要大量阅读!

感谢提前提供任何帮助。

【问题讨论】:

    标签: java io policy securitymanager


    【解决方案1】:

    以下是使用策略文件的方法。

    创建一个可以使用权限操作的 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
    

    【讨论】:

    • 如果您将-Djava.security.debug=All 添加到命令行,输出对于找出您的策略文件不工作的原因非常有帮助
    • 首先,非常感谢,我现在正在测试这个实现。其次,另一个快速的问题 - 这可以与实现我拥有的其他一些保护需求的 SecurityManager 共存吗?
    • 首先咨询 SecurityManager 并且仅当安全经理这样做时才进行策略。默认的 SecurityManager 委托给所有策略中的权限。如果您将 SecurityManager 子类化以对某种检查执行其他操作,则权限将无法授予该检查所需的权限。
    • 例如,如果您想通过设置 ${user.dir} 系统属性来防止代码更改当前工作目录并因此绕过特权,您可以覆盖 SecurityManager.checkPropertyAccess 方法以始终抛出SecurityException,那么再多的权限和属性都不允许代码设置属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2012-02-05
    相关资源
    最近更新 更多