Documentation

/

White Papers

シームレスなSSH接続でターミナルを使う最適な方法

ryan

2025年3月10日

シームレスなSSH接続でターミナルを使う最適な方法

はじめに

従来のアクセス制御ソリューションにおける最大の課題は何でしょうか。多くのソリューションでは、ユーザーのPCに別途エージェントをインストールし、GUIベースのインターフェース経由でしかサーバーに接続できません。この方式は、CLI環境に慣れた開発者やシステム管理者のワークフローを大きく妨げます。ショートカットやスクリプトを活用した効率的な作業方法を捨て、GUIベースのアクセスに切り替えることを強いられれば、生産性が低下するのは避けられません。

この問題を解決するために、QueryPieはSeamless SSH Connectionを開発しました。このアプローチは、ユーザーが使い慣れたSSHワークフローを維持したまま、セキュリティを確保します。SSH設定ファイルに少し手を加えるだけで、好みのCLI環境を犠牲にすることなくアクセス制御を適用できることが、このソリューションの大きな利点です。

123
Host *.querypie.io  Port 22  ProxyCommand qpa ssh %r %h %p

この設定を行えば、ユーザーは普段使い慣れているSSHコマンドと同じ方法で対象サーバーに接続できます。

1
ssh ryan@test.querypie.io

Seamless SSH Connectionの仕組み

Seamless SSH Connectionがどのように機能するのかを理解するには、まずSSH ProxyCommandの概念を把握する必要があります。

SSH ProxyCommand

ProxyCommand は、最終的な接続先に到達する前に、中継サーバーを経由してSSH接続をルーティングする方法です。この機能はSSHクライアントの設定で指定でき、SSHクライアントはProxyCommandに設定されたコマンドを実行して対象サーバーとの通信を確立します。

仕組み

  1. ユーザーによる実行: ユーザーがSSHでリモートサーバーへの接続を試みると、SSHクライアントはまず ProxyCommand が設定されているかを確認します。ProxyCommand が設定されている場合、SSHクライアントは対象サーバーへ直接接続する前に、指定されたコマンドを実行します。

  2. データストリーム接続:

  • stdin: SSHクライアントは ProxyCommand プロセスのstdinを通じてデータを送信します。このデータには、ユーザーコマンドやファイル転送リクエストなどが含まれます。

  • stdout: ProxyCommand プロセスは対象サーバーへの接続を管理し、その応答をstdout経由でSSHクライアントに返します。これにより、ユーザーはまるで直接接続しているかのようにサーバーの出力を確認できます。

  1. 双方向データ転送: ProxyCommand はstdinから受け取ったユーザー入力を対象サーバーへ転送します。対象サーバーからの応答は受信され、stdoutを通じてSSHクライアントに返されます。これにより、SSHクライアントと対象サーバーの間に双方向の通信チャネルが確立されます。

ProxyCommandで使用される特別な変数

  • %r → SSHコマンドで指定されたユーザー名

  • %h → SSHコマンドで指定された対象サーバーのアドレス

  • %p → SSHコマンドで指定された対象サーバーのポート(-p で上書きしない限り既定値は22)

QueryPie Agent - CLI拡張

Seamless SSH ConnectionでProxyCommandに使われる qpa コマンドは、QueryPie経由でSSHアクセスを可能にする、QueryPie Agentの拡張CLI版です。SSHクライアントの接続はAgentを経由してトンネリングされ、QueryPieシステムによるユーザー認証が行われます。

接続構成 SSH Client → Agent CLI → ARiSA Proxy Server → Target Server

コンポーネント概要

コンポーネント

説明

SSH

OpenSSHクライアントです。

Agent - CLI (qpa)

ProxyCommand経由で実行されるシェルコマンドです。
Agent内部ではSubProcessと呼ばれ、MainProcessとのメッセージ通信のためのIPCが実装されています。

Agent - Main

ログイン、トンネリング、UIベースの実行を担当するユーザーエージェントです。

API

agentService.protoで定義されたサービスを実装し、提供します。

TargetServer

接続先のサーバーです(例: test.querypie.com

活用例

Seamless SSH Connectionを使えば、サーバー開発者はアクセス制御ソリューションが導入された環境でも、これまで慣れ親しんだ方法をそのまま使い続けられます。