管道密码和安全

管道密码和安全

我有时会这样做echo "secret" | mysql -u root -p ...。现在我担心这里的安全性:列出所有进程的人能看到密码吗?

为了检查,我尝试使用echo "test" | sleep 1000echo 命令并输入以下秘密不是在“ps aux”的输出中可见。所以我认为它是安全的 - 但安全专家可以确认一下吗?:)

答案1

答案取决于你使用的 shell。许多 shellecho都有内置命令意味着它不会生成单独的进程,因此不会显示在进程列表中。但是,如果您键入/bin/echo或,./echo或者如果您使用该命令禁用内置命令enable -n echo,则 shell 将不会使用其内置命令,而是使用二进制版本。这将显示在进程列表中。

如果您使用的是二进制文件而不是内置的 shell,则 echo 命令将显示,直到将数据移动到其他进程的 STDIN 缓冲区。此缓冲区的大小是有限的,因此如果数据量超过缓冲区的容量,则 echo 命令将不得不等待一段时间,直到其他进程可以从缓冲区中读取部分数据。在大多数情况下(例如您上面给出的两个示例),此时间段将是微秒。如果您碰巧使用 echo 将 20MB 的 SQL 转储粘贴到 MySQL,则可能需要更长的时间。无论时间有多短,如果您使用的是二进制文件而不是内置的 shell,并且有人碰巧掌握了正确的时间,他们将能够在进程列表中看到该进程。

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

mysql -u root -p < file_with_secret.sql

答案2

对于 mysql 来说 ~/.my.cnf 可以用来存储机密,即

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

[mysql]
database = DBNAME

答案3

只需使用

mysql -uroot -p

然后按回车键。然后系统将提示您输入密码,并且该密码不会显示在进程列表或历史文件中。

答案4

如果“安全”是指“在 的输出中不可见” ps,那么是的,它是安全的。但不要忘记,UID与正在运行的 mysql 客户端共享 的其他进程(或显然以 root 权限运行的进程)可以访问其STDIN。要使用您的 echo/sleep 示例:

sh-5.1$ echo "test" | sleep 1000 &
[1] 3960020
sh-5.1$ cat /proc/3960020/fd/0
test

以上是Linux具体的,并且依赖于procfs

相关内容