6

我有一些依赖于系统属性的 Java 代码super.secret.password。当我运行我的应用程序时,我需要设置该属性。该应用程序将由 shell 脚本启动,密码将保存在具有最小读取权限的文件中。

我真的不想写:

java -Dsuper.secret.password=letmein gov.fortknox.MyApp

因为这样任何人都可以进入机器并运行pstop可以看到密码是什么。

那么,有没有一种很好的方法来设置系统属性而不在命令行上暴露它们呢?

我们提出的唯一通用解决方案是编写一个小型 C 程序,该程序从文件中读取系统属性,然后使用JNI 调用 API启动 JVM 。不用说,我们并不热衷于这样做。

如果不使用命令行就无法设置它们,有没有办法隐藏命令行不被窥探?我们使用的是 Red Hat Enterprise Linux Server 5.5。

值得一提的是,有问题的应用程序实际上是 JBoss EAP 4.3.0,我们使用系统属性${like.this}在其 XML 配置文件中填充替换构造 ( )。有特定于 JBoss 的解决方案 - 使用SystemPropertiesService(默认情况下,通过部署目录中的 properties-service.xml 文件配置)或将-P 选项传递给 run.sh。但是,我对更一般的情况感兴趣,这可能是任何 Java 程序。

4

6 回答 6

3

super.secret.password如果您担心以明文形式公开值,但您不担心有人使用正确的密码值调用您的程序,因为您已经使用权限或其他方式解决了该问题,那么我认为您可以简单地加密启动脚本中的密码并让包装类解密它。

java -Dsuper.secret.password=BbWvOuliHZVHVwsXudsj14d1iXzo655R gov.fortknox.DecryptWrapper

如果凭据用于数据源,我还应该指出JBoss特有的其他解决方案:SecureIdentityLoginModule它基本上完成了上述操作,并且PBEUtils在与SecureIdentityLoginModule. 请参阅EncryptingDataSourcePasswords

最后,Peter Lawery提出的使用文件的建议也是有效的。

于 2011-04-19T10:54:05.390 回答
3

您可以在启动附近的某处读取文件并调用System.setProperty(). 对于 Web 应用程序,请使用 aServletContextListener所以它会提前发生,请参阅此答案以获取快速示例。

更新:对于 JBoss 加载其配置文件的用例来说,这可能还不够早。

于 2011-04-19T10:25:50.643 回答
1

您可以从包含 main 方法的类的静态初始化程序中的某个文件中读取它:

    static {
        try {
          FileReader fr = new FileReader(FILE_NAME);
          // read the property
          System.setProperty(property.getName(), property.getValue());
        } catch (final FileNotFoundException ex) {
          logger.log(Level.SEVERE, ex.getMessage(), ex);
        } catch (final IOException ex) {
          logger.log(Level.SEVERE, ex.getMessage(), ex);
        }
    } 
    ...
    public static void main(...){
    ...
    }
于 2015-01-26T12:24:34.683 回答
1

'cryptomainia' 是为了解决这个确切的问题而编写的。它解密 main() 参数。https://github.com/birchb1024/cryptomainia

于 2014-02-25T05:37:40.540 回答
0

如果攻击者可以物理访问您的机器,那么他们没有真正的理由不能拥有这台机器 - 一个简单的 rot13 来避免不经意的眼睛就足够了。

如果攻击者有一些特权(比如运行top),但没有物理访问权,那么你可以在一个专门的用户账户(比如web-server-user)下执行程序,这个用户的特权很少,但是有独占性。对包含密码的文件的读取权限。然后,您使用该用户帐户启动应用程序,并传入文件路径。

这样做依赖于操作系统中的访问权限限制,这可能比您自己滚动的要好得多。

于 2011-04-19T11:29:48.040 回答
0

您可以使用 JAVA_TOOL_OPTIONS 环境变量并在那里设置属性。但它仍然在您的脚本文件中可见。

于 2011-04-19T10:22:35.597 回答