我们在 Windows 和 Unix 中有一个 launcher 应用程序,它可以执行(使用 exec 系统调用启动应用程序)RDP、putty、MSSQL 等应用程序。为了调用它,我们传递参数,例如用户名、密码、IP。 最近我们发现,使用wmic或ps可以查出传递给它的参数是什么,从而暴露密码等敏感信息。 有什么方法可以屏蔽这些密码或隐藏所有参数。 注意:我的启动器从其他一些服务获取参数,因此在调用应用程序后要求输入密码不是一个选项!密码必须作为参数传递给应用程序。 有什么解决办法吗?
这是不可能的(至少在 Linux 上不可能以可靠的方式)安全地传递程序参数。
一个可能的解决方法是传递包含该密码的文件名(或其他一些资源 - 例如对某些数据库条目的“引用”),或使用其他一些进程间通信设施(例如在 Linux 上,fifo) (7)、shm_overview(7)、pipe(7)、unix(7)等...)来传递这些敏感信息。您还可以考虑使用环境变量(请参阅 environ(7) 和 getenv(3))。
在 Linux 上,还可以查看 proc(5) 以了解它能够显示有关进程的内容 - 通过
/proc/1234/
查看 pid 1234 的进程。也许您需要 seccomp 设施。
在 Unix 上,请注意 setuid 机制 - 很难理解 -。小心使用它(它是大多数安全或身份验证机制的基本块,例如
sudo
和 login
),因为一个简单的错误可能会造成巨大的 漏洞。
对于在 Unix 和 Windows 上运行的软件,我建议在某个文件中传递密码(例如在
/tmp/secretpassword
中),并通过某个程序给出该文件的名称 /tmp/secretpassword
(或 Windows 上的一些 D:\foo\bar
)参数,并确保明智地使用文件权限机制,以确保不需要该文件的人无法读取该文件。