私は現在、マスタースレーブモデルを使用する VPS パネルに取り組んでいます。1 台のマスター サーバーで PHP で記述されたパネルを実行し、複数のスレーブ サーバーを SSH 経由で管理します。スレーブ サーバーは、特定のサーバー管理関連のコマンドに sudo できる制限付きアカウントを介してアクセスされ、すべての対話は、アカウント自体がアクセスできないディレクトリに記録されます。
私は現在 PHP-SSH2 を使用していますが、このアプローチにはいくつかの問題があります。
- 終了コードは確実に返されるわけではないため、すべてのコマンドは、stdout、stderr、および終了コードを JSON オブジェクトにパッケージ化し、stdout 経由で返すラッパー スクリプトで実行する必要があります。このスクリプトは、すべてのスレーブ サーバーに存在する必要があります。
- PHP-SSH2 ライブラリは「カスタム接続タイムアウト」の概念を認識していません。つまり、PHP-SSH2 を使用して接続する前に、fsockopen でサーバーをプローブする必要があります。そうしないと、サーバーに到達できない可能性があります。ページロードを 1 分以上遅らせます。次の問題のために、これはさらに悪いことです。
- 永続的な接続はできません。これは、特にタイムアウトに関する以前の問題と相まって、パネルで絶対にばかげたページ読み込み時間を引き起こします。
現在、主に最後の問題を解決しようとしています。
私が遭遇したいくつかの可能な解決策がありますが、それらのすべてに何らかの問題があります。
- 純粋な PHP SSH 実装である PHPSecLib を使用し、すべての fsockopen 呼び出しを pfsockopen 呼び出しに置き換えます。これにより、接続が永続化されますが、私が望むよりもハックであり、PHP の永続的なソケットのセキュリティへの影響は不明です。
- マスターサーバーから各スレーブサーバーへの永続的な SSH トンネルを設定し、指示されたものを実行する各スレーブサーバーで単純なデーモン (localhost にバインド) を実行します。これには 2 つの理由があります。まず、スレーブサーバーにデーモンが必要になりますが、これは私がむしろ避けたいことです。2 つ目の問題は、誰かがスレーブ サーバーの制限付きアカウントを侵害した場合、「コマンド デーモン」に接続するだけで特定のシステム コマンドを実行できてしまうことです。たとえ自分のシェルからそれらのコマンドにアクセスできなくてもです。これは問題です。
- パネルに代わってスレーブ サーバーへの永続的な SSH 接続を管理するマスター サーバーでデーモンを実行します。これには、SSH クライアントを Python (私がよく知っている唯一の適切な言語) で作成する必要があり、最終的には paramiko を使用することになります。paramiko のドキュメントは貧弱なので、これはあまり魅力的なオプションではなく、paramiko での使用方法が完全に明確ではないため、セキュリティ上の問題が発生する可能性さえあります。
以下はオプションではありません。
- パネル自体の別の言語への切り替え。PHP は私が最もよく知っている言語であり、発生する可能性のある癖や潜在的な問題を認識しているため、PHP でパネルを作成しています。私がよく知らない言語で、このような重要な公開プロジェクトを書くのは悪い考えです。
- 3 つ目の「考えられる解決策」として Twisted を使用します。Twisted は非常に大きく複雑な依存関係であり、ドキュメンテーションは paramiko よりも悪いようです。
- スレーブ サーバーで HTTPd または非 SSH 公開デーモンを実行する。
実際には、ページ読み込みのために複数のサーバーに接続する必要がある場合、ページ読み込み時間が 1 分を超えることがあります。これは明らかに VPS パネルには受け入れられません。
私の目標は、PHP-SSH2 を使用するときに発生する接続オーバーヘッドを回避する何らかの実装を行うことです。スレーブサーバーに最小限の依存関係を導入しながら、安全な方法でこれを行うための最良の方法は何でしょうか?