防止用户密码以纯文本形式存储在 bash 历史记录中

信息安全 密码管理 密码破解 重击
2021-08-24 18:20:58

假设我想找到一个 linux 用户 sudoer 帐户的密码。假设他使用强密码。假设我可以物理访问机器。我可以获取他的密码和影子文件并暴力破解数天,或者只是获取他的 bash 历史文件的副本并将其用作单词列表。

我不是黑客,但是当我想劫持某人的帐户时,这种方法已经奏效了很多次。在我看来,很多人不小心在命令行上输入了密码,尤其是在他们不触摸输入的情况下。

Lolz,我也不碰打字。我管理的系统的用户也没有。如何确保我的超强密码没有以纯文本形式存储在我的.bash_history.

我知道我可以继续删除 bash 历史记录,但是还有其他方法吗?

3个回答

你不能,也不应该尝试,原因如下:

  1. 技术能力不完善(语义)
  2. 技术能力不完善(集中测井)
  3. 替代向量(过程表)
  4. 最佳实践(教导正确性)

技术能力不完善(语义)

假设您实际上想要一个历史文件——它的存在是有原因的;帮助您记住您键入的命令,通过引用重复命令等。在这种情况下,您想要删除错误输入的密码。你是怎样做的?

你可以有一个在 bash 历史文件中扫描的明文密码列表......但是你的系统上有一个明文密码列表。

您可以查找诸如“sudo”和“su”之类的命令并尝试删除它们之后的内容...但是将会发生的事情是有人会错误地输入“sudp”,然后在提示符下输入他们的密码,然后您的过滤器不会注意到它,因为错误导致密码泄露。

简而言之,计算机不够智能,无法过滤掉不适当的密码条目;这是一个语义问题。

技术能力不完善(集中测井)

在 bash 4.1 中,他们引入了将每个人的历史日志复制到 syslog 的功能。这是人们多年来一直在破解、修补和编写 bash(和其他 shell)脚本的功能的合法版本如果其他人管理您的机器——比如工作中的 IT 团队——那么您可能无法控制您的命令行是否被悄悄地记录下来,而您却不知道。

这不仅仅是 bash。Linux 上的 auditd 守护进程可以配置为记录命令和参数:

# grep oops /var/log/audit/auditd.log
type=EXECVE msg=audit(1443795447.953:2387443): argc=6 a0="sudo" a1="oops" a2="i" a3="typed" a4="my" a5="password"
#

这是一个系统级设置,通过内核运行,与您使用的任何 shell 完全无关,也与您可能为自己选择的任何历史设置无关。

替代向量(过程表)

您在命令行上键入的任何内容都可能会显示在进程表中,这就是使用密码的工具要求以交互方式输入密码的原因。如果你搞砸了(如上面的 sudo 示例)并将它们作为参数输入,它们就在那里供某人从进程列表中抓取 - 并且某人编写一个从命令行中抓取命令行的收割机并不难进程表。

最佳实践(教导正确性)

这些反对意见中的每一个都有警告......“如果我不想继续使用历史文件”,“如果我的系统管理员不干涉”,“如果没有人仔细观察进程表”......但是我对“最佳实践”的定义是“你做的事情,因为你不能依赖其他事情按照你希望的方式进行。” 因此,最佳实践只是假设任何错误输入的密码都被泄露,立即更改密码,然后继续您的生活。

您可以实施的任何“解决方案”都是部分的,并且容易在用户的检测范围之外发生故障。我宁愿不要给人们一种错误的印象,他们比他们更安全。

我意识到训练人们去做这件事很困难。哎呀,培训人们做任何事情都很难,而安全则是双重困难。但这是正确的答案。

好吧,您描述的方法(破解影子文件中的哈希)无法阻止,因为 Linux 没有或者更确切地说不是旨在阻止攻击者对机器进行物理访问。

如果要删除 bash 历史记录(注销时),请将以下内容放在文件~/.bashrc~/bash_logout 中

cat /dev/null > ~/.bash_history && history -c && exit

编辑.bashrc文件:

nano ~/.bashrc

将这两个参数的值更改为:

HISTSIZE=0
HISTFILESIZE=0

HISTSIZE 是 bash 会话正在进行时存储在历史列表中的内存中的行数或命令数。

HISTFILESIZE 是(a)在会话启动时允许在历史文件中的行数或命令数,以及(b)在 bash 会话结束时存储在历史文件中以供将来的会话使用。