gpt4 book ai didi

php - 如何在 PHP 中安全地维护持久的 SSH 连接?

转载 作者:可可西里 更新时间:2023-10-31 23:41:54 24 4
gpt4 key购买 nike

我目前正在开发一个使用主从模型的 VPS 面板。一台主服务器运行一个用 PHP 编写的面板,并通过 SSH 管理多个从服务器。从属服务器通过一个受限帐户访问,该帐户可以对特定的服务器管理相关命令执行 sudo,并且所有交互都记录在该帐户本身无权访问的目录中。

我目前使用的是 PHP-SSH2,但这种方法存在一些问题:

  • 无法可靠地返回退出代码,因此所有命令都必须在包装脚本中执行,该脚本将标准输出、标准错误和退出代码打包到一个 JSON 对象中,并通过标准输出返回。该脚本必须存在于每个从属服务器上。
  • PHP-SSH2 库不知道“自定义连接超时”的概念,这意味着我必须在尝试使用 PHP-SSH2 连接之前使用 fsockopen 探测服务器 - 如果我不这样做,一个无法访问的服务器可能会使页面加载延迟一分钟或更长时间。由于下一个问题,情况更糟。
  • 持久连接是不可能的。这会在面板中导致绝对荒谬的页面加载时间,尤其是结合之前的超时问题。

目前,我主要尝试解决最后一个问题。

我遇到过几种可能的解决方案,但它们都存在某种问题:

  • 使用纯 PHP SSH 实现 PHPSecLib,并将所有 fsockopen 调用替换为 pfsockopen 调用。这将使连接持久化,但它比我想要的更骇人听闻,而且 PHP 中持久套接字的安全隐患尚不清楚。
  • 设置一个从主服务器到每个从服务器的持久 SSH 隧道,并在每个从服务器上运行一个简单的守护进程(绑定(bind)到本地主机)来运行它被告知的任何内容。这是一个问题,原因有二。首先,它需要在从属服务器上使用守护进程,这是我宁愿避免的。第二个问题是,如果有人要破坏从属服务器上的有限帐户,他们仍然可以简单地通过连接到“命令守护程序”来运行某些系统命令,即使他们无法从自己的 shell 访问这些命令。这是个问题。
  • 在主服务器上运行守护程序,代表面板管理与从服务器的持久 SSH 连接。这将涉及用 Python 编写 SSH 客户端(这是我熟悉的唯一合适的语言),并且可能归结为使用 paramiko。由于 paramiko 的文档很差,这不是一个非常有吸引力的选择,甚至可能导致安全问题,因为我并不完全清楚 应该 在 paramiko 中使用什么东西。<

以下不是一个选项:

  • 为面板本身切换到不同的语言。我正在用 PHP 编写面板,因为这是我最熟悉的语言,而且我知道我可能会遇到的怪癖和潜在问题。用我不熟悉的语言编写这样一个重要的面向公众的项目不是一个好主意。
  • 使用 Twisted 作为第三个“可能的解决方案”。 Twisted 是一个非常庞大且复杂的依赖项,文档似乎比 paramiko 的还要糟糕。
  • 在从属服务器上运行 HTTPd 或其他非 SSH 面向公众的守护进程。

在实践中,我看到页面加载时间有时会超过一分钟,因为页面加载必须联系多个服务器。这对于 VPS 面板来说显然是 Not Acceptable 。

我的目标是有某种实现可以避免在使用 PHP-SSH2 时引入的连接开销。以安全的方式执行此操作的最佳方法是什么,同时对从属服务器引入最少的依赖性?

最佳答案

您可以使用 autossh,并使用 autossh 创建反向(端口转发)隧道。然后让您的 php 应用程序与那些反向 ssh 端口通信。如果 ssh 连接失败,autossh 将继续尝试重新创建连接。您的 php 应用程序将无法连接到反向隧道,甚至不会超时。

关于php - 如何在 PHP 中安全地维护持久的 SSH 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14474810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com