有没有办法在Windows Server 2008上运行Java VM(java.exe
)并使用命令行参数或系统变量禁用所有网络连接?
答案 0 :(得分:9)
您可以通过启用默认Java安全管理器来执行此操作。默认情况下,不会强制执行任何安全性,因此您可以执行任何操作,但如果启用了安全管理器,则会限制网络访问,文件访问和许多其他操作,除非您在安全策略文件中另行指定。
要启用默认安全管理器,请在启动时将此参数传递给JVM。
java -Djava.security.manager=default my.main.Class
通过执行此操作,来自JVM内部的任何网络访问尝试都将抛出java.net.NetPermission
。
这也会破坏文件访问等内容,因此如果您需要允许它,您需要在特殊的安全策略文件(-Djava.security.policy=path/to/policy.file
)中指定它们。应该有很多关于如何设置它的例子,只需搜索“java权限”就可以让你开始。
答案 1 :(得分:2)
好吧,我没有尝试过,但理论上你可以将SOCKS代理的系统属性设置为不存在的,并且根据文档,将通过SOCKS代理尝试所有TCP套接字 - 并且失败。
这样的事情:
java -DsocksProxyHost=127.0.0.1 SomeClass
答案 2 :(得分:2)
我有同样的任务来测试我们产品的离线安装程序。上面说的几乎都是正确的,但是第一次创建.policy文件并不容易。这是我做的:
无法解析主机名的Crated通用策略文件(请参阅下面的代码段);
在jvm参数中添加了-Djava.security.manager -Djava.security.policy=pathto/policy.file
;
通用.policy文件内容:
grant {
permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute,delete";
permission java.util.PropertyPermission "*", "read,write";
permission java.lang.RuntimePermission "*";
permission java.net.NetPermission "*";
permission java.lang.reflect.ReflectPermission "*";
};
如果某些内容试图在测试期间将内容传递到外部,则会因安全性异常而失败。