FE EXAM

SSH(暗号化リモート操作プロトコル)

通信を暗号化して遠隔地の機器を安全に操作するプロトコル。

DIAGRAM
クライアント
サーバ
暗号化された通信
クライアント手元のPC(操作する側)$ ssh user@serverコマンドを入力暗号化トンネル盗み見ても解読できないコマンド送信結果を返すサーバ遠隔地の機器(操作される側)コマンドを実行結果を返す盗聴者暗号文しか見えない手元のPCから遠隔地のサーバへ、暗号化された通信路でコマンドを送り操作する。途中で盗聴されても暗号文のままで読み取れない。
解説

📌
SSHとは

遠くのサーバを手元から安全に操作手元PC暗号化サーバ

SSH(Secure Shell=セキュアシェル)とは、通信を暗号化して遠隔地の機器を安全に操作するプロトコルです。プロトコル=機器同士が通信するときの決まりごとのことです。

サーバの管理者は、離れた場所にあるサーバへ手元のPCから命令(コマンド)を送って操作します。このとき通信を暗号化することで、途中でデータを盗み見られても内容が読み取れないようにします。上の図解の真ん中が、その暗号化された通信路です。

身近な例で考えると、中身が見えない封筒で手紙をやりとりするのに似ています。配達の途中で誰かが封筒を手に取っても、開けられず中身が読めないので、安心して大事な指示を送れるのです。

📌
暗号化の仕組み

そもそも「暗号化」って何?

「こんにちは」平文(生の文)鍵で変換X7$kQ9!ma暗号文(読めない)鍵で戻す「こんにちは」平文に戻る鍵を使って「読めない形」に変換 → 戻すのも鍵鍵を持っていない人には「X7$kQ9!ma」のままで意味不明

暗号化とは、「鍵」と呼ばれる数字(または文字列)を使って、元の文を読めない形に変換することです。変換後の文を「暗号文」、元の文を「平文(ひらぶん)」と呼びます。

例えば「こんにちは」を鍵で変換すると「X7$kQ9!ma」のような意味不明な文字列になります。これを元の「こんにちは」に戻すことを復号と呼び、復号にも鍵が必要です。鍵を持っていない人には暗号文のまま読めません。これが暗号化の基本です。

鍵の種類は2つある

① 共通鍵暗号 — 鍵が1本(同じ鍵を2人で共有)Aさん🔑Bさん🔑同じ鍵で暗号化 / 復号② 公開鍵暗号 — 鍵が2本ペア(公開用 + 秘密用)Aさん🔓公開Bさん🔐秘密公開鍵で暗号化 → 秘密鍵で復号

暗号化に使う鍵には大きく分けて「共通鍵暗号」「公開鍵暗号」の2方式があります。それぞれ得意・不得意があり、SSHはこの2つを組み合わせて使います。

① 共通鍵暗号:両者が「全く同じ1本の鍵」を持ち、その鍵で暗号化も復号もする方式です。処理がとても速いので大量のデータを暗号化するのに向いていますが、相手にこの鍵をどうやって渡すかが問題になります。鍵をそのままインターネットに流したら、それを盗まれて暗号文も読まれてしまうからです。
・例えるなら合鍵が必要な貸金庫。同じ鍵を持っていれば開けて中身を読める。鍵を相手に渡すときに盗まれないようにする必要がある

② 公開鍵暗号2本でペアになった鍵を使う方式です。1本は誰に見せてもよい「公開鍵」、もう1本は本人だけが持つ「秘密鍵」。公開鍵で暗号化したものは、対になる秘密鍵でしか復号できません。鍵を直接渡さなくてよいので安全ですが、処理が重く(共通鍵の数百〜千倍遅い)、大量のデータには向きません。
・例えるなら南京錠と鍵。Bさんは「開いた南京錠(公開鍵)」を世界中に配ってもよく、Aさんはそれで荷物に鍵をかけて送る。Bさんしか持っていない「鍵本体(秘密鍵)」でだけ開けられる

SSHでの組み合わせ方

① 公開鍵暗号で鍵交換共通鍵を安全に受け渡す重い処理だが1回だけ② 共通鍵暗号で通信以降すべてのやりとりを暗号化高速・繰り返し鍵交換だけ「安全」、本番通信は「速い」 — いいとこ取りこれを「ハイブリッド暗号」と呼ぶSSH / TLS(HTTPS)など多くのプロトコルで採用

なぜ SSH では2種類を組み合わせる必要があるのか。整理すると次の課題があります。
・共通鍵暗号は速いが、最初に鍵を相手にどうやって渡すかが難しい
・公開鍵暗号は鍵を安全に渡せるが、処理が重く大量のデータには向かない

SSH は両者の良いとこ取りをします。最初の接続時だけ公開鍵暗号を使って「共通鍵」を安全に取り決め、それ以降のすべての通信は速い共通鍵暗号で暗号化します。この「最初は安全に、本番は速く」の2段構えをハイブリッド暗号と呼びます。SSH 以外にも HTTPS(TLS)など多くの暗号通信プロトコルで採用されている定番の方式です。

