在SecurityManager中启用SIGTERM

时间:2012-01-29 04:00:07

标签: java security

由于SIGTERM,我的自定义安全管理器目前阻止优雅关闭。将显示以下消息:

  

Java HotSpot(TM)64位服务器VM警告:异常java.lang.SecurityException发生调度信号SIGTERM到处理程序 - VM可能需要被强制终止

我应该怎么做才能启用因SIGTERMS而导致关闭但仅此而已?

1 个答案:

答案 0 :(得分:1)

如果省略调用-Djava.security.debug=all,您的实施可能已禁用super.checkAccess的完整调试信息。如果您先在SecurityManager实施中写下

  public void checkAccess(ThreadGroup g) {
      System.out.println("Access for " + g);
      super.checkAccess(g);
  }
  public void checkAccess(Thread t) {
      System.out.println("Access for " + t);
      super.checkAccess(t);
  }

并使用-Djava.security.debug=all运行,您可以获得有关checkAccess调用的信息以及允许添加到您的策略文件的权限。我总结一下:

Access for java.lang.ThreadGroup[name=system,maxpri=10]
Permission (java.lang.RuntimePermission modifyThreadGroup)
[...]
Access for Thread[SIGTERM handler,9,system]
Permission (java.lang.RuntimePermission modifyThread)
[...]
 java.security.Permissions@133c5982 (
 (java.lang.RuntimePermission exitVM)
 (java.io.FilePermission /path/to/current/working/directory/- read)
)

因此,您可以使用SIGTERM中的以下代码以更严格的方式启用SecurityManager信号处理:

  public void checkAccess(ThreadGroup g) {
      System.out.println("Access for " + g);
      if ("system".equals(g.getName()))  {
         // will checkPermission java.lang.RuntimePermission "modifyThreadGroup"
         super.checkAccess(g);
      } else {
         throw new SecurityException("Access denied to " + g);
      }
  }

  public void checkAccess(Thread t) {
      System.out.println("Access for " + t);
      if ("SIGTERM handler".equals(t.getName())) {
         // will checkPermission java.lang.RuntimePermission "modifyThread"
         super.checkAccess(t);
      } else {
         throw new SecurityException("Access denied to " + t);
      }
  }

此外,您还可以在java.security.policy文件中授予这些权限:

grant {
  permission java.lang.RuntimePermission "modifyThreadGroup";
  permission java.lang.RuntimePermission "modifyThread";
  permission java.lang.RuntimePermission "exitVM";
};

完整的信息可用here,但要做到这一点并不明显,尝试修复方法仍然是最快的方法。