在启动时将密码安全地传递给 PuTTY 进程
Securely pass password to PuTTY process on start
我正在维护我们公司的一个应用程序(用 C# 编写),它在一个跳转主机上运行并提供跨不同服务器搜索和启动与该服务器的 PuTTY 连接的功能。为此,应用程序当前启动 PuTTY 进程并传递参数,例如主机名、用户名和密码。每个服务器的密码是从密码管理器服务中检索的。这些参数通过命令行界面传递给 PuTTY。所以应用程序的目的是自动检索密码并登录到不同的服务器。
当前方法的问题是,在 Windows 任务管理器中,管理员可能会看到所有启动的 PuTTY 实例和相应的凭据作为命令行参数。
到目前为止,我还没有找到任何切实可行的解决方案来避免这种情况。这些是我目前研究的内容:
- 不传递密码参数,而是使用
SendKeys
在 promt 中键入密码:不可靠,因为无法读取 PuTTY 输出并知道应用程序何时准备好输入要输入的内容.
- 使用Plink代替PuTTY并通过stdin传递参数:Plink支持stdin/stdout通信,但终端功能非常有限,登录成功后无法实际使用。
- 修改 PuTTY 以屏蔽密码:我看到一些建议,修改 PuTTY 源代码,在应用程序启动后覆盖主参数中的密码。但是,此解决方案似乎仅适用于 Linux,不适用于 Windows。
- Using SSH.NET library to provide my own SSH terminal implementation: SSH.NET library 似乎类似于 Plink 更适合以编程方式发出命令,但不适合为用户打开终端。我想实现一个完整的终端需要做很多工作。
一些可行的想法:
- 修改 PuTTY 代码,以便参数可以通过 stdin 传递:可以工作,但我不知道这会有多容易,因为我没有很好的 C 知识。
- 使用支持标准输入输出的备用客户端。 Java 库 JSch 看起来非常强大,似乎已经包含了一个终端。是否可以创建一个独立的应用程序,它可以接收标准输入并使用它来打开终端和自动登录?
如有任何进一步的建议,我们将不胜感激。您是否知道 PuTTY 的任何其他 Windows 替代品,它支持以更安全的方式传递凭据?
从 0.77 开始,PuTTY 可以使用 -pwfile
switch.
从文件中读取密码
根据 Martin Prikryl 的建议,我创建了一个最小示例,它在 C# 中创建了一个 NamedPipe,并将其作为 pwfile
参数传递给 PuTTY:
public void CreatePipe()
{
var server = new NamedPipeServerStream("SecretPipe");
server.WaitForConnection();
StreamWriter writer = new StreamWriter(server);
writer.Write("top!!secret");
writer.Flush();
server.Dispose();
}
然后 PuTTY 可以如下启动,管道作为 pwfile
参数:
putty.exe -l testuser -pwfile "\.\PIPE\SecretPipe" hostname
我正在维护我们公司的一个应用程序(用 C# 编写),它在一个跳转主机上运行并提供跨不同服务器搜索和启动与该服务器的 PuTTY 连接的功能。为此,应用程序当前启动 PuTTY 进程并传递参数,例如主机名、用户名和密码。每个服务器的密码是从密码管理器服务中检索的。这些参数通过命令行界面传递给 PuTTY。所以应用程序的目的是自动检索密码并登录到不同的服务器。
当前方法的问题是,在 Windows 任务管理器中,管理员可能会看到所有启动的 PuTTY 实例和相应的凭据作为命令行参数。
到目前为止,我还没有找到任何切实可行的解决方案来避免这种情况。这些是我目前研究的内容:
- 不传递密码参数,而是使用
SendKeys
在 promt 中键入密码:不可靠,因为无法读取 PuTTY 输出并知道应用程序何时准备好输入要输入的内容. - 使用Plink代替PuTTY并通过stdin传递参数:Plink支持stdin/stdout通信,但终端功能非常有限,登录成功后无法实际使用。
- 修改 PuTTY 以屏蔽密码:我看到一些建议,修改 PuTTY 源代码,在应用程序启动后覆盖主参数中的密码。但是,此解决方案似乎仅适用于 Linux,不适用于 Windows。
- Using SSH.NET library to provide my own SSH terminal implementation: SSH.NET library 似乎类似于 Plink 更适合以编程方式发出命令,但不适合为用户打开终端。我想实现一个完整的终端需要做很多工作。
一些可行的想法:
- 修改 PuTTY 代码,以便参数可以通过 stdin 传递:可以工作,但我不知道这会有多容易,因为我没有很好的 C 知识。
- 使用支持标准输入输出的备用客户端。 Java 库 JSch 看起来非常强大,似乎已经包含了一个终端。是否可以创建一个独立的应用程序,它可以接收标准输入并使用它来打开终端和自动登录?
如有任何进一步的建议,我们将不胜感激。您是否知道 PuTTY 的任何其他 Windows 替代品,它支持以更安全的方式传递凭据?
从 0.77 开始,PuTTY 可以使用 -pwfile
switch.
根据 Martin Prikryl 的建议,我创建了一个最小示例,它在 C# 中创建了一个 NamedPipe,并将其作为 pwfile
参数传递给 PuTTY:
public void CreatePipe()
{
var server = new NamedPipeServerStream("SecretPipe");
server.WaitForConnection();
StreamWriter writer = new StreamWriter(server);
writer.Write("top!!secret");
writer.Flush();
server.Dispose();
}
然后 PuTTY 可以如下启动,管道作为 pwfile
参数:
putty.exe -l testuser -pwfile "\.\PIPE\SecretPipe" hostname