【问题标题】:Java Heap dump permissionsJava 堆转储权限
【发布时间】:2012-09-25 21:05:35
【问题描述】:

在 Linux 机器(也很可能是 Unix 机器)中生成的 Java 堆转储具有受限访问权限。堆只能由进程的所有者读取(ACL 掩码设置为 600)。我了解这是出于安全原因。但是,我找不到任何引用或解释该行为的文档。谁能指出我的文档(如果有的话)?另外,有没有办法覆盖这种行为?

【问题讨论】:

  • 不是一个完整的答案,但线程转储可能包含真正机密信息,包括您的数据库密码。所以你最好保护他们的安全。

标签: jvm heap-memory file-permissions heap-dump jmap


【解决方案1】:

如果您对深入的 JVM 内部结构感兴趣,可以查看 OpenJDK 的源代码。

这里是 HeapDumper 服务的链接:http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/services/heapDumper.cpp

如果您深入研究,您会看到 JVM 正在使用 S_IREAD | S_IWRITE 创建二进制文件

 4373 // create binary file, rewriting existing file if required
 4374 int os::create_binary_file(const char* path, bool rewrite_existing) {
 4375   int oflags = O_WRONLY | O_CREAT;
 4376   if (!rewrite_existing) {
 4377     oflags |= O_EXCL;
 4378   }
 4379   return ::open64(path, oflags, S_IREAD | S_IWRITE);
 4380 }

【讨论】:

    【解决方案2】:

    堆转储由作为特定用户运行的 JVM 进程编写。就像由 any Linux 进程创建的 any 文件一样,它将归该用户所有。

    如果您想要实际文档,here it is。查看O_CREAT下的描述。

    【讨论】:

    • 我不相信这就像由同一用户创建任何其他文件一样。在我的环境中,我将用户的 umask 设置为 022。当我使用触摸创建文件时,文件权限为 644(rw-r-r-)。事实上,即使是 java 进程生成的日志文件也具有 umask 规定的权限。但是,堆转储总是在 600 (rw----)。我相信 JVM 出于安全考虑(bcos 堆可以包含敏感数据)或使用导致这种情况的系统调用而明确设置 permssns。我正在寻找解释它的文档以及覆盖它的任何方法(h-dump 后的 chmod 不是 optn)
    • @AbhilashKoneri,来不及问,但您是否设法覆盖此行为??
    猜你喜欢
    • 2011-06-07
    • 2011-10-09
    • 2013-05-01
    • 2012-06-22
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多