如何安全处理敏感的环境变量?

时间:2018-10-01 09:00:09

标签: shell unix processbuilder

我开发了一个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,其中包含一些敏感数据,这些数据稍后将由脚本使用。

我对ProcessBuilder#environment()的理解是,它仅为该子流程提供环境。您对该环境所做的更改仅影响该子流程。我已经通过浏览ProcessBuilder#environment()

的Javadoc进行了验证

现在我的问题是,在此操作结束时,即,当调用awk.destroy()时,将擦除环境以及我输入的所有敏感变量,还是手动擦除环境变量会更好使用env.remove(SENSITIVE_VARIABLE_KEY)env.putAll(new HashMap<String, String>)

映射

1 个答案:

答案 0 :(得分:2)

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

我不明白您的要求,为什么要删除环境条目。如果经过awk处理之后,您不再使用pb对象,并且没有对它的引用,则Java将对其进行垃圾回收。我看不到从地图上删除敏感条目会给您带来什么。无论如何,您还有另一个Java变量environmentVariable用于保存您的敏感数据。

对于您的问题,如果要删除一些数据,可以使用map.remove(),如果要清洁地图,则可以执行pb.environment().clear()。但是,如果执行此操作,则在使用pb启动新进程时,它将使用修改后的env-map。