3 ポイント 投稿者 GN⁺ 2023-12-25 | 1件のコメント | WhatsAppで共有

HTTPS 経由で SSH を転送する

  • SSH を HTTPS 経由で転送するには、クライアント側とサーバー側の両方を調整する必要がある。
  • クライアント設定の例では、~/.ssh/config ファイルに ProxyCommandServerAliveInterval を設定する。
  • 使用する ~/.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 はあるプロトコルを別のプロトコルに内包するのではなく、さまざまなヒューリスティクスを使って実際のバックエンドへリダイレクトする。
  • opensshProxyCommand ディレクティブを使い、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 を組み合わせる方法は、ネットワークセキュリティに関する専門知識を持つ人々にとって特に興味深いだろう。
  • ProxyCommandServerAliveInterval の設定を通じてネットワーク制限を回避する方法は、ネットワーク管理者やセキュリティ専門家に有用な情報を提供する。

1件のコメント

 
GN⁺ 2023-12-25
Hacker News のコメント
  • オランダのインターネットプロバイダー XS4ALL は、かつてポート80経由で SSH 接続を提供していた。これは、ホテルの Wi‑Fi などで他のポートがブロックされているときに便利だった。
  • HTTPS が広く存在することで、非常に制限の厳しい中間装置を通してもデータを転送できる。これが、SSL VPN と呼ばれる独自 VPN プロトコルが HTTPS 経由でトンネルを開始するモードを実装している主な理由である。
  • SSH をポート80や443で待ち受けさせ、別のホスト経由で ProxyJump を使ったり、SOCKS を通じてより制限の少ないインターネット接続を得たりする方法もある。DNS を TLS 経由で SSH 接続にフォワードすることも可能である。
  • Adaptive という会社は、HTTP3 を通じて SSH やさまざまなプロトコルを提供するデータセキュリティ基盤を構築中である。これにより、ユーザーは外部ポート経由でデータベース、サーバー、その他のリソースに接続できる。
  • 実際、ほとんどのファイアウォールは、単に openssh がポート443で待ち受けるだけでも回避できる。
  • CONNECT メソッドをフォワードプロキシではなくリバースプロキシのように考えるのは興味深い。しかし、CONNECT だけでは十分ではないため、WebSocket 経由で SSH を使って企業プロキシを回避している。
  • 「新しい」解決策に関する投稿が頻繁に出てくるのは不快である。こうしたアイデアは新しくなく、多くの人がすでに知っている内容だ。
  • SSH に似たアイデンティティ管理システムがブラウザに組み込まれていればよいのにと思う。hobo という公開鍵 HTTP 認証の提案を初めて読んだときは興奮したが、サーバー実装がなく、クライアント(ブラウザ)実装も存在しないことを知った。
  • 約20年前、企業ファイアウォールを通過するために corkscrew というツールを使っていた。このツールの独立した実装と説明は印象的である。
  • HTTP2 を介したトンネリングは優れた選択肢である。HTTP2 上に構築された RPC プロトコルとして gRPC がある。HTTP2 は TCP 接続を使って複数のデータ構造を同時に送受信するのに優れている。ただし、HTTP3 を使う必要はないかもしれない。QUIC 自体がすでにマルチプレクシングを提供しているためである。