通信を暗号化して遠隔地の機器を安全に操作するプロトコル。
SSH(Secure Shell=セキュアシェル)とは、通信を暗号化して遠隔地の機器を安全に操作するプロトコルです。プロトコル=機器同士が通信するときの決まりごとのことです。
サーバの管理者は、離れた場所にあるサーバへ手元のPCから命令(コマンド)を送って操作します。このとき通信を暗号化することで、途中でデータを盗み見られても内容が読み取れないようにします。上の図解の真ん中が、その暗号化された通信路です。
身近な例で考えると、中身が見えない封筒で手紙をやりとりするのに似ています。配達の途中で誰かが封筒を手に取っても、開けられず中身が読めないので、安心して大事な指示を送れるのです。
暗号化とは、「鍵」と呼ばれる数字(または文字列)を使って、元の文を読めない形に変換することです。変換後の文を「暗号文」、元の文を「平文(ひらぶん)」と呼びます。
例えば「こんにちは」を鍵で変換すると「X7$kQ9!ma」のような意味不明な文字列になります。これを元の「こんにちは」に戻すことを復号と呼び、復号にも鍵が必要です。鍵を持っていない人には暗号文のまま読めません。これが暗号化の基本です。
暗号化に使う鍵には大きく分けて「共通鍵暗号」と「公開鍵暗号」の2方式があります。それぞれ得意・不得意があり、SSHはこの2つを組み合わせて使います。
① 共通鍵暗号:両者が「全く同じ1本の鍵」を持ち、その鍵で暗号化も復号もする方式です。処理がとても速いので大量のデータを暗号化するのに向いていますが、相手にこの鍵をどうやって渡すかが問題になります。鍵をそのままインターネットに流したら、それを盗まれて暗号文も読まれてしまうからです。
・例えるなら合鍵が必要な貸金庫。同じ鍵を持っていれば開けて中身を読める。鍵を相手に渡すときに盗まれないようにする必要がある
② 公開鍵暗号:2本でペアになった鍵を使う方式です。1本は誰に見せてもよい「公開鍵」、もう1本は本人だけが持つ「秘密鍵」。公開鍵で暗号化したものは、対になる秘密鍵でしか復号できません。鍵を直接渡さなくてよいので安全ですが、処理が重く(共通鍵の数百〜千倍遅い)、大量のデータには向きません。
・例えるなら南京錠と鍵。Bさんは「開いた南京錠(公開鍵)」を世界中に配ってもよく、Aさんはそれで荷物に鍵をかけて送る。Bさんしか持っていない「鍵本体(秘密鍵)」でだけ開けられる
なぜ SSH では2種類を組み合わせる必要があるのか。整理すると次の課題があります。
・共通鍵暗号は速いが、最初に鍵を相手にどうやって渡すかが難しい
・公開鍵暗号は鍵を安全に渡せるが、処理が重く大量のデータには向かない
SSH は両者の良いとこ取りをします。最初の接続時だけ公開鍵暗号を使って「共通鍵」を安全に取り決め、それ以降のすべての通信は速い共通鍵暗号で暗号化します。この「最初は安全に、本番は速く」の2段構えをハイブリッド暗号と呼びます。SSH 以外にも HTTPS(TLS)など多くの暗号通信プロトコルで採用されている定番の方式です。
接続から通信開始までの流れは次のようになります。
・① 鍵交換:公開鍵暗号を使い、「共通鍵」を相手と安全に取り決める(重いが1回だけ)
・② 認証:パスワードや公開鍵で「本当に正しい利用者か」を確認する
・③ 通信:以降は高速な共通鍵暗号で、すべての文字や操作を暗号化して送る
身近な例で考えると、受付で身分証を見せて入館証をもらい(① 鍵交換 + ② 認証)、館内は入館証だけでスムーズに動ける(③ 高速な通常通信)のに似ています。受付の手続きは厳重でも、入ってしまえば毎回の手続きは要らず、スピーディに行動できるのと同じ考え方です。
Telnet(テルネット)は、SSHと同じく遠隔地の機器を操作する古いプロトコルですが、通信を暗号化しません。両者の違いを整理します。
| 項目 | SSH | Telnet |
|---|---|---|
| 暗号化 | あり(安全) | なし(平文) |
| パスワード | 暗号化して送る | そのまま流れる |
| 盗聴への耐性 | 強い | 弱い |
| 主な用途 | 現在の標準 | 現在はほぼ使われない |
Telnetは入力したパスワードまでそのまま(平文で)ネットワークに流れてしまうため、盗聴されると簡単に情報を読み取られてしまいます。
Telnetがはがきのように誰でも内容を読める通信だとすれば、SSHは封をした手紙のような通信です。同じ「遠隔操作」でも安全性が大きく違うため、現在はSSHが標準として使われています。
認証とは、「アクセスしてきた相手が本物の本人かを確かめる」仕組みです。よく混同される暗号化(通信の中身を読めなくする)とは別の役割で、SSH では両方が必要です。
例えば暗号化だけだと「中身は読めないけれど、誰でも接続できてしまう」状態になります。サーバを操作するには「あなたは本当に管理者の山田さん本人ですか?」を必ず確認する必要があり、それが認証です。SSH での認証方法は主にパスワード認証と公開鍵認証の 2 つで、より安全な後者がよく使われます。
公開鍵認証では、数学的にペアになった2本の鍵を使います。手元のPCでssh-keygenというコマンドを使うと、この2本のペアを一度に生成できます。
・🔐 秘密鍵(id_rsa):作成した本人だけが持つ鍵。絶対にPCの外に出してはいけない
・🔓 公開鍵(id_rsa.pub):相手のサーバに渡しておく鍵。誰に見られても問題ない
ペアの鍵の不思議な性質:この 2 本は数学的に結びついていて、片方で「署名」したものは、もう片方でしか確認できません。さらに、公開鍵から秘密鍵を逆算することは現実的にできません(解くのに数千年かかる計算問題になるよう作られている)。だから公開鍵は世界中にバラまいても安全で、秘密鍵は手元に置いておくだけで本人の証明に使えます。
例えるなら印鑑(はんこ)と印影のような関係です。印鑑(秘密鍵)は本人だけが持ち、押した跡(署名)は誰が見ても「あ、これは山田さんの印影だ」と判別できます。でも印影だけ見ても元の印鑑を作り直すことはできません。
公開鍵認証はチャレンジ&レスポンス方式と呼ばれる手順で本人確認をします。「サーバが出した問題に、秘密鍵を持っている本人だけが正しく答えられる」という仕組みです。
ステップを 1 つずつ追うとこうなります。
・① 接続要求:手元PCがサーバに「山田としてログインしたい」と要求する
・② チャレンジ送信:サーバは毎回ランダムな数字を作って手元PCへ送る(「これに署名できる?」という問題)
・③ 署名作成:手元PCは受け取ったランダム数字を秘密鍵で署名する(このとき秘密鍵は手元PCから一歩も出ない)
・④ 署名送信:作った署名だけをサーバへ送り返す
・⑤ 検証:サーバは事前に登録された公開鍵で署名を検証。「この署名は山田さんの秘密鍵で作られたものだ」と確認できる
・⑥ 結果:一致すれば本人と認められログイン許可、一致しなければ拒否
毎回ランダムな数字を使うのが肝です。もし同じチャレンジが繰り返されたら、過去の署名を盗み見て使い回すリプレイ攻撃が成立してしまいます。毎回違う問題を出すことで、過去の署名は二度と使えないようになります。
パスワード認証と公開鍵認証を 4 つの観点で比べると、公開鍵認証の安全性の高さが見えてきます。
| 観点 | パスワード認証 | 公開鍵認証 |
|---|---|---|
| 何を送る? | 合言葉そのもの(暗号化されるが送る) | 署名だけ(秘密鍵は送らない) |
| 推測される可能性 | あり(短いと総当たり攻撃で破られる) | ほぼゼロ(鍵が長すぎて計算不能) |
| 使い回しのリスク | 同じパスワードを他サービスで使うと連鎖被害 | 鍵ごとに独立、サービスごとに使い分け可能 |
| サーバ側に残るもの | ハッシュ化された合言葉(漏洩リスクあり) | 公開鍵(漏れても問題なし) |
特に重要なのが「秘密鍵がネットワークに一歩も出ない」点です。パスワード認証はどんなに暗号化しても「合言葉自体」を送るので、サーバが乗っ取られたり通信路に隙があれば情報が漏れる可能性があります。公開鍵認証では本人確認の素材になる秘密鍵そのものは手元から動かないので、原理的に盗まれる経路がありません。
公開鍵認証を使い始めるには、たった 2 つのコマンドを実行するだけです。
セットアップ後は、ログインのたびに自動的に手元の秘密鍵で署名が作られ、サーバ側の公開鍵で検証されます。利用者は何も意識する必要がありません。体感的には「パスワードを聞かれずすぐ繋がる」だけで、その裏でチャレンジ&レスポンスが瞬時に実行されているのです。
注意点:秘密鍵ファイル(id_ed25519)は絶対に他人に見せたりGitHubなどに公開してはいけません。これが漏れると、その鍵を登録した全てのサーバへ誰でもログインできるようになってしまいます。さらに安全性を高めるため、秘密鍵自体にパスフレーズ(鍵を守るパスワード)を設定するのが推奨されます。
SSHはサーバのポート番号22番に接続します。ポート番号とは、1台の機器の中でどのアプリへ通信を届けるかを示す番号で、SSHの22番はあらかじめ世界で共通して決まっているウェルノウンポート(=主要なサービス向けに予約された番号)です。
接続の手順を大まかに並べると次のようになります。
・① 接続要求:手元PCがサーバの22番ポートに「つなぎたい」と要求を送る
・② 鍵交換:双方が暗号の鍵を安全に取り決め、以降の通信を暗号化する準備をする
・③ 認証:パスワードまたは公開鍵でサーバが「本当に正しい利用者か」を確認する
・④ 操作:認証が通るとコマンド(=指示)を入力でき、サーバを遠隔操作できる状態になる
①〜③の仕組みのおかげで、正しい利用者しかサーバを操作できず、かつ通信の中身は盗み見ても解読できない状態が保たれます。身近な例で考えると、暗証番号付きのドアから入り、さらに部屋でIDカードを確認してから仕事が始まるのに似た二重の安全確認です。
SSHが登場する前、遠隔操作にはTelnet(テルネット)というプロトコルが使われていました。Telnetは通信を暗号化しないため、パスワードを含むすべての内容が「平文(=暗号化されていない生のテキスト)」のままネットワークに流れます。
なぜこれが危険なのか。インターネットは世界中のネットワーク機器を経由して通信を届けます。その途中でパケット(=通信データの小さなかたまり)を盗み見る「盗聴(パケットキャプチャ)」が可能です。Telnetなら盗んだパケットをそのまま読めばパスワードが分かってしまいます。
・Telnetのパスワード:そのままネットワークに流れる → 盗聴されたら即バレ
・SSHのパスワード:暗号化して流れる → 盗んでも解読できない
身近な例で考えると、Telnetは声に出して暗証番号を言うようなものです。周りに誰かいれば聞かれてしまいます。SSHは暗号化された文字でこっそりメモを渡すようなもので、盗み見されても意味が分かりません。こうした理由から、サーバの遠隔操作では現在ほぼすべての場面でSSHが使われています。
Q1.SSHの役割として最も適切なものはどれか。
Q2.SSHの暗号化の仕組みに関する記述として適切なものはどれか。
Q3.SSHとTelnetの違いとして適切なものはどれか。