SSHの仕組みを完全理解!暗号化通信の裏側を徹底解説

Web

「SSHは安全って聞くけど、なぜ安全なの?」 「パスワードが盗聴されない理由は?」 「鍵認証って、どういう仕組み?」

SSHは暗号化された安全な通信を実現しますが、 その裏側では、かなり賢い仕組みが動いています。

でも大丈夫! この記事を読めば、銀行レベルのセキュリティが どうやって実現されているか完全に理解できます。

難しい数学は使わず、 身近な例えで分かりやすく説明します!


スポンサーリンク

SSHとは?基本をおさらい

SSH = Secure Shell(安全な殻)

SSHの正体:

普通の通信:誰でも覗き見できる「はがき」
SSH通信 :鍵付きの「金庫」で送る手紙

SSHが提供する3つの安全:

機能説明例え
暗号化通信内容を読めなくする手紙を暗号文にする
認証相手が本物か確認身分証明書の確認
改ざん防止内容が変更されていないか確認封印シールの確認

なぜSSHが必要なの?

Telnet(昔の方法)の問題:

あなた:password123 → [平文] → サーバー

悪い人:盗聴中... 「パスワードは password123 か!」

SSH(現在の方法)の安全性:

あなた:password123 → [暗号化:x#k9@!p$] → サーバー

悪い人:盗聴中... 「x#k9@!p$ って何???」

SSH接続の流れを完全解説

全体の流れ(5ステップ)

1. 接続開始
   クライアント「接続したいです!」
     ↓
2. サーバー認証
   サーバー「私は本物のサーバーです(証明書)」
     ↓
3. 暗号化方式の決定
   両者「AES256で暗号化しましょう」
     ↓
4. ユーザー認証
   クライアント「私は正当なユーザーです」
     ↓
5. 安全な通信開始
   両者「OK!暗号化通信を始めましょう」

ステップ1:接続の開始

TCPハンドシェイク:

クライアント:「もしもし(SYN)」
         ↓
サーバー  :「はい、どうぞ(SYN-ACK)」
         ↓
クライアント:「つながりました(ACK)」

バージョン交換:

# クライアントが送信
SSH-2.0-OpenSSH_8.9

# サーバーが返信
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5

ステップ2:サーバー認証(ホスト認証)

サーバーが本物か確認する仕組み:

初回接続時:
「このサーバーのフィンガープリントは xxx です。信頼しますか?」
→ yes と答えると ~/.ssh/known_hosts に保存

2回目以降:
保存されたフィンガープリントと照合
→ 一致すれば本物、違えば警告!

フィンガープリントとは:

  • サーバーの公開鍵のハッシュ値
  • 人間の指紋のように、サーバーごとに固有
  • 偽サーバーは同じフィンガープリントを作れない

ステップ3:暗号化方式の交渉

使用する暗号化アルゴリズムを決定:

クライアント:「私はこれらの暗号化方式が使えます」
- AES256-GCM
- AES128-GCM  
- ChaCha20-Poly1305

サーバー:「私もこれらが使えます」
- AES256-GCM ← これに決定!(最も強力)
- AES192-CBC

鍵交換アルゴリズム(Diffie-Hellman):

魔法のような仕組み:
1. お互いに秘密の数字を持つ
2. 計算結果だけを交換
3. 同じ共通鍵が生成される!
4. 盗聴者は共通鍵を作れない

ステップ4:ユーザー認証

3つの認証方法:

方法1:パスワード認証

クライアント:[暗号化済みトンネル内で]
       「パスワードは ******** です」
サーバー  :「照合... OK!ログイン許可」

方法2:公開鍵認証(推奨)

準備:
1. 鍵ペア生成(秘密鍵 + 公開鍵)
2. 公開鍵をサーバーに登録

認証時:
1. サーバー:「この暗号文を解読してください」
2. クライアント:[秘密鍵で署名]
3. サーバー:[公開鍵で検証]「本人確認OK!」

方法3:証明書認証(企業向け)

認証局(CA)が発行した証明書を使用
→ より厳格な本人確認

ステップ5:セッション確立と暗号化通信

セッション鍵で高速暗号化:

すべてのデータが暗号化:
- コマンド入力:ls -la → #x9!@k$
- 実行結果  :file.txt → &y2#p@!
- すべて暗号化された状態で送受信

暗号化技術の詳しい解説

対称鍵暗号と非対称鍵暗号

対称鍵暗号(共通鍵暗号):

同じ鍵で暗号化・復号化
例:南京錠(同じ鍵で開け閉め)

メリット:高速
デメリット:鍵の受け渡しが危険
用途:実際のデータ通信

非対称鍵暗号(公開鍵暗号):

異なる鍵で暗号化・復号化
例:郵便ポスト(誰でも入れられるが、鍵を持つ人だけ取り出せる)

メリット:鍵の配布が安全
デメリット:処理が遅い
用途:認証、鍵交換

SSHが使う暗号化アルゴリズム

暗号化アルゴリズム:

名前強度速度説明
AES-256⭐⭐⭐⭐⭐⭐⭐⭐最も安全
AES-128⭐⭐⭐⭐⭐⭐⭐⭐バランス良好
ChaCha20⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐モバイル向け
3DES⭐⭐古い(非推奨)

ハッシュアルゴリズム:

  • SHA-256:改ざん検出
  • SHA-512:より強力
  • MD5:古い(使用禁止)

公開鍵認証の仕組みを深掘り

鍵ペアの生成

ssh-keygen -t ed25519

生成される2つの鍵:

秘密鍵(id_ed25519):
- 絶対に他人に見せない
- パスフレーズで保護
- 金庫の鍵のようなもの

公開鍵(id_ed25519.pub):
- サーバーに登録
- 公開してもOK
- 金庫の錠前のようなもの

なぜ公開鍵認証が安全なのか

数学的な仕組み(簡略版):

1. 巨大な素数の掛け算は簡単
   73 × 97 = 7081(一瞬)

2. でも素因数分解は超困難
   7081 = ? × ?(時間がかかる)

3. この性質を利用して:
   - 秘密鍵:素数のペア
   - 公開鍵:掛け算の結果

実際の認証フロー:

1. サーバー:乱数を生成「12345」
2. サーバー:公開鍵で暗号化「x#k@!」
3. クライアント:秘密鍵で復号「12345」
4. クライアント:返送
5. サーバー:一致を確認→認証成功!

SSHの脆弱性と対策

よくある攻撃手法

1. ブルートフォース攻撃:

攻撃者:password1 → 失敗
攻撃者:password2 → 失敗
攻撃者:password3 → 失敗
(延々と続く)

対策:
- 強いパスワード
- fail2ban導入
- 鍵認証のみに

2. 中間者攻撃(MITM):

本来:クライアント ← → サーバー
攻撃:クライアント ← → 攻撃者 ← → サーバー

対策:
- known_hostsの確認
- フィンガープリント検証

3. 古い暗号化方式の悪用:

古いSSHv1は脆弱性あり

対策:
- SSHv2のみ使用
- 最新版にアップデート

ポートフォワーディングの仕組み

ローカルフォワード

ssh -L 8080:localhost:80 user@server

仕組み:

ローカル:8080 → [SSH暗号化トンネル] → サーバー:80

使用例:
ブラウザで localhost:8080 にアクセス
→ 実際はサーバーの80番ポートに接続

リモートフォワード

ssh -R 9090:localhost:3000 user@server

仕組み:

サーバー:9090 → [SSH暗号化トンネル] → ローカル:3000

使用例:
ローカル開発環境を外部に公開

動的フォワード(SOCKSプロキシ)

ssh -D 1080 user@server

仕組み:

すべての通信をSSH経由に
→ VPNのような使い方

SSHエージェントの仕組み

ssh-agentとは

秘密鍵を安全に管理:

通常:毎回パスフレーズ入力
エージェント使用:1回入力すれば記憶

仕組み:
1. ssh-agentがメモリ上で秘密鍵を管理
2. SSHクライアントは署名を要求
3. エージェントが代理で署名

エージェントフォワーディング

ssh -A user@bastion

多段SSH接続を簡単に:

ローカル → 踏み台 → 目的サーバー
(秘密鍵はローカルのみに保存)

SSHプロトコルのレイヤー構造

3層構造

アプリケーション層
   ↓
┌─────────────────┐
│ 接続層     │ チャンネル多重化
├─────────────────┤
│ 認証層     │ ユーザー認証
├─────────────────┤
│ トランスポート層│ 暗号化・圧縮
└─────────────────┘
   ↓
TCP/IP層

各層の役割:

  1. トランスポート層:
    • 暗号化
    • データ圧縮
    • サーバー認証
  2. 認証層:
    • ユーザー認証
    • 認証方法の交渉
  3. 接続層:
    • 複数チャンネル管理
    • ポートフォワード
    • X11転送

パフォーマンスとセキュリティのバランス

暗号化方式の選択

速度重視:

ssh -c aes128-gcm@openssh.com user@server

セキュリティ重視:

ssh -c chacha20-poly1305@openssh.com user@server

圧縮の活用

# 低速回線では圧縮が有効
ssh -C user@server

# 高速回線では圧縮不要
ssh -o Compression=no user@server

まとめ:SSHが安全な理由

SSHの安全性を支える技術:

強力な暗号化

  • 通信内容が盗聴されても解読不可能

確実な認証

  • なりすましを防ぐ複数の仕組み

改ざん検知

  • データが変更されたら即座に検出

前方秘匿性

  • 過去の通信は解読できない

SSHは30年以上の歴史を持ち、 世界中のエンジニアに信頼されています。

この仕組みを理解することで、 より安全にSSHを活用できるようになります!

安全は技術と理解から生まれます。


コメント

タイトルとURLをコピーしました