我想创建一个安全的ColdFusion环境,我正在使用多个沙盒配置。使用友好的管理员界面可以轻松实现以下任务:
其他人相应地使用了Web服务器的配置。
所以我对设置感到满意,以后才会遇到不管应用于cfexecute
标记的限制,可以使用java.lang.Runtime
轻松执行系统文件或脚本;
String[] cmd = {"cmd.exe", 'net stop "ColdFusion 10 Application Server"'};
Process p = Runtime.getRuntime().exec(cmd);
或使用java.lang.ProcessBuilder
:
ProcessBuilder pb = new ProcessBuilder("cmd.exe", 'net stop "ColdFusion 10 Application Server"');
....
Process myProcess = pb.start();
问题是我找不到任何允许我禁用这两个类的解决方案:java.lang.Runtime
& java.lang.ProcessBuilder
的{{1}}。
对于注释:我已经在sanbox和os权限中尝试过文件限制,但不幸的是它们似乎只在I / O文件操作上工作,我不能搞乱系统库的安全策略,因为它们可能在内部使用通过ColdFusion。
答案 0 :(得分:6)
根据@ Leigh和@ Miguel-F提供的有用建议,我尝试了实施Security Manager
和Policy
。结果如下:
1。在运行时指定其他策略文件,而不是更改默认的java.policy
文件。为了实现这一点,我们使用CFAdmin接口将以下参数添加到JVM参数,或者将其附加到jvm.args
文件中的jvm.config
行:
-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>>
和单个文件权限的组合。
参考文献:Default Policy Implementation and Policy File Syntax,Permissions in JDK和Controlling Applications
这种方法解决了我们的核心问题:通过指定文件允许的权限来拒绝使用java运行时执行文件。在其他方法中,我们可以直接在我们的应用程序中实现Security Manager
来定义策略文件,而不是在我们的JVM args中定义它。
//set the policy file as the system securuty policy
System.setProperty("java.security.policy", "file:/C:/java.policy");
// create a security manager
SecurityManager sm = new SecurityManager();
//alternatively, get the current securiy manager using System.getSecuriyManager()
//set the system security manager
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.
}