【问题标题】:Prevent command line argument from displaying in bash history or ps -ef with bash script使用 bash 脚本防止命令行参数显示在 bash 历史记录或 ps -ef 中
【发布时间】:2019-04-26 01:49:21
【问题描述】:

我有一些执行 bash 脚本的 java 代码,而该脚本又执行需要命令行参数才能运行的命令行工具。

此工具的这些命令行参数之一是纯文本密码。

脚本类似于:

#!/bin/bash

# script.sh
# some setup code 

<cli-tool-executable> -arg1 <arg1> -arg2 <arg2> ... -password <password>

我正在通过 apache commons exec 从 java 代码中调用它,方法是:

CommandLine commandLine = new CommandLine("bash");

// bash script that runs the tool
commandLine.addArgument("script.sh");

// add other arguments
commandLine.addArgument(...);

// execute
new DefaultExecutor().execute(commandLine);

鉴于目前的状态,如果我要运行 ps -ef 或查看 bash 历史记录,我将能够以纯文本形式查看提供给 cli 工具的命令行参数,包括密码,显然不是很好。

理想情况下,我希望密码以某种方式被混淆或根本不显示。

我花了大半天的时间试图寻找其他解决方案,并在此过程中发现:

  • 使用 C 代码执行此操作有一些潜在的骇人听闻的方法,这些方法不一定安全或不推荐
  • 永远不希望以这种方式传递密码(很明显),最好通过以某种安全方式控制其权限的文​​件,或者通过环境并作为标准输入传递,或者通过代码本身。不幸的是,这对我来说都不是一个选项(该工具不支持它 - 它只需要一个名为 -password 的命令行参数和一个字符串密码,它不会读取任何环境变量或类似的东西)。
  • 我仍然不能完全确定我正在尝试做的事情是否完全可能

我尝试将内容放入环境变量并将其传递给 -password 参数,我尝试将其放入文件中并尝试将 cat passwordfile 放入密码参数中,但在所有情况下我都尝试过它没有'似乎没有显示密码参数。

有人对此有任何想法/建议吗?谢谢。

【问题讨论】:

  • 您可以更轻松地重现:当您运行secret=7;sleep $secret &amp; 时,您会发现sleep 7ps -f。如何避免这种情况?
  • 我没有测试serverfault.com/a/592941,这对你有用吗?

标签: java bash unix password-protection ps


【解决方案1】:

这可能是一个很长的尝试,但您可以在 docker bash 实例中运行您的命令(具有适当的安全设置)。例如,Dockerfile

FROM bash:4.4
COPY script.sh /
CMD ["bash", "/script.sh"]

作为探索的替代方法,有一个docker engine API(单击HTTP 选项卡),基本上是 docker 客户端的大部分功能。

【讨论】:

  • 感谢您的建议。由于脚本运行环境的特定限制,我不完全确定这是否适用于我的用例
  • AFAIK docker 与运行主机一样安全。如果脚本可以在给定主机上运行,​​它可以在同一主机上的 docker 内运行。
  • 在 docker 中运行的 AFAIK 命令显示在主机的 ps -ef 中。
  • 总有希望,看来hidepid 可以用来提高这种情况下的安全性。除非你不信任 root 哈哈
猜你喜欢
  • 2011-09-22
  • 2012-01-25
  • 2019-10-22
  • 2019-04-08
  • 2021-11-27
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多