java SecurityManager 与 NO 安全管理器相同,除了 System.exit 的单个检查调整
A java SecurityManager that is identical to NO security manager except for a single check adjustment for System.exit
我不熟悉 java 安全管理器,因此想确认我的理解:
我有一个 java 进程随机停止(关闭挂钩 运行s),即使没有任何人杀死它的痕迹。因此,我决定安装一个安全管理器并覆盖 checkExit(int status)
以确保停止的原因不是调用 System.exit()
。基本上我是这样写的:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
Thread.dumpStack();
super.checkExit(status);
}
});
我原以为我的程序会像往常一样 运行,唯一的变化是如果调用 System.exit() 会转储堆栈跟踪。我发现事实并非如此。启动失败并出现此安全异常:
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "config" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[na:1.8.0_74]
at java.security.AccessController.checkPermission(AccessController.java:884) ~[na:1.8.0_74]
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) ~[na:1.8.0_74]
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294) ~[na:1.8.0_74]
at java.lang.System.getProperty(System.java:717) ~[na:1.8.0_74]
at Main.main(Main.java:161) ~[na:na]
似乎 SecurityManager 没有复制默认行为,在阅读后似乎它应用了 ${JAVA_HOME}/jre/lib/security/java.policy
下的默认策略,这是非常严格的。
当没有安全管理器时,Java 的真正默认行为是什么?是 'allow everything' 还是有其他事情发生?
如果我想复制默认行为,除了上面的那个单一调整之外,我应该安装什么作为安全管理器?
关于最后一点,我可以看到 System.setSecurityManager()
实际上需要一个 java.lang.SecurityManager
的实例,这意味着我被迫使用该实现(依赖于策略文件)。 class 重写方法以复制 NO 安全管理器的实际默认行为的最有效方法是什么?
编辑:根据下面的讨论,这似乎可以做到
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
return; // no security manager behaviour
}
@Override
public void checkPermission(Permission perm, Object context) {
return; // no security manager behaviour
}
@Override
public void checkExit(int status) {
Thread.dumpStack();
super.checkExit(status);
}
});
你糊涂了。
It appears that the SecurityManager does NOT replicate the default behavior and after reading about it would seem that it applies the default policy under ${JAVA_HOME}/jre/lib/security/java.policy which is quite restrictive.
SecurityManager
的默认行为是遵守 Javadoc 中规定的契约, 除了 默认 .policy
文件允许的,这是确实很严格。 不存在 安全管理器的默认行为是允许任何事情。
What is the real default behavior of Java when there is NO security manager? Is it to 'allow everything'
是的。
or is there something else happening?
没有
What should I install as a security manager if I wanted to replicate the default behavior, apart from that single adjustment above?
安全管理器正是这样做的。如果你想让它除了你已经实现的一个覆盖之外什么都不强制执行,你必须为它的所有其他方法提供空覆盖。
我不熟悉 java 安全管理器,因此想确认我的理解:
我有一个 java 进程随机停止(关闭挂钩 运行s),即使没有任何人杀死它的痕迹。因此,我决定安装一个安全管理器并覆盖 checkExit(int status)
以确保停止的原因不是调用 System.exit()
。基本上我是这样写的:
System.setSecurityManager(new SecurityManager() {
@Override
public void checkExit(int status) {
Thread.dumpStack();
super.checkExit(status);
}
});
我原以为我的程序会像往常一样 运行,唯一的变化是如果调用 System.exit() 会转储堆栈跟踪。我发现事实并非如此。启动失败并出现此安全异常:
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "config" "read")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472) ~[na:1.8.0_74]
at java.security.AccessController.checkPermission(AccessController.java:884) ~[na:1.8.0_74]
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) ~[na:1.8.0_74]
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1294) ~[na:1.8.0_74]
at java.lang.System.getProperty(System.java:717) ~[na:1.8.0_74]
at Main.main(Main.java:161) ~[na:na]
似乎 SecurityManager 没有复制默认行为,在阅读后似乎它应用了 ${JAVA_HOME}/jre/lib/security/java.policy
下的默认策略,这是非常严格的。
当没有安全管理器时,Java 的真正默认行为是什么?是 'allow everything' 还是有其他事情发生?
如果我想复制默认行为,除了上面的那个单一调整之外,我应该安装什么作为安全管理器?
关于最后一点,我可以看到 System.setSecurityManager()
实际上需要一个 java.lang.SecurityManager
的实例,这意味着我被迫使用该实现(依赖于策略文件)。 class 重写方法以复制 NO 安全管理器的实际默认行为的最有效方法是什么?
编辑:根据下面的讨论,这似乎可以做到
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission perm) {
return; // no security manager behaviour
}
@Override
public void checkPermission(Permission perm, Object context) {
return; // no security manager behaviour
}
@Override
public void checkExit(int status) {
Thread.dumpStack();
super.checkExit(status);
}
});
你糊涂了。
It appears that the SecurityManager does NOT replicate the default behavior and after reading about it would seem that it applies the default policy under ${JAVA_HOME}/jre/lib/security/java.policy which is quite restrictive.
SecurityManager
的默认行为是遵守 Javadoc 中规定的契约, 除了 默认 .policy
文件允许的,这是确实很严格。 不存在 安全管理器的默认行为是允许任何事情。
What is the real default behavior of Java when there is NO security manager? Is it to 'allow everything'
是的。
or is there something else happening?
没有
What should I install as a security manager if I wanted to replicate the default behavior, apart from that single adjustment above?
安全管理器正是这样做的。如果你想让它除了你已经实现的一个覆盖之外什么都不强制执行,你必须为它的所有其他方法提供空覆盖。