Bash 命令参数安全性

信息安全 密码管理 秘密分享
2021-08-17 06:28:09

假设我想调用一个接收用户名和密码的程序来启动。./prog --user 'User' --password 'Password'除了用户从你的肩膀上看的明显泄漏之外,调用程序还有什么风险?有没有更安全的方法来传递密码?

3个回答

在大多数 Unix 系统上,所有用户都可以通过 ps 命令看到命令行。如果您在单用户系统上,这可能并不重要,但这就是这种方法通常被标记为不安全的原因。例如:MySQL 手册

更好的选择是将密码存储在文件中,这样可以避免这种泄漏。您需要确保文件的权限是适当的。我提供的链接解释了如何为 MySQL 执行此操作。许多其他软件以某种方式支持这一点。

让程序自己读取密码。

如果您正在使用低级语言进行开发,则可以使用 getpass(3) 或类似方法。对于 shell 脚本,您可以使用 read (因为它是内置的,所以命令参数没有泄漏)。

另请注意,如果您从其他地方传递凭据(例如在 Web 服务器上运行该命令,从客户端传递的内容中填写用户名和密码),则需要正确引用,例如密码 '`whoami `' 不会导致远程代码执行。

有几种方法可以在不输入密码的情况下将密码传递给程序:

  1. 使用read和一个变量

    read -s password ; ./prog --user 'User' --password "$password"
    

    在执行程序之前,您必须输入密码。

  2. 使用重定向

    输入密码password.txt并执行程序:

    ./prog --user 'User' --password `cat password.txt`
    

请注意,即使这些方法会在键入过程中隐藏密码,任何执行 a 的人ps xua | grep prog都将能够看到密码。

如果您可以更改程序以读取密码stdin或读取环境变量,则隐藏密码会更容易。在这种情况下,这些方法会起作用。