SSHとは?仕組みを図解で説明〜接続の流れと公開鍵認証〜

「SSH」知っていますか?「サーバにSSHで入って」と言われて、何が起きているのか説明できますか?

初めて接続した時に出てくる英語のメッセージに、とりあえず「yes」と答えている人もいるのではないでしょうか。

SSHの仕組みと、新人のうちに気をつけたいことについて、図を使って説明していきます。

目次
  1. SSHとは?
  2. SSHの役割とTelnetとの違い
  3. SSHの接続の流れ
    1. 鍵交換(②)
    2. サーバ認証とknown_hosts(③)
  4. パスワード認証と公開鍵認証の違い
  5. 公開鍵認証の仕組み
  6. よく使うコマンド
    1. サーバに接続する(ssh)
    2. 鍵のペアを作る(ssh-keygen)
    3. ファイルを転送する(scp、sftp)
  7. 新人が気をつけること
    1. 初回接続の警告の意味
    2. 秘密鍵の扱い
    3. パスフレーズを付ける
  8. まとめ

SSHとは?

SSH(Secure Shell)は、離れた場所にあるサーバに、通信を暗号化してログインし、操作するためのプロトコル です。

先に、この記事の要点をまとめておきます。

  • SSHは、昔のTelnetに代わる、暗号化された遠隔操作の方法
  • 使うポートは、標準ではTCP(Transmission Control Protocol)の22番
  • 接続の時に、サーバが本物かを確かめてから、ユーザーを確かめる
  • ユーザーの確認には、パスワード認証と公開鍵認証がある。安全なのは公開鍵認証
  • SFTP(SSH File Transfer Protocol)やSCP(Secure Copy)は、SSHの仕組みの上でファイルを転送している
TelnetとSSHの比較図。Telnetは23番、SSHは22番のポートを使う。Telnetはパスワードやコマンドが暗号化されずに流れ、途中で盗み見る人にそのまま見える。SSHは通信が全部暗号化され、盗み見ても読めない

SSHの役割とTelnetとの違い

手の届かない場所にあるサーバは、ネットワーク越しにログインして操作します。

この遠隔操作には、昔はTelnet(標準のポートは23番)が使われていました。

ところが、Telnetの通信は暗号化されていません。 IDとパスワードも、打ち込んだコマンドも、そのまま流れます。途中で盗み見られると、パスワードがそのまま知られてしまいます。

FTP(File Transfer Protocol)と同じ弱点です。FTPについては、FTPの仕組みを図解で説明で説明しています。

SSHは、通信の全体を暗号化し、途中で書き換えられていないかも確かめます。 さらに、接続先のサーバが本物かも確かめます。

SSHの接続の流れ

SSHは、まず暗号化の準備をして、サーバが本物かを確かめてから、ユーザーを確かめます。

SSHの接続の流れの図。①22番ポートに接続して暗号の種類などを決め、②鍵交換で共通鍵を作り、③サーバがホスト鍵で作った署名と公開鍵を送り、クライアントが署名を確かめてknown_hostsと照合する。②と③は同じやり取りの中で行う。④ユーザー認証の後、⑤暗号化された通信の中でコマンドを実行する

① クライアントがサーバの22番ポートに接続し、使う暗号の種類などを決める

② 鍵交換を行い、通信を暗号化するための共通鍵を作る

③ サーバが、ホスト鍵で署名して本物であることを示す。クライアントは、署名を確かめ、記録してあるホスト鍵と同じかを確かめる

④ ユーザー認証を行う(パスワード認証や公開鍵認証)

⑤ 暗号化された通信の中で、コマンドを実行する

鍵交換(②)

鍵交換では、鍵そのものをネットワークに流さずに、クライアントとサーバで同じ共通鍵を作ります。 Diffie-Hellman鍵交換などの方式が使われます。

この後のやり取りは、パスワードも含めてこの共通鍵で暗号化されます。

共通鍵暗号については、共通鍵暗号と公開鍵暗号の違いを図解で説明で説明しています。

サーバ認証とknown_hosts(③)

相手が偽物のサーバでは意味がないので、SSHのサーバは「ホスト鍵」という鍵のペアを持っています。

サーバは、鍵交換のやり取りの内容に、ホスト鍵の秘密鍵で署名し、ホスト鍵の公開鍵と一緒に送ります。

クライアントは、まずその公開鍵で署名を確かめ、相手がその鍵の持ち主であることを確認します。

次に、その公開鍵が前回と同じかを、手元の known_hosts というファイルで確かめます。known_hostsは、これまでに接続したサーバのホスト鍵を記録しておくファイルです。

署名する内容に鍵交換の値が入っているので、②と③は同じやり取りの中で行われます。

パスワード認証と公開鍵認証の違い

項目パスワード認証公開鍵認証
必要なものパスワード秘密鍵(とパスフレーズ)
ネットワークに流れるものパスワード(暗号化された通信の中)秘密鍵で作った署名(と公開鍵)
弱いところ推測されやすいパスワードだと破られる秘密鍵のファイルを盗まれると危ない

パスワード認証でも盗み見の心配はありませんが、短いパスワードやよくあるパスワードは、何度も試されると破られます。 そのため、パスワード認証を止めて、公開鍵認証だけを使う設定もよく使われます。

公開鍵認証の仕組み

公開鍵認証では、公開鍵をサーバに登録し、秘密鍵は自分のパソコンだけに置いておきます。

