Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第1章 SSHの基本概念と仕組み

SSH とは何か

SSH(Secure Shell、セキュアシェル)は、ネットワークでつながった離れた場所にあるコンピュータ(サーバ)に安全に接続し、コマンド操作やファイル転送を行うためのプロトコル(通信規格)です。

インターネットや社内ネットワークなどの信頼できない経路を通じても、通信内容全体が暗号化されるため、第三者にデータを盗み見られたり改ざんされたりする危険を防ぐことができます。

現在、Unix/Linux や Windows、macOS などの多くの OS で、事実上の標準管理ツールとして広く利用されています。

平文通信の危険性と SSH の登場

SSH が登場する以前は、リモート接続に Telnet や rlogin、ファイル転送に FTP といったプロトコルが使用されていました。

しかし、これらの古いプロトコルは通信データを一切暗号化せず、そのままの平文(プレーンテキスト)で送信する仕様でした。

同一ネットワーク上に悪意を持つ第三者が存在した場合、パケット盗聴ツールを用いることで、送信されたパスワードや重要な業務データが容易に読み取られてしまう重大なセキュリティ上の脆弱性がありました。

SSH は、認証情報(ユーザー名やパスワード)だけでなく、送受信されるすべてのコマンドや出力データを強力に暗号化することで、安全なリモート通信を実現しました。

公開鍵暗号方式による認証の仕組み

SSH の安全性を支える中核技術が「公開鍵暗号方式」です。 公開鍵暗号方式では、数学的に対となる 2 つの鍵(キーペア)を生成して認証を行います。

  • 公開鍵(Public Key):

    誰に見られても安全な鍵です。南京錠(ロック)に例えられます。接続先となるサーバ側に事前に登録しておきます。

  • 秘密鍵(Private Key):

    作成者本人だけが厳重に保管しなければならない鍵です。南京錠を開ける本物の鍵に例えられます。外部に漏洩してはいけません。

認証の際、サーバは手持ちの「公開鍵」を使って暗号化された課題(チャレンジ)を作成してクライアントへ送信します。 クライアントは自分だけが持つ「秘密鍵」を使ってこの課題を復号(解決)して送り返すことで、パスワードをネットワーク上に一切流すことなく、正当な本人であることを証明します。

[クライアント (手元 PC)]                        [SSH サーバ]
      │                                             │
      │ 1. 接続要求 (ユーザー名)                    │
      ├────────────────────────────────────────────>│
      │                                             │
      │ 2. チャレンジ送信 (公開鍵で暗号化したデータ)│
      │<────────────────────────────────────────────┤ (authorized_keys の公開鍵を使用)
      │                                             │
      │ 3. 秘密鍵で復号して署名を作成               │
      │                                             │
      │ 4. 署名(解答)を返送                       │
      ├────────────────────────────────────────────>│
      │                                             │ 5. 署名を検証し、
      │ 6. 認証成功・通信開始                       │    本人と確認
      │<────────────────────────────────────────────┤

ホスト認証と中間者攻撃の防御

公開鍵認証によってユーザーの身元が確認されますが、逆に「接続しようとしているサーバが、偽物の悪意あるサーバではないか」を確認する仕組みも必要です。これを ホスト認証 と呼びます。

サーバは固有の「ホスト鍵」を持っており、クライアントが初めて接続する際、サーバの公開鍵情報(フィンガープリント)が提示されます。

The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:7v6hX2k...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

利用者が yes と答えると、そのサーバの情報がクライアント側の ~/.ssh/known_hosts というファイルに記録されます。

次回以降の接続では、保存されたホスト情報と自動的に照合されます。もし攻撃者が通信の途中に割り込み、偽のサーバへ誘導しようとする「中間者攻撃(Man-in-the-Middle 攻撃)」が発生した場合、ホスト鍵の不一致が検出され、警告画面が表示されて接続が即座に中断されます。

暗号鍵の暗号化(パスフレーズ)

秘密鍵は手元の PC にファイルとして保存されます。 万が一、PC の紛失やマルウェアへの感染によって秘密鍵ファイルが第三者の手に渡った場合に備え、秘密鍵自体に「パスフレーズ」を設定して保護することができます。

パスフレーズを設定すると、秘密鍵ファイルは強力な暗号で保護され、鍵を利用するたびにパスフレーズの入力が求められるようになります。

これにより、「秘密鍵ファイルを持っていること(所持情報)」と「パスフレーズを知っていること(記憶情報)」の二要素による強固なセキュリティが成立します。