HTTPS 経由で SSH を転送する
- SSH を HTTPS 経由で転送するには、クライアント側とサーバー側の両方を調整する必要がある。
- クライアント設定の例では、
~/.ssh/config ファイルに ProxyCommand と ServerAliveInterval を設定する。
- 使用する
~/.ssh/https-tunnel.bash スクリプトは、CONNECT メソッドをヘッダーとして送信しつつ、socat を使って TLS 接続を生成する。
サーバー設定例
- Apache2 の HTTPS サーバー設定では、
proxy_connect_module をロードし、AllowCONNECT ディレクティブを使って特定の宛先に対する CONNECT HTTP メソッドの使用を許可する。
- サーバー側では、
https-server で単一の宛先である ssh-server ホストに対してのみ CONNECT メソッドを利用できるよう設定する。
背景
- 病院に滞在しながら、ほとんどの接続方式が遮断された病院の Wi-Fi 経由でリモート作業をしたい。
- 病院のネットワークは HTTP と HTTPS 接続のみを許可し、SSH は完全に遮断されている。
- SSH を HTTP または HTTPS 経由で転送する方法を探る。
可能な方法
- 単一ポートで SSH と HTTPS プロトコルを共存させ、透過的に振り分ける
sslh プロジェクト。
sslh はあるプロトコルを別のプロトコルに内包するのではなく、さまざまなヒューリスティクスを使って実際のバックエンドへリダイレクトする。
openssh の ProxyCommand ディレクティブを使い、SSH プロトコルを別のプロトコルに完全に内包する方法。
SSH over HTTP
- シンプルな SSH over HTTP の試みとして、Apache2 を設定し、単一の宛先
ssh-server:22 に対して CONNECT メソッドを許可する。
- クライアント側は
socat を使って簡単に調整できる。
ServerAliveInterval を使って、HTTP 接続がアイドル状態でも切断されないようにする。
SSH over HTTPS
socat は HTTPS プロキシには対応していないが、TLS カプセル化には対応している。
CONNECT ベースの方法は手作業で簡単に実装できる。
~/.ssh/https-tunnel.bash スクリプトを使って SSH over HTTPS トンネリングを実現する。
まとめ
- HTTPS が広く存在することで、非常に制限の厳しい中継装置を通してもデータを転送できる。
CONNECT メソッドは、TCP ペイロードストリームを TLS ホストストリームでラップする有用なハックである。
ServerAliveInterval は、アイドル接続に厳しい下位トランスポート上で接続を維持するために使われる。
GN⁺の意見
- この記事で最も重要なのは、制限の厳しいネットワーク環境でも SSH 接続を可能にする創造的な解決策を示している点である。
- SSH と HTTPS を組み合わせる方法は、ネットワークセキュリティに関する専門知識を持つ人々にとって特に興味深いだろう。
ProxyCommand と ServerAliveInterval の設定を通じてネットワーク制限を回避する方法は、ネットワーク管理者やセキュリティ専門家に有用な情報を提供する。
1件のコメント
Hacker News のコメント