公開鍵認証の仕組みの図。①自分のパソコンで鍵のペアを作り、秘密鍵は手元から出さない。②公開鍵をサーバのauthorized_keysに登録する。ログインする時は、③秘密鍵で署名を作って署名と公開鍵を送り、④サーバが登録済みの公開鍵で署名を確かめ、⑤ログインできる

① 自分のパソコンで、鍵のペアを作る

② 公開鍵を、サーバの ~/.ssh/authorized_keys というファイルに登録する

③ ログインする時、クライアントが秘密鍵で署名を作り、公開鍵と一緒にサーバに送る

④ サーバが、登録してある公開鍵で署名を確かめる

⑤ 確かめられたら、ログインできる

ポイントは、秘密鍵そのものはネットワークに流れない ことです。

署名には、鍵交換の時に作られた、その接続だけの値(セッション識別子)が含まれます。そのため、署名を盗み見て別の接続で使い回すこともできません。

秘密鍵で署名して、公開鍵で確かめる考え方は、デジタル署名と同じです。詳しくはデジタル署名の仕組みを図解で説明で説明しています。

よく使うコマンド

ここでは、よく使われている OpenSSH のコマンドを例にします。Windows 10(バージョン1809以降)や Windows 11 でも、コマンドプロンプトや PowerShell から使えます。

サーバに接続する(ssh)

ssh user@example.com

user はユーザー名、example.com は接続先のサーバです。22番以外のポートなら、ssh -p 2222 user@example.com のように -p で指定します。終わる時は exit と打ちます。

私も仕事で、SSH でサーバに接続して、アプリケーションの入れ替えやツールの実行をしてきました。画面は文字だけですが、離れた場所のサーバを手元のパソコンから操作できます。

鍵のペアを作る(ssh-keygen)

ssh-keygen -t ed25519

-t は鍵の種類の指定です。保存先を変えなければ、次の2つのファイルができます。

ファイル中身扱い
~/.ssh/id_ed25519秘密鍵誰にも渡さない
~/.ssh/id_ed25519.pub公開鍵サーバに登録する

ファイルを転送する(scp、sftp)

SCPやSFTPは、SSHの暗号化された接続を使ってファイルを転送します。 認証の方法も、SSHと同じものが使えます。

scp report.txt user@example.com:/home/user/

sftp では、接続してから put(送る)や get(受け取る)のコマンドでファイルをやり取りします。

sftp user@example.com
sftp> put report.txt

22番以外のポートの場合、scp と sftp では大文字の -P を使います。

SFTP・SCPと、FTPS(FTP over SSL/TLS)との違いは、SFTP・FTPS・SCPの違いを図解で解説で説明しています。

新人が気をつけること

初回接続の警告の意味

初めて接続するサーバでは、次のようなメッセージが表示されます。表示は、ソフトやバージョンによって少し違います。

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

これは「このサーバのホスト鍵はまだ記録がないので、本物か確かめられません」という意味です。

本来は、表示された fingerprint(ホスト鍵を短く表した値)が、管理者から聞いた値と同じかを確かめてから yes と答えます。答えると known_hosts に記録され、次からは出なくなります。

known_hostsによる確認の図。A 初めての接続は記録がないので確認のメッセージが出る。B 2回目以降は記録と一致してそのまま接続する。C ホスト鍵が変わった時は記録と違うので、赤い警告を出して接続を止める

もっと注意したいのは、一度接続したサーバで次の警告が出た時です。

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

「前回記録したホスト鍵と違う鍵が届いた」という意味です。サーバの作り直しでも出ますが、偽物のサーバの可能性もあります。

自分の判断で known_hosts の記録を消して接続し直さず、まず管理者や先輩に確認しましょう。

秘密鍵の扱い

秘密鍵は、サーバに入るための合鍵のようなものです。

  • メールやチャットで送らない
  • 共有フォルダや、Gitのリポジトリに置かない
  • 他の人の秘密鍵を借りない。自分の鍵を作って、公開鍵を登録してもらう

他のユーザーも読める状態の秘密鍵は、OpenSSHが使いません。

漏れたかもしれない時は、すぐに管理者へ伝えましょう。その公開鍵を登録したすべてのサーバから消せば、その秘密鍵ではログインできなくなります。あわせて新しい鍵のペアを作り直しましょう。

パスフレーズを付ける

パスフレーズは、秘密鍵のファイルそのものに付ける合言葉 です。ssh-keygen で鍵を作る時に聞かれます。

付けておけば、ファイルが盗まれても、すぐには使われません。サーバのログインのパスワードとは別のものです。

まとめ

今回はSSHの仕組みについて説明しました。

SSHは、鍵交換で暗号化の準備をして、ホスト鍵でサーバを確かめてから、ユーザーを確かめます。

基本情報技術者試験や応用情報技術者試験に向けては、次の点を押さえておきましょう。

  • SSHは暗号化して遠隔操作するプロトコル。Telnetは暗号化しない
  • ポートは標準でSSHが22番、Telnetが23番
  • 公開鍵認証では、公開鍵をサーバに登録し、秘密鍵は利用者が持つ
  • SFTPやSCPは、SSHを使ってファイルを転送する

なお、SSHは特定のサーバへのログインや転送を守る技術です。拠点のネットワーク同士や、外出先のパソコンと会社のネットワークを、通信ごとまとめて安全につなぐなら、VPNの仕組みを図解で説明で紹介しているVPN(Virtual Private Network)を使います。

初回接続のメッセージは、サーバを確かめるための大切な仕組みです。何も考えずに「yes」と答えず、意味を考えてから進みましょう。