用語辞典・通信プロトコル

SSH

SSHとは

SSHは、暗号化された遠隔ログイン、コマンド実行、トンネルなどを提供するプロトコルです。正式名称はSecure Shell(セキュア・シェル)で、エスエスエイチと読みます。

SSHは一つの機能ではなく、サーバー認証・鍵合意・暗号化を行うトランスポート層、利用者を確認する利用者認証プロトコル、暗号化接続を複数チャネルへ分ける接続プロトコルの三段で構成されます。

サーバーのホスト鍵確認と、サーバーへログインする利用者認証は別の確認です。秘密のパスワードや利用者鍵を送る前に、接続先サーバーが期待した相手かを確かめます。

鍵交換とホスト鍵確認で暗号化接続を作り、その内側で利用者を認証する一つの接続を端末、コマンド、SFTP、ローカル・リモート転送の複数チャネルへ分ける
SSHクライアントとサーバーが暗号候補と一時鍵を交換し、保存済みホスト鍵と照合して暗号化トンネルを作り、その後に公開鍵署名またはパスワードで利用者を認証し、一つの接続を端末、コマンド、SFTP、双方向ポート転送チャネルへ分け、鍵を更新する図解
図1図の鍵は役割を表すピクトグラムです。ホスト鍵、利用者鍵、一時鍵、通信鍵は用途と保存期間が異なります。

三つのプロトコル層を順番に成立させる

暗号路を作る段階、利用者を認証する段階、機能チャネルを開く段階を分ける後段の成功は、前段の検証を省略してよい理由にならない
  1. Identify
    版とアルゴリズム候補

    互いの識別文字列と、鍵交換・ホスト鍵・暗号・完全性方式の優先一覧を送る

  2. Exchange
    共有秘密を導出

    一時鍵交換から共有秘密と交換ハッシュを作り、方向別の通信鍵を導く

  3. Host
    サーバーを認証

    ホスト鍵の署名を検証し、期待したホスト名と鍵の対応へ照らす

  4. User
    利用者を認証

    公開鍵署名、パスワードなど、サーバー方針が許す方式で本人を確かめる

  5. Channel
    機能を多重化

    セッション、サブシステム、直接・forwarded TCP/IPなどの論理チャネルを開く

  6. Rekey
    通信鍵を更新

    時間・データ量・方針に応じて再鍵交換し、接続を保ったまま鍵を替える

図2各層には独立したメッセージと失敗理由があります。「認証失敗」がホスト鍵、利用者鍵、権限のどれかをログから切り分けます。

ホスト鍵は、同じ名前のサーバーが前回と同じ相手かを確かめる

初回接続では、クライアントがホスト鍵をまだ知らない場合があります。表示された指紋を管理者が公開した値と別経路で照合する、DNS SSHFPを検証付きで使う、組織のSSHホスト証明書を信頼するなど、信頼の起点を用意します。

TOFU(Trust On First Use/トラスト・オン・ファースト・ユース)は最初に受け入れた鍵をknown_ホストへ保存し、次回から比較する方法です。最初の接続が安全だった保証は別に必要です。ホスト鍵変更の警告を削除だけで済ませず、サーバー再構築・鍵更新の記録と照合します。

鍵交換で通信鍵を作り、ホスト鍵の署名で相手と結び付ける

クライアントとサーバーは対応アルゴリズム一覧から共通方式を選び、Diffie-Hellman系の鍵交換で共有秘密を導きます。サーバーはホスト秘密鍵で交換ハッシュへ署名し、途中の別相手との鍵交換へすり替えられていないことを示します。

アルゴリズム推奨は更新されます。古いssh-rsaのSHA-1署名とRSA鍵そのもの、鍵交換名、暗号方式を混同せず、実装の現行推奨へ合わせます。互換性目的で弱い方式を全接続へ戻さず、更新不能機器を隔離します。

公開鍵認証は、公開鍵を送るだけでなく秘密鍵所持を署名で証明する

サーバーは利用者アカウントへ許可した公開鍵を登録します。クライアントは接続固有のセッション識別子などを含む認証データへ秘密鍵で署名し、サーバーが公開鍵で検証します。秘密鍵そのものをサーバーへ送る方式ではありません。

秘密鍵は端末で暗号化保存し、パスフレーズとOSの鍵保護を使います。鍵を紛失・退職時に取り消せる台帳、用途別鍵、期限付きSSH証明書、多要素認証を組み合わせます。パスワード認証を止めても、盗まれた無期限鍵が残れば安全とは限りません。

セッションチャネルで、端末・単一コマンド・サブシステムを使い分ける

対話シェルでは疑似端末を要求し、画面サイズや環境、標準入出力を扱います。自動処理のexecでは、シェル文字列の解釈、終了ステータス、標準エラーを明示的に処理します。利用者入力をそのままコマンド文字列へ結合しません。

SFTPはサブシステム要求で専用サーバー処理を起動します。シェルを許可せずSFTPだけを許すアカウントも構成できます。チャネルごとのウィンドウで流量を制御し、一つが詰まって接続全体の処理を妨げないよう実装します。

ポート転送は、暗号トンネルの両端から別TCP接続を開く

local forwarding(ローカル・フォワーディング)はクライアント側待受へ来た接続を、SSHサーバー側から目的地へ開きます。remote forwarding(リモート・フォワーディング)はサーバー側で待ち受け、クライアント側から目的地へ接続します。動的転送はSOCKSプロキシとして接続先を都度選びます。

転送はファイアウォール境界を越え得るため、待受アドレス、許可宛先、利用者を制限します。SSH接続が安全でも、トンネル先サービスの認証・権限が自動で安全になるわけではありません。転送先ログとSSH利用者を対応付けます。

エージェント転送は秘密鍵をコピーしないが、署名権限を遠隔へ貸す

SSHエージェントは秘密鍵操作をローカルで行い、アプリへ署名結果だけを返します。エージェント転送を有効にすると、遠隔サーバー上のプロセスが転送ソケット経由で署名を要求できます。秘密鍵ファイルは移りませんが、接続中の署名権限は悪用され得ます。

信頼できない踏み台へ無条件に転送せず、ProxyJump、宛先制約、確認付き署名、短命証明書を使います。ルートログイン、パスワード認証、空パスフレーズ鍵なども、必要性と代替策を決めて制限します。

仕様・推奨の確認資料:RFC 4251「SSH Protocol Architecture」RFC 4252「SSH Authentication Protocol」RFC 4254「SSH Connection Protocol」RFC 9142「SSH Key Exchange Recommendations」

関連用語