假设我想调用一个接收用户名和密码的程序来启动。./prog --user 'User' --password 'Password'除了用户从你的肩膀上看的明显泄漏之外,调用程序还有什么风险?有没有更安全的方法来传递密码?
Bash 命令参数安全性
信息安全
密码管理
秘密分享
2021-08-17 06:28:09
3个回答
在大多数 Unix 系统上,所有用户都可以通过 ps 命令看到命令行。如果您在单用户系统上,这可能并不重要,但这就是这种方法通常被标记为不安全的原因。例如:MySQL 手册。
更好的选择是将密码存储在文件中,这样可以避免这种泄漏。您需要确保文件的权限是适当的。我提供的链接解释了如何为 MySQL 执行此操作。许多其他软件以某种方式支持这一点。
让程序自己读取密码。
如果您正在使用低级语言进行开发,则可以使用 getpass(3) 或类似方法。对于 shell 脚本,您可以使用 read (因为它是内置的,所以命令参数没有泄漏)。
另请注意,如果您从其他地方传递凭据(例如在 Web 服务器上运行该命令,从客户端传递的内容中填写用户名和密码),则需要正确引用,例如密码 '`whoami `' 不会导致远程代码执行。
有几种方法可以在不输入密码的情况下将密码传递给程序:
使用
read和一个变量read -s password ; ./prog --user 'User' --password "$password"在执行程序之前,您必须输入密码。
使用重定向
输入密码
password.txt并执行程序:./prog --user 'User' --password `cat password.txt`
请注意,即使这些方法会在键入过程中隐藏密码,任何执行 a 的人ps xua | grep prog都将能够看到密码。
如果您可以更改程序以读取密码stdin或读取环境变量,则隐藏密码会更容易。在这种情况下,这些方法会起作用。