传递密码和安全性


11

我有时会echo "secret" | mysql -u root -p ...。现在,我在这里讨论安全性:列出所有进程的人可以看到密码吗?

为了进行检查,我尝试了echo "test" | sleep 1000该命令,并且在“ ps aux”的输出中看不到带有密码的echo命令。因此,我认为它是安全的-但是安全专家可以确认吗?:)


运行无穷循环时,无法在进程列表中看到它。好问题。
蒂姆(Tim)

1
此外,请不要忘记,您在大多数shell上键入的内容都会存储在历史记录文件中的某个位置(例如.history)。
亚历山大·伯德

Answers:


13

答案取决于您使用的是哪个shell。许多炮弹有echo一个内置的命令,这意味着它不会产生一个独立的过程,因此在上市过程将不会出现。但是,如果您键入/bin/echo./echo或如果您使用enable -n echo命令禁用了内置命令,则外壳将不使用其内置命令,而将使用二进制版本。这将显示在过程列表中。

如果您使用的是二进制文件而不是内置的Shell,echo命令将一直显示,直到将数据移至另一个进程的STDIN缓冲区为止。此缓冲区的大小是有限的,因此,如果缓冲区中的数据量超出了缓冲区的容量,则echo命令将必须挂起一段时间,直到其他进程可以从缓冲区中读取一些数据为止。对于大多数情况(例如您上面给出的两个示例),此时间段将为微秒。如果您恰巧使用echo将20MB的SQL转储粘贴到MySQL中,则时间可能会更长。无论时间有多短,如果您使用的是二进制文件而不是内置的Shell,并且碰巧有人正好安排好时间,他们将能够在进程列表中看到该进程。

您可以通过将机密数据放入文件(具有适当的权限)并将文件用作STDIN来避免这种情况,如下所示:

mysql -u root -p < file_with_secret.sql

5
请记住,在命令行上键入密码的方式很可能会将其保存到您的Shell的历史记录文件中,因此值得检查历史记录文件的权限和内容。
aculich 2011年

3

对于mysql而言,〜/ .my.cnf可用于存储机密,即

[client]
user = DBUSERNAME
password = DBPASSWORD
host = DBSERVER

[mysql]
database = DBNAME

1

只需使用

mysql -uroot -p

然后按回车。然后将提示您输入密码,并且该密码在进程列表或历史记录文件中都不可见。


一旦登录,MySQL就会在STDIN上接受的数据是要运行的命令。问题中的“秘密”不是密码。
Ladadadada 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.