このページの目次
SSH プロトコル
SSH は単なる「暗号化された telnet」ではない——トランスポート層(鍵交換+暗号化)、認証層(公開鍵/パスワード/証明書)、接続層(ポートフォワーディング/X11/SFTP のマルチプレクシング)の 3 層が分離されている。ポートフォワーディングにより、SSH は「スイスアーミーナイフ」のような存在となる。
概要
SSH(Secure Shell, 1995/2006)は Unix/Linux システム管理の中核ツールである。プロトコルは 3 層に分かれている:Transport Layer は鍵交換と暗号化を行い、User Authentication Layer は身份認証(公開鍵/パスワード/TOTP)を行い、Connection Layer は単一の TCP 接続上で shell/port forwarding/SFTP などのチャネルをマルチプレクシングする。SSH のポートフォワーディング(-L/-R)は簡易 VPN として機能し、暗号化トンネルを通じてリモートポートをローカルにマッピングできる。SSH 2.0 は SSH 1.x の重大なセキュリティ問題を修正したものであり、現代において唯一安全なバージョンである。
3 層アーキテクチャ
Connection Protocol (RFC 4254): channels (shell, exec, forward, SFTP)
User Authentication (RFC 4252): password, publickey, keyboard-interactive
Transport Layer (RFC 4253): key exchange, encryption, server auth
TCP
Transport Layer: 鍵交換 (curve25519-sha256)
User Authentication
方法 (順序で試行):
1. publickey: クライアント: sign(session_id + request + publickey, privatekey)
サーバー: verify → SSH_MSG_USERAUTH_SUCCESS
2. keyboard-interactive: TOTP または challenge-response
3. password: 暗号化チャネル内で送信 (安全)
Connection Layer: チャネルマルチプレクシング
各チャネルは独立:
SSH_MSG_CHANNEL_OPEN: type="session" → channel 0
SSH_MSG_CHANNEL_OPEN: type="direct-tcpip" → channel 1 (ポートフォワーディング)
チャネルタイプ:
session: shell, exec, subsystem (SFTP)
direct-tcpip: ローカルポートフォワーディング (-L)
forwarded-tcpip: リモートポートフォワーディング (-R)
ポートフォワーディング
ローカル (-L 8080:internal:80): SSH クライアントが :8080 でリッスン → トンネル → SSH サーバーが internal:80 に接続
リモート (-R 3000:localhost:22): SSH サーバーが :3000 でリッスン → トンネル → SSH クライアントが localhost:22 に接続
参考
- RFC: 4251-4254, 5656, 8731
- ソースコード: OpenSSH (
sshconnect2.cfor auth,channels.cfor channels)
Keywords: SSH, transport, kex, publickey, channel, port forwarding, SFTP, known_hosts