bash 将环境变量安全地传送到标准输入

ATO*_*OMP 5 security bash environment-variables

我有一个密码存储在环境变量中。

read -s passwd
export passwd
Run Code Online (Sandbox Code Playgroud)

坏处:使用echo $passwd

现在我想将其通过管道传输到接受密码的命令stdin(例如,kinit)。但是,如果 bash 已set -x启用,那么这将泄漏密码。

(warning: will leak password if set -x is enabled)
$ echo $passwd | kinit x@example.com

+ kinit x@example.com
+ echo secretpassword
...(kinit output)...
Run Code Online (Sandbox Code Playgroud)

替代方案:使用printenv passwd

所以我习惯printenv把密码写到stdin,而不是echo。

(is this ok?)
$ printenv passwd | kinit x@example.com

+ kinit x@example.com
+ printenv passwd
...(kinit output)...
Run Code Online (Sandbox Code Playgroud)

当我尝试时,这不会将密码打印到 bash 输出。

问:可以使用吗printenv?

但这真的安全吗?是否有 bash 的配置可能会在某处泄露密码?

编辑:不要认为set -x打印到 stdout/stderr,已修复。

mur*_*uru 3

使用 时printenv,必须导出变量,这意味着您将其暴露给脚本中的其他命令,其中任何命令都可能会泄漏它。但是,如果在导出变量和将其用作输入之间没有其他命令,并且在使用后立即取消设置它,则它不太可能意外转储到日志中。

如果您使用的是 bash,则可以使用这里字符串:

kinit x@example.com <<<"$passwd"
Run Code Online (Sandbox Code Playgroud)

这里的字符串不包含在set -x输出中,并且不需要导出该变量:

$ bar=abc
+ bar=abc
$ cat <<<"$bar"
+ cat
abc
Run Code Online (Sandbox Code Playgroud)

但这里的字符串会创建临时文件,因此可以将其视为潜在的泄漏源。

  • 要添加有关临时文件的更多上下文:“此处文档[和此处字符串]创建临时文件,但这些文件在打开后将被删除,并且任何其他进程都无法访问。” https://tldp.org/LDP/abs/html/here-docs.html。 (4认同)
  • 在 bash 5.1(刚刚发布)中:“如果扩展文档小于管道缓冲区大小,则此处文档和此处字符串现在使用管道,如果大于管道缓冲区大小,则恢复为临时文件。” (4认同)