命令行界面中的敏感数据

时间:2016-03-31 02:23:34

标签: security unix command-line design-principles

我知道在命令行界面中使用密码不赞成如下例所示:

./commandforsomething -u username -p plaintextpassword

我理解其原因(至少在unix系统中)是因为它能够在回滚以及.bash_history文件(或您使用的任何风味shell)中读取。

但是,我想知道在编程时是否可以安全地以编程方式使用这种与敏感数据的接口。例如,在perl中,你可以使用两个``,exec命令或系统命令执行一个命令(我不能100%确定它们之间的差异,除了两个反引号的返回值是输出已执行的命令与返回值的对比...但是我猜这是另一个帖子的问题。

所以,我的问题是:做像

这样的事情是否安全

system("command", "userarg", "passwordarg");

因为它基本上做同样的事情,只是没有在回滚或历史记录中发布? (请注意,我只使用perl作为示例 - 我不关心perl特有的答案,而是普遍接受的原则)。

1 个答案:

答案 0 :(得分:1)

这不仅仅与贝壳历史有关。

ps显示传递给程序的所有参数。传递这样的参数是不好的原因是你可以通过循环并执行ps来看到其他用户的密码。引用的代码不会有太大变化,因为它基本上都是一样的。

您可以尝试通过环境传递一些秘密,因为如果用户无法访问给定进程,则不会显示该环境。这样做更好,但也是一个非常糟糕的解决方案(例如:如果程序失败并转储核心,所有密码都将被写入磁盘)。

如果您使用环境变量,请使用ps -E,它将显示该过程的环境变量。将其用作与执行程序的用户不同的用户。基本上模拟“攻击者”,看看你是否可以窥探密码。在正确配置的系统上,您应该无法执行此操作。