接続から通信開始までの流れは次のようになります。
① 鍵交換:公開鍵暗号を使い、「共通鍵」を相手と安全に取り決める(重いが1回だけ)
② 認証:パスワードや公開鍵で「本当に正しい利用者か」を確認する
③ 通信:以降は高速な共通鍵暗号で、すべての文字や操作を暗号化して送る

身近な例で考えると、受付で身分証を見せて入館証をもらい(① 鍵交換 + ② 認証)、館内は入館証だけでスムーズに動ける(③ 高速な通常通信)のに似ています。受付の手続きは厳重でも、入ってしまえば毎回の手続きは要らず、スピーディに行動できるのと同じ考え方です。

📌
Telnetとの違い

Telnet(テルネット)は、SSHと同じく遠隔地の機器を操作する古いプロトコルですが、通信を暗号化しません。両者の違いを整理します。

項目SSHTelnet
暗号化あり(安全)なし(平文)
パスワード暗号化して送るそのまま流れる
盗聴への耐性強い弱い
主な用途現在の標準現在はほぼ使われない

Telnetは入力したパスワードまでそのまま(平文で)ネットワークに流れてしまうため、盗聴されると簡単に情報を読み取られてしまいます。

Telnetがはがきのように誰でも内容を読める通信だとすれば、SSHは封をした手紙のような通信です。同じ「遠隔操作」でも安全性が大きく違うため、現在はSSHが標準として使われています。

📌
公開鍵認証の仕組み

そもそも「認証」って何?

暗号化「通信の中身を読めなくする」盗み見られても意味が分からない認証「相手が本物の本人か確かめる」なりすましを防ぐ

認証とは、「アクセスしてきた相手が本物の本人かを確かめる」仕組みです。よく混同される暗号化(通信の中身を読めなくする)とは別の役割で、SSH では両方が必要です。

例えば暗号化だけだと「中身は読めないけれど、誰でも接続できてしまう」状態になります。サーバを操作するには「あなたは本当に管理者の山田さん本人ですか?」を必ず確認する必要があり、それが認証です。SSH での認証方法は主にパスワード認証公開鍵認証の 2 つで、より安全な後者がよく使われます。

公開鍵認証で使う「2つの鍵」

ssh-keygen でペアを作成 → 公開鍵だけサーバに登録手元PC🔐秘密鍵本人だけが持つ絶対に外に出さないid_rsa公開鍵をコピー1回だけサーバ🔓公開鍵誰に見られてもOK事前に登録しておくauthorized_keys

公開鍵認証では、数学的にペアになった2本の鍵を使います。手元のPCでssh-keygenというコマンドを使うと、この2本のペアを一度に生成できます。
🔐 秘密鍵(id_rsa):作成した本人だけが持つ鍵。絶対にPCの外に出してはいけない
🔓 公開鍵(id_rsa.pub):相手のサーバに渡しておく鍵。誰に見られても問題ない

ペアの鍵の不思議な性質:この 2 本は数学的に結びついていて、片方で「署名」したものは、もう片方でしか確認できません。さらに、公開鍵から秘密鍵を逆算することは現実的にできません(解くのに数千年かかる計算問題になるよう作られている)。だから公開鍵は世界中にバラまいても安全で、秘密鍵は手元に置いておくだけで本人の証明に使えます。

例えるなら印鑑(はんこ)と印影のような関係です。印鑑(秘密鍵)は本人だけが持ち、押した跡(署名)は誰が見ても「あ、これは山田さんの印影だ」と判別できます。でも印影だけ見ても元の印鑑を作り直すことはできません。

実際の認証手順 ─ チャレンジ&レスポンス

手元PCサーバ① ログインしたい(接続要求)② ランダムな数字を送る(チャレンジ)③ 秘密鍵で署名を作る④ 署名を送る⑤ 公開鍵で署名を検証⑥ 一致!ログイン許可

公開鍵認証はチャレンジ&レスポンス方式と呼ばれる手順で本人確認をします。「サーバが出した問題に、秘密鍵を持っている本人だけが正しく答えられる」という仕組みです。

ステップを 1 つずつ追うとこうなります。
① 接続要求:手元PCがサーバに「山田としてログインしたい」と要求する
② チャレンジ送信:サーバは毎回ランダムな数字を作って手元PCへ送る(「これに署名できる?」という問題)
③ 署名作成:手元PCは受け取ったランダム数字を秘密鍵で署名する(このとき秘密鍵は手元PCから一歩も出ない)
④ 署名送信:作った署名だけをサーバへ送り返す
⑤ 検証:サーバは事前に登録された公開鍵で署名を検証。「この署名は山田さんの秘密鍵で作られたものだ」と確認できる
⑥ 結果:一致すれば本人と認められログイン許可、一致しなければ拒否

毎回ランダムな数字を使うのが肝です。もし同じチャレンジが繰り返されたら、過去の署名を盗み見て使い回すリプレイ攻撃が成立してしまいます。毎回違う問題を出すことで、過去の署名は二度と使えないようになります。

