SSH接続の流れを徹底解説|ログインまでに行われる処理とは

SSH接続の流れ

SSH接続時に内部で行われる通信の流れを理解しよう

SSH(Secure Shell)は、Linuxサーバやネットワーク機器を安全に管理するための標準的なリモート接続プロトコルです。

普段は「ssh user@server」と入力するだけで接続できますが、その裏側では複数の認証処理や暗号化処理が実行されています。

Linux初心者の方は「SSHは暗号化されている」という知識だけで終わりがちですが、実務ではSSH接続時にどのような処理が行われているのかを理解しておくことが重要です。

接続できないトラブルの調査やセキュリティ設定の理解にも役立つためです。

本記事ではSSHクライアントがサーバへ接続してからログイン完了までの流れを詳しく解説します。

SSH接続の全体像

SSH接続は大きく以下の流れで進行します。

  1. TCP接続の確立
  2. SSHバージョン情報の交換
  3. サーバ認証
  4. 鍵交換(Key Exchange)
  5. 暗号化方式の決定
  6. ユーザー認証
  7. シェルの開始

管理者がログイン画面を見るまでの数秒間に、これだけの処理が行われています。

TCP接続の確立

最初にSSHクライアントはサーバの22番ポートへ接続します。

例えば以下のコマンドを実行した場合です。

$ ssh user@192.168.60.101

クライアントはまずTCPによる3ウェイハンドシェイクを行います。

Client → SYN
Server → SYN/ACK
Client → ACK

この処理が完了するとTCPセッションが確立されます。

ここではまだ暗号化は行われていません。

SSHバージョン情報の交換

TCP接続が確立されると、クライアントとサーバは利用するSSHプロトコルのバージョン情報を交換します。

例えば以下のような情報です。

SSH-2.0-OpenSSH_9.3

現在はSSH Version 2が標準となっています。

SSH Version 1はセキュリティ上の問題があるため、現在の環境ではほとんど利用されていません。

サーバ認証の開始

次に接続先サーバが本物かどうかを確認します。

攻撃者が偽サーバを用意し、利用者を騙そうとする可能性があるためです。

SSHサーバはホスト鍵と呼ばれる公開鍵をクライアントへ提示します。

初回接続時には次のようなメッセージが表示されます。

The authenticity of host can't be established.
Are you sure you want to continue connecting?

これはサーバの公開鍵を確認している状態です。

承認すると公開鍵情報が保存されます。

~/.ssh/known_hosts

以後は保存済みの情報と比較することで、接続先が本物であるか確認できます。

known_hostsの役割

known_hostsはSSHの安全性を支える重要なファイルです。

例えばサーバを再構築した場合や、別のサーバへIPアドレスを割り当てた場合、以下のような警告が表示されることがあります。

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

これは登録済みのホスト鍵と異なるため発生します。

中間者攻撃(Man in the Middle Attack)の可能性もあるため、内容を確認してから対応する必要があります。

鍵交換(Key Exchange)

サーバ認証が完了すると鍵交換処理が行われます。

SSHでは通信を暗号化するために共通鍵を使用します。

しかし、その共通鍵をそのまま送信すると盗聴される可能性があります。

そこで鍵交換アルゴリズムが利用されます。

代表的な方式は以下の通りです。

  • Diffie-Hellman
  • ECDH
  • Curve25519

これらの技術によって実際の鍵を送信せずに共通鍵を生成できます。

これがSSHの安全性を支える重要な技術です。

暗号化方式の決定

鍵交換が完了すると暗号化方式を決定します。

クライアントとサーバは利用可能な暗号方式を交換し、双方が対応しているものを選択します。

現在主流となっている暗号方式は以下です。

  • AES128
  • AES256
  • ChaCha20
  • AES-GCM

以降の通信はすべて暗号化された状態になります。

改ざん検知の設定

暗号化だけでは通信の改ざんを防げません。

そのためSSHではMAC(Message Authentication Code)を利用します。

代表的なアルゴリズムは以下の通りです。

  • HMAC-SHA256
  • HMAC-SHA512

通信内容が途中で変更された場合は検知できます。

これにより安全な通信が実現されています。

ユーザー認証

暗号化通信が確立されるとユーザー認証が始まります。

代表的な認証方式は以下の通りです。

  • パスワード認証
  • 公開鍵認証
  • 多要素認証(MFA)

パスワード認証

最もシンプルな認証方式です。

ユーザー名とパスワードを入力して認証します。

現在では総当たり攻撃対策のため、単独利用は推奨されません。

公開鍵認証

実務で最も利用されている方式です。

利用者は秘密鍵を保持し、サーバには公開鍵を登録します。

サーバ側では以下のファイルに登録されます。

~/.ssh/authorized_keys

秘密鍵を持つ利用者のみ認証できるため、高い安全性を実現できます。

シェルの開始

認証が成功するとSSHサーバはユーザーのログインシェルを起動します。

例えば以下のシェルが利用されます。

  • bash
  • zsh
  • sh

ここで初めて利用者はコマンドを実行できる状態になります。

ログイン後に表示されるメッセージやバナーもこのタイミングで処理されます。

SSH接続を詳細表示する方法

SSHの接続過程を確認したい場合は-vオプションを利用します。

$ ssh -v user@server

さらに詳細な情報を確認したい場合は以下を利用します。

ssh -vv
ssh -vvv

実務では接続障害の調査時によく利用されます。

実務で知っておくべきポイント

SSH接続時の流れを理解していると、トラブルシューティングが容易になります。

例えば以下のような切り分けが可能になります。

  • TCP接続できない → ファイアウォールやネットワークの問題
  • ホスト鍵エラー → known_hostsの問題
  • 認証失敗 → authorized_keysやパスワードの問題
  • 接続直後に切断 → シェル設定やPAMの問題

単に「SSHできない」ではなく、どの段階で失敗しているのか判断できるようになります。

まとめ

SSH接続は単純なログイン処理ではなく、TCP接続、サーバ認証、鍵交換、暗号化方式の決定、ユーザー認証といった複数の工程によって成り立っています。

普段は意識することの少ない処理ですが、SSHの仕組みを理解することでセキュリティの向上や障害対応に役立てることができます。

特にknown_hosts、authorized_keys、鍵交換、公開鍵認証の仕組みは今後のSSH運用でも頻繁に登場するため、しっかり理解しておくことをおすすめします。