【问题标题】:How to safely handle sensitive environment variables?如何安全处理敏感的环境变量?
【发布时间】:2018-10-01 09:00:09
【问题描述】:

我开发了一个 Java 应用程序,该应用程序将 shell 脚本作为输入参数并执行它。我正在使用以下块来准备环境:

ProcessBuilder pb = new ProcessBuilder("/bin/bash", scriptFile);
Map<String, String> env = pb.environment();

env.putAll(environmentVariable);

Process awk = pb.inheritIO().start();
awk.waitFor();
awk.destroy();

在上面的代码块中,environmentVariable 是一个包含一些敏感数据的 Map,这些数据稍后会被脚本使用。

我对@9​​87654324@ 的理解是它只为那个子进程提供环境。您对该环境所做的更改仅会影响该子流程。我通过ProcessBuilder#environment()的Javadoc验证了它

现在我的问题是,在此操作结束时,即当 awk.destroy() 被调用时,环境会连同我放置的所有敏感变量一起被擦除,还是手动擦除环境变量映射更好env.remove(SENSITIVE_VARIABLE_KEY)env.putAll(new HashMap&lt;String, String&gt;)

【问题讨论】:

    标签: shell unix processbuilder


    【解决方案1】:

    process.destroy 不会清理ProcessBuilder 上的系统环境。您仍然可以使用相同的 PB 对象来启动新进程,并且使用相同的环境映射。

    我不明白您的要求,为什么要删除 env 条目。如果在您的awk 进程之后,您不再使用pb 对象,并且没有对它的引用,java 将垃圾收集它。我看不出从地图中删除敏感条目会给您带来什么。无论如何,您还有另一个 java 变量 environmentVariable 保存您的敏感数据。

    对于你的问题,如果你想删除一些数据,你可以使用map.remove(),如果你想清理地图,你可以使用pb.environment().clear()。但是如果你这样做了,当你用pb 启动一个新进程时,它将使用修改后的env-map。

    【讨论】:

    • 我担心的是,在我的 Java 应用程序退出后,是否可以读取我的应用程序以某种方式设置的环境变量(使用任何可能的方式)。我的意思是在机器级别设置变量,以便任何有权访问机器的人都可以使用printenv {VARIABLE} 或在子进程级别进行查询?
    • @SivaprasannaSethuraman 您在问题中提到,javadoc 说您所做的更改只会影响子流程。它不会是系统级别的。您可以在更改一个 PB 的 env map 后创建另一个 ProcessBuilder 进行测试。
    猜你喜欢
    • 2014-08-26
    • 2021-02-26
    • 2020-06-02
    • 1970-01-01
    • 2018-09-24
    • 2016-03-29
    • 2014-07-10
    • 1970-01-01
    • 2014-09-29
    相关资源
    最近更新 更多