安全地使用密码作为bash参数

时间:2010-10-23 08:06:46

标签: security bash

我正在提取处理注册的Web应用程序的一部分,另一部分将被重写。

这个想法是注册部分可以作为单独的应用程序存在,与用于创建和设置帐户的应用程序的其余部分的接口。显然有很多方法可以做到这一点,其中大多数是基于网络的解决方案,如SOAP,但我想使用更简单的解决方案:安装脚本。

值得关注的是,某些敏感数据,特别是新帐户的管理员密码,将通过bash传递。

我正在考虑在应用程序之间共享一个小类,以便密码可以传递已经哈希,但我也必须传递盐,所以它似乎仍然是(小)安全风险。其中一个问题是bash日志记录(我可以为单个命令禁用它吗?)但我确定还有其他问题吗?

这将在同一个私人服务器上,所以风险似乎很小,但我不想冒任何机会。

感谢。

4 个答案:

答案 0 :(得分:2)

使用$ HISTFILE环境变量,取消设置(这适用于所有用户):

echo "unset HISTFILE" >> /etc/profile

然后再将其重新设定。

有关$ HISTFILE变量的更多信息:http://linux.about.com/cs/linux101/g/histfileenviron.htm

希望这有帮助!

答案 1 :(得分:2)

来自bash的手册页:

  

<强> HISTIGNORE                 用冒号分隔的模式列表,用于决定哪些模式   命令                 行应保存在历史列表中。每种模式   是                 锚定在行的开头并且必须匹配   com-                 完整行(不附加隐含的'*')。每种模式   是                 在指定的检查之后对线进行测试   应用HISTCONTROL。除了正常的外壳   图案                 匹配字符,'&amp;'匹配以前的历史记录行。   “&安培;”                 可以使用反斜杠进行转义;反斜杠是   去除                 在尝试比赛之前。第二个及以后   的线条                 多行复合命令未经过测试,并已添加   到了                 历史,无论HISTIGNORE的价值如何。

或者,根据您的评论,您可以将密码存储在受保护的文件中,然后从中读取。

答案 2 :(得分:1)

将盐透明处理是没有问题的(盐通常以透明方式存储),盐的目的是避免始终使用相同的散列进行相同的密码散列(因此具有相同密码的用户将具有相同的散列,对于每个可能的密码,彩虹表只需要一个哈希值。)

更有问题的是通过命令行参数传递敏感数据,同一个框中的窃听者可以看到任何命令的参数(在Linux上它们出现在/ proc // cmdline上,在大多数Unix上都可以看到{ {1}};某些系统将/ proc //上的权限仅限于进程的ps以确保安全性。

您可以做的是通过文件传递敏感信息,不要忘记在创建文件之前将owner设置为非常严格的设置。

答案 3 :(得分:1)

Bash通常不记录在脚本中执行的命令,而只记录在交互式会话中(取决于适当的设置)。要显示此信息,请使用以下脚本:

#!/bin/bash
echo "-- shopt --"
    shopt | grep -i hist
echo "-- set --"
    set -o | grep -i hist
echo "--vars --"
    for v in ${!HIST*}
    do
        echo "$v=${!v}"
    done

像这样运行:

$ ./histshow

并将输出与来源的输出进行比较:

$ . ./histshow

在第一种情况下,请注意HISTFILE未设置且set选项historyoff。在第二种情况下,获取脚本会在交互式会话中运行它,并显示您的设置。

我只能通过在脚本中执行set -o history并通过设置HISTFILE然后进行显式{{}来将其历史记录记录到文件中来使脚本保留内存中的历史记录1}}。