なぜパスワード認証より安全なのか

パスワード認証と公開鍵認証を 4 つの観点で比べると、公開鍵認証の安全性の高さが見えてきます。

観点パスワード認証公開鍵認証
何を送る?合言葉そのもの(暗号化されるが送る)署名だけ(秘密鍵は送らない)
推測される可能性あり(短いと総当たり攻撃で破られる)ほぼゼロ(鍵が長すぎて計算不能)
使い回しのリスク同じパスワードを他サービスで使うと連鎖被害鍵ごとに独立、サービスごとに使い分け可能
サーバ側に残るものハッシュ化された合言葉(漏洩リスクあり)公開鍵(漏れても問題なし)

特に重要なのが「秘密鍵がネットワークに一歩も出ない」点です。パスワード認証はどんなに暗号化しても「合言葉自体」を送るので、サーバが乗っ取られたり通信路に隙があれば情報が漏れる可能性があります。公開鍵認証では本人確認の素材になる秘密鍵そのものは手元から動かないので、原理的に盗まれる経路がありません。

実際のセットアップ手順

公開鍵認証を使い始めるには、たった 2 つのコマンドを実行するだけです。

# ① 手元PCで鍵ペアを作る
$ ssh-keygen -t ed25519
→ ~/.ssh/id_ed25519(秘密鍵)と ~/.ssh/id_ed25519.pub(公開鍵)が生成される
# ② サーバに公開鍵を登録する
$ ssh-copy-id user@server
→ 公開鍵がサーバの ~/.ssh/authorized_keys に追記される
# ③ 以降はパスワード不要でログインできる
$ ssh user@server

セットアップ後は、ログインのたびに自動的に手元の秘密鍵で署名が作られ、サーバ側の公開鍵で検証されます。利用者は何も意識する必要がありません。体感的には「パスワードを聞かれずすぐ繋がる」だけで、その裏でチャレンジ&レスポンスが瞬時に実行されているのです。

注意点:秘密鍵ファイル(id_ed25519)は絶対に他人に見せたりGitHubなどに公開してはいけません。これが漏れると、その鍵を登録した全てのサーバへ誰でもログインできるようになってしまいます。さらに安全性を高めるため、秘密鍵自体にパスフレーズ(鍵を守るパスワード)を設定するのが推奨されます。

📌
SSHのポート番号と接続手順

手元PC22SSH番ポートサーバSSHは必ず22番ポートに接続する(ウェルノウンポート)

SSHはサーバのポート番号22番に接続します。ポート番号とは、1台の機器の中でどのアプリへ通信を届けるかを示す番号で、SSHの22番はあらかじめ世界で共通して決まっているウェルノウンポート(=主要なサービス向けに予約された番号)です。

接続の手順を大まかに並べると次のようになります。
① 接続要求:手元PCがサーバの22番ポートに「つなぎたい」と要求を送る
② 鍵交換:双方が暗号の鍵を安全に取り決め、以降の通信を暗号化する準備をする
③ 認証:パスワードまたは公開鍵でサーバが「本当に正しい利用者か」を確認する
④ 操作:認証が通るとコマンド(=指示)を入力でき、サーバを遠隔操作できる状態になる

①〜③の仕組みのおかげで、正しい利用者しかサーバを操作できず、かつ通信の中身は盗み見ても解読できない状態が保たれます。身近な例で考えると、暗証番号付きのドアから入り、さらに部屋でIDカードを確認してから仕事が始まるのに似た二重の安全確認です。

📌
なぜSSHが必要なのか

手元PCサーバ平文丸見え盗聴者が読める手元PCサーバ暗号化済み盗んでも解読不能

SSHが登場する前、遠隔操作にはTelnet(テルネット)というプロトコルが使われていました。Telnetは通信を暗号化しないため、パスワードを含むすべての内容が「平文(=暗号化されていない生のテキスト)」のままネットワークに流れます。

なぜこれが危険なのか。インターネットは世界中のネットワーク機器を経由して通信を届けます。その途中でパケット(=通信データの小さなかたまり)を盗み見る「盗聴(パケットキャプチャ)」が可能です。Telnetなら盗んだパケットをそのまま読めばパスワードが分かってしまいます。
・Telnetのパスワード:そのままネットワークに流れる → 盗聴されたら即バレ
・SSHのパスワード:暗号化して流れる → 盗んでも解読できない

身近な例で考えると、Telnetは声に出して暗証番号を言うようなものです。周りに誰かいれば聞かれてしまいます。SSHは暗号化された文字でこっそりメモを渡すようなもので、盗み見されても意味が分かりません。こうした理由から、サーバの遠隔操作では現在ほぼすべての場面でSSHが使われています。

📝
練習問題

Q1.SSHの役割として最も適切なものはどれか。

Q2.SSHの暗号化の仕組みに関する記述として適切なものはどれか。

Q3.SSHとTelnetの違いとして適切なものはどれか。

関連コンテンツ