我在 Linux 服务器上运行一个应用程序,当我运行该应用程序时,我以命令行形式提供密码,如下所示:
./myapplication --smtp-password mypassword
在我们的应用程序中,到目前为止我们还没有构建 加密/解密 ,因为它应该是一个非常简单的监控应用程序,并且它是非常简单的“ping”和运行状况检查并在失败时发送电子邮件。
任何管理员(我们还有另外三名管理员)都可以使用 ps 列出进程,查看命令参数,并找出密码。
有办法隐藏吗?
答案1
更好的方法是重写,myapplication
以便它通过其他方式(如标准输入)获取密码。环境是另一个选项,但对于具有相同 euid(或 euid 0)的进程来说,通过 .environ 仍然可见/proc/<pid>/environ
。
如果不是,在 4.2 之前版本的 Linux 上,您可以通过确保密码不在命令行的前 4096 字节中来限制暴露,这样其他进程就无法通过读取获取它/proc/<pid>/cmdline
(就像ps
这样做)。 4.2及以上版本不再截断/proc/<pid>/cmdline
。
例如,与zsh
.${(l:4094::/:):-myapplication} --smtp-password=secret
运行 myapplication 时,第一个参数的大小为 4095 字节(4096 字节会超出 PATH_MAX 限制),类似于.//////[...]///myapplication
,因此您的密码将超出 4095 断点。
请注意,审核日志和 shell 历史文件是命令行上传递的秘密字符串的其他关注领域。
答案2
在Linux系统上,您可以通过/proc
使用适当的挂载来隐藏进程信息hidepid
设置,例如mount -o remount /proc -o hidepid=2
.但是,这不会向具有 root 访问权限的任何人隐藏进程信息。更好的解决方案是不在命令行中包含敏感数据。