Java策略文件 - 拒绝对代码库的权限

sec*_*ger 4 java securitymanager policyfiles

在Java策略文件中,grant codeBase语法指定应授予哪些代码库哪些权限.例如,

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

授予AllPermissionabc.jar中的代码

以类似的方式,有没有办法deny获得特定语法的权限?像这样:

deny codeBase"file:/ C:/def.jar"{permission java.io.FilePermission; };

以便内部代码def.jar获取除FilePermission之外的所有其他权限?

这甚至可能吗?

我知道这可以使用SecurityManager类轻松完成,但我只是想通过仅使用策略文件来了解是否可行.

小智 15

我意识到这已经快一年了,但我想我正在尝试做类似的事情.

有一种方法可以设置运行时权限,以便Java不会授予全局权限.然后,您只能指定要为您的应用授予的权限.关键是使用以下选项运行您的应用程序.

java -Djava.security.manager -Djava.security.policy==policyFile.txt MyClass
Run Code Online (Sandbox Code Playgroud)

注意双等于-Djava.security.policy==policyFile.txt.double等于==意味着使用命名文件中的权限而不是单个等号-Djava.security.policy=policyFile.txt,这意味着除了继承的全局权限之外还使用这些权限.

然后创建一个策略文件,不包括您要拒绝的权限:

// policyFile.txt
grant codeBase "file:/C:/abc.jar" {

    // list of permissions minus the ones you want to deny
    // for example, the following would give the application
    // ONLY AudioPermission and AWTPermission.  Other
    // permissions such as java.io.FilePermission would be
    // denied.

    permission javax.sound.sampled.AudioPermission;
    permission java.awt.AWTPermission;

}
Run Code Online (Sandbox Code Playgroud)

  • 而且我意识到这是另一个2年后......"拒绝"的关键在于,无法知道服务器,应用程序上未知的托管应用程序的"允许"的完整列表.比如说,您想要禁止写入"java.*"系统属性,但应用程序可以使用所有其他属性.出于这个原因,'拒绝代码库'会很好.这就是我打算做的...... (2认同)

kwa*_*art 5

您可以使用Prograde库,该库通过拒绝规则来实现策略文件。

将以下Maven依赖项添加到您的应用中

<dependency>
    <groupId>net.sourceforge.pro-grade</groupId>
    <artifactId>pro-grade</artifactId>
    <version>1.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后使用标准系统属性为您的应用程序启用它:

-Djava.security.manager=net.sourceforge.prograde.sm.ProgradeSecurityManager -Djava.security.policy==/path/to/your/application.policy
Run Code Online (Sandbox Code Playgroud)

或者您也可以在代码中以编程方式替换Policy实现:

System.setProperty("java.security.policy","/path/to/your/application.policy");
Policy.setPolicy(new ProgradePolicyFile());
Run Code Online (Sandbox Code Playgroud)

策略文件的语法与标准实现类似,但是可以使用deny代替,grant也可以通过使用关键字更改优先级priority(默认值为"deny" -以保持向后兼容)。

例如,您可以做某事。喜欢:

grant {
    permission java.lang.RuntimePermission "*";
};

deny {
    permission java.lang.RuntimePermission "exitVM.*";
};
Run Code Online (Sandbox Code Playgroud)

其他示例在这里


Tom*_*ine 1

不。策略文件没有类似的实现。如果你真的绝望的话,你可以编写自己的系统。