security - 通过命令行安全地发送密码而不暴露在 ps/wmic (Windows,Unix) 中
问题描述
我们在 Windows 和 Unix 中有一个启动器应用程序,它执行(使用 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
and login
),因为一个简单的错误可能会打开一个巨大的漏洞。
对于编写在 Unix 和 Windows 上都可以工作的软件,我建议在某个文件(例如 in /tmp/secretpassword
)中传递密码,并通过一些程序参数给出该文件的名称/tmp/secretpassword
(或D:\foo\bar
在 Windows 上的某些名称),并确保明智地使用该文件权限机制,以确保不需要文件的人无法读取该文件。
推荐阅读
- flutter - 调整按钮以适应不同的屏幕尺寸
- c# - 如何在 Visual Studio 2019 中添加 Google MyBusiness C# 客户端库
- android - Firebase 身份验证不断在空对象引用上提供 com.google.firebase.auth.FirebaseAuth.getCurrentUser()'
- node.js - Passport 使用 NextJs 和 Express 为每个请求调用 deserializeUser
- elm - Elm:以字节为单位的搜索数
- javascript - 我们如何从所有用户那里获取唯一的机器 ID 或某个 ID,以查看他们是否已更新到部署的最新 Angular 版本?
- powerbi - 计算power bi中所有字段具有一定值的不同用户数
- ios - IOS 上的 NotificationHub 注册问题(React Native)
- pyspark - 如何正确使用 Pyspark 中的 ChiSquareTest 函数?
- php - XAMPP 能够在打印 HTTP 后修改标头