java - 在 SecurityManager 中启用 SIGTERM

标签 java security

由于 SIGTERM,我的自定义安全管理器当前阻止正常关闭。显示以下消息:

Java HotSpot(TM) 64-Bit Server VM warning: Exception java.lang.SecurityException occurred dispatching signal SIGTERM to handler- the VM may need to be forcibly terminated

我应该怎么做才能因 SIGTERMS 而关闭,仅此而已?

最佳答案

如果您忽略调用 super.checkAccess,您的实现可能已禁用来自 -Djava.security.debug=all 的完整调试信息。如果您首先在您的 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)
)

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

  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但要做到这一点并不明显,尝试修复方法仍然是最快的方法。

关于java - 在 SecurityManager 中启用 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9050805/

相关文章:

用于数据库抽象、安全登录的 PHP 框架或库

security - 为什么默认情况下 Bluehost 中有一个从 www/to public_html/的符号链接(symbolic link)?

java - 如何显示下载进度?

java - 为方法参数分配新值是否有问题?

java - 评估时类型转换和事后类型转换的区别

sql-server - 为什么非对称 key 更安全?

java - 如果类不是最终类、允许克隆等,如何利用 Java 易受攻击的代码

security - 如何在 POST 方法中传递 header ?

java.security.InvalidKeyException : Wrong key size during decryption

java - 如何在 ListView 中使用新的自定义 View ?