在@Leigh和@Miguel-F提供的有用建议下,我尝试实现了Security Manager
和Policy
。以下是结果:
1. 在运行时指定一个附加策略文件,而不是更改默认的java.policy
文件。为此,我们需要使用CFAdmin界面添加以下参数到JVM参数中,或者将其追加到jvm.config
文件中的jvm.args
行中:
-Djava.security.manager -Djava.security.policy="c:/policies/myRuntime.policy"
jre\bin\
内置了一个名为policytool.exe
的很棒的GUI实用程序,可以轻松高效地管理策略条目。
2. 我们已经强制执行了安全管理器,并提供了自定义安全策略文件,其中包含:
grant codeBase "file:///D:/proj/secTestProj/main/-"{
permission java.io.FilePermission
"<<ALL FILES>>", "read, write, delete";
};
在这里,我们将所有文件的
FilePermission
设置为
read,write,delete
,从列表中排除
execute
,因为我们不希望使用java运行时执行任何类型的文件。
注意:如果我们想要策略适用于所有应用程序而不考虑源,则可以将代码库设置为空字符串。
我真的希望在策略文件中有一个
deny
规则,类似于我们正在使用的
grant
规则,但很遗憾没有。如果您需要制定一组复杂的安全策略,可以使用
Prograde库,该库实现了具有拒绝规则的策略文件(
stack ref.)。
您可以将
<<ALL FILES>>
替换为单个文件,并相应地设置权限,或者为更好的控制使用
<<ALL FILES>>
和单个文件权限的组合。
参考文献:
默认策略实施和策略文件语法,
JDK中的权限和
控制应用程序
这种方法解决了我们的核心问题:通过指定文件上允许的权限来拒绝使用java运行时执行文件。在另一种方法中,我们可以直接在应用程序中实现
Security Manager
来定义策略文件,而不是在JVM args中定义它。
System.setProperty("java.security.policy", "file:/C:/java.policy");
SecurityManager sm = new SecurityManager();
System.setSecurityManager(sm);
为了能够设置它,我们需要在策略文件中拥有这些权限:
permission java.lang.RuntimePermission "setSecurityManager";
permission java.lang.RuntimePermission "createSecurityManager";
permission java.lang.RuntimePermission "usePolicy";
在应用程序中使用安全管理器(Security Manager)对象具有其自身的优点,因为它公开了许多有用的方法。例如:CheckExec(String cmd)
可检查调用线程是否允许创建子进程。
//perform the check
try{
sm.checkExec("notepad.exe");
}
catch(SecurityException e){
//do something...show warning.
}
CreateObject(Java)
函数,还是这样会太过限制?关于设置下的管理员设置禁用访问内部ColdFusion Java组件
呢?你有检查过吗? - Miguel-FCreateObject(Java)
是我在事后的第一个想法,但是还有CfObject
可以实现相同的功能。而完全限制这两个功能确实太过严格,因为它们在整个应用程序中都被使用。如果有一种方法只禁用这两种情况中的type=java
,那么问题就会得到解决。我有一种感觉,可能有一些JVM参数
可以允许这种限制。 - Anurag-Djava.security.manager "-Djava.security.policy=cf_root/WEB-INF/cfusion/lib/coldfusion.policy" "-Djava.security.auth.policy=cf_root/WEB-INF/cfusion/lib/neo_jaas.policy"
- Miguel-F