SSHには, Xウィンドウシステムの通信やTCP/IPアプリケーションの通信を 安全にするためにポートフォワーディングの機能がある. この節では, これらの機能の仕組みを説明する.
SSHのX11フォワーディングは, SSHクライアントとSSHサーバ間のX11の通信を暗号化して, SSHのセキュアな通信路へ転送する. これにより, スプーフィングやパケットの盗聴といった攻撃を防ぐことができる. また, 片方向クラス[4]の制約を越えたX11の転送が可能になる.
SSHでリモートホストにログインすると, X11フォワーディングが可能になるように, 自動的に設定される. リモートホスト上に疑似Xサーバが生成され, Xクライアントの通信先が疑似XサーバになるようにDISPLAY環境変数が設定される. SSHによって設定されたDISPLAY環境変数のホスト部は, SSHサーバのホスト名になり, DISPLAY番号は0より大きい値になる. 疑似Xサーバと実際のXサーバとの間の通信はSSHのセキュアチャネルを使って行なわれる(図 4).
例えば, Host AからHost BにSSHによりログインして, Xクライアントを起動した場合, Host BのSSHサーバであるSSHDはHost B上の疑似XサーバにXクライアントを生成する. Host B上の疑似Xサーバは受け取ったXクライアントの情報を暗号化し, SSHの通信路を通してHost Aへ転送する. Host AのSSH クライアントは, 受け取ったXクライアントの情報をHost A上の実際のXサーバに伝えるので, Host AのディスプレイにXクライアントが表示される.
図 4 X11のトラフィック転送
X11 ウィンドウシステムでは X サーバと X クライアントの接続の認証に xhost 機能あるいは xauth 機能が使われている. Xhost 機能はホスト(Xクライアントのホスト)を認証するので, そのホストを利用する 全てのユーザにXサーバ(自分の端末)のアクセスを許すことになる. 一方 xauth 機能は magic cookie というキーデータを使ってアクセスを制御する. Xサーバと同一のキーデータを持っているユーザだけがアクセスできる. 従って xhost 機能より安全である. しかし, 認証のためにキーデータをネットワーク 上に流すので, 盗聴される可能性があり, 十分な安全性があるわけではない.
SSHは, 疑似Xサーバに第3者がアクセスすることを防ぐために, xauth 機能を使って制御している.
SSH クライアントは, SSH によりリモートマシンへログインすると, ランダムな magic cookie を生成し, SSH の通信路を経由して, サーバへ転送する. サーバは疑似Xサーバに DISPLAY 環境変数を割り当て, これにランダムな magic cookie を関連付けて, xauth コマンドを用いて .Xauthority に保存する. X クライアントが起動されると, SSH サーバはその cookie を持っているか どうかを確認し, SSH の通信路を経由して X クライアントのパケットを SSH クライアントに転送する. SSH クライアンは転送された最初のパケットに含まれる magic cookie を本物の magic cookie で置き換えてXサーバに送る. このように SSH では本物の magic cookieをネットワーク上で転送せず, またランダムなmagic cookieをSSH の安全な経路で転送することにより, xauth を安全なものにして利用している.
SSHには, 任意のTCP/IPアプリケーションの通信情報を, SSHサーバとSSHクライアント間の暗号化された通信路上を通すためのポートフォワーディングと呼ばれる機能がある. この機能を利用して, ネットワークにパスワードを流すftp や POP の通信を安全にすることができる. 通信全体が暗号化されるので, 通信内容も同時に保護される.
インターネット上で用いられるTCP/IPアプリケーションは, サービスを依頼するクライアントとサービスを提供するサーバという構造になっている. クライアントがサーバに接続するために, クライアントは通信相手のサーバ上で動くサービスを識別する必要がある. この識別のために使われるのがポート番号であり, 16ビットの整数が用いられる*11. ポート番号1から1023までは, それぞれのサーバサービスに割り当てられている*12. このポートの番号はウェルノウンポート(well known port) と呼ばれる. 例えば, FTPサーバには21番, SMTPサーバには25番, HTTPサーバには80番, POP3サーバには110番が割り当てられる(図 5). 一方, クライアントには, 番号1024以上の空いているポートがOSにより自動的に割り当てられる. このポートは短命ポートと呼ばれる.
図 5 TCP/IPアプリケーションのサーバとクライアントの通信
任意の TCP/IP アプリケーションのポートフォワーディング(ローカルポート番号 Y, リモートポート番号 K; 例えば pop3 の 110) を指定してSSHを起動すると, SSH サーバ(ポート 22 ) と SSH クライアント (ポート番号 X ) 間に暗号化された 通信路を確立すると共に, SSH クライアント側では, 指定されたポート番号 Y でローカルホストからの接続を待つ(図 6). ローカルホストのユーザーがポート番号 Y へ接続するようにアプリケーションクライアント(例えば POPクライアント)を起動すると, SSHクライアントはその接続をSSHの通信路を通してSSHサーバへ転送する. SSHサーバはその接続をポート J を通してアプリケーションサーバへ接続する.
これにより, アプリケーションサーバとアプリケーションクライアントがSSHの暗号化された通信路を通って接続される. これにより, このアプリケーションでやりとりされるデータはSSHの通信路を通るので, 盗聴されても情報が漏れる危険性が少なくなる.
図 6 TCP/IPポートフォワーディングの概略図