【図解】初心者でもわかる!CiscoスイッチのSSH設定と暗号化・共通鍵生成の仕組み

ルータやスイッチをリモートで管理するときは、SSH(Secure Shell)を使います。この記事では、Telnet ではなく SSH を使う理由、Cisco の設定で ip domain-name を先に入れる理由、そして初回接続のときに裏側で共通鍵(セッション鍵)をどう作っているのかを、図を使って説明します。

この記事でわかること
  1. Telnet と SSH の違いと、SSH が公開鍵暗号と共通鍵暗号を組み合わせて使う理由
  2. Cisco IOS の SSH 設定と、ホスト名・ドメイン名が RSA 鍵の名前になるしくみ
  3. 初回接続で Diffie-Hellman 鍵交換を使って共通鍵を作り、暗号化を始めるまでの流れ

SSH とは(暗号化の基本イメージ)

Telnet(ハガキ)と SSH(鍵付き金庫)の違い

Telnet は、ログインのパスワードや設定コマンドを暗号化せずにそのまま流すプロトコルです。たとえるならハガキで手紙を送るようなもので、途中の経路でパケットを見れば誰でも中身を読めます。

SSH は、通信をまるごと暗号化して送るプロトコルです。鍵付きの金庫に入れて送るイメージで、途中で盗み見られても中身はわからず、書き換えられれば受け取った側で気づけます。

項目TelnetSSH
通信平文(暗号化しない)暗号化+改ざん検知
たとえハガキ(中身が丸見え)鍵付きの金庫
ポート番号TCP 23TCP 22
パスワードそのまま読める暗号化されて読めない

公開鍵暗号と共通鍵暗号を組み合わせる

SSH は、性質の違う2種類の暗号を役割分担させて使っています。公開鍵暗号は計算が重いかわりに、相手が本物かを確かめる署名が得意です。共通鍵暗号は暗号化と復号に同じ鍵を使い、処理が速いのが特長です。

方式特徴SSH での役割
公開鍵暗号
(非対称暗号)
公開鍵と秘密鍵のペアを使う。計算は重いが、署名で本人確認ができる接続先の機器が本物かを確かめる(ホスト認証)。鍵交換の内容に署名する
共通鍵暗号
(対称暗号)
暗号化と復号に同じ鍵を使う。処理が速い鍵交換のあとの通信(コマンドとその応答)をすべて暗号化する
最初に1回:重いが確実公開鍵暗号(RSA など)相手が本物かを確かめる(署名)そのあとずっと:軽くて速い共通鍵暗号(AES など)コマンドと応答を暗号化PC(クライアント)Cisco スイッチ
図1 最初に公開鍵暗号で相手を確かめ、その後の通信は共通鍵暗号で暗号化する
イメージ

最初のあいさつと身元確認には「重いが確実な南京錠(公開鍵暗号)」を使い、相手を確かめられたら「軽くて素早いダイヤル錠(共通鍵)」をその場で作って、以降の通信に使います。ポイントは、共通鍵そのものはネットワークに流さず、両者がそれぞれ計算して同じ鍵を作ることです(後半で説明します)。

Cisco IOS の設定と、設定値のつながり

Cisco の機器で SSH を使えるようにするには、いくつかのコマンドを順番に入れます。このうち hostname と ip domain-name は、単なる名前の設定ではなく、SSH で使う RSA 鍵の名前の材料になっています。

ホスト名とドメイン名が RSA 鍵の名前になる

hostname R1ip domain-namelab.example.comFQDNR1.lab.example.comホスト名+ドメイン名crypto key generate rsaRSA 鍵ペア名前=FQDNSSH有効になる鍵は設定を保存したときにNVRAM(表示されない領域)へ
図2 ホスト名とドメイン名から FQDN ができ、RSA 鍵ペアの名前になる
  1. hostname R1 で機器のホスト名を設定します。
  2. ip domain-name lab.example.com で機器のドメイン名を設定します。
  3. IOS はホスト名とドメイン名をつないで、FQDN(完全修飾ドメイン名)R1.lab.example.com として扱います。
  4. crypto key generate rsa を label の指定なしで実行すると、この FQDN が RSA 鍵ペアの名前(ラベル)になります。鍵ペアができると、SSH サーバが自動で有効になります。
ホスト名とドメイン名を先に入れる理由

ラベルを指定しないで鍵を作るときは FQDN を鍵の名前に使うので、ホスト名とドメイン名がそろっていないと crypto key generate rsa は完了せず、エラーになります。Cisco のコマンドリファレンスでも、実行前に hostname と ip domain-name を設定しておくように書かれています(label で名前を付けた鍵ペアだけを作る場合は除きます)。

以前、別の機器(ホスト名 R1、ドメイン名 hirotanoblog.com)で鍵を作ったときは、次のように表示されました。鍵の名前に FQDN が使われていることと、鍵ができた時点で SSH が有効になったことがわかります。

R1(鍵の生成)

R1(config)# crypto key generate rsa modulus 2048
The name for the keys will be: R1.hirotanoblog.com

% The key modulus size is 2048 bits
% Generating 2048 bit RSA keys, keys will be non-exportable...
[OK] (elapsed time was 3 seconds)

R1(config)#
*Aug 29 02:57:17.311: %SSH-5-ENABLED: SSH 1.99 has been enabled
表示意味
The name for the keys will be:
R1.hirotanoblog.com
鍵ペアの名前。ホスト名とドメイン名をつないだ FQDN になっている
Generating 2048 bit RSA keysmodulus 2048 で指定した 2048 ビットの鍵を作っている
SSH 1.99 has been enabled鍵ができて SSH サーバが有効になった。1.99 は SSH バージョン 1 と 2 の両方を受け付ける状態で、ip ssh version 2 を入れるとバージョン 2 だけになる
鍵の保存

作った鍵は、running-config には表示されません。設定を保存したとき(copy running-config startup-config など)に、NVRAM の表示されない領域(プライベート設定)に書き込まれます。保存しないまま再起動すると鍵が消え、SSH で接続できなくなるので、設定後は必ず保存します。

SSH の基本設定

設定は次のとおりです。! で始まる行はコメントです。

Cisco スイッチ(設定例)

! Step 1: ホスト名とドメイン名(FQDNの作成材料)を設定
Switch# configure terminal
Switch(config)# hostname R1
R1(config)# ip domain-name lab.example.com

! Step 2: RSAホスト鍵ペアの生成(2048ビット以上推奨)
R1(config)# crypto key generate rsa modulus 2048

! Step 3: 安全なSSH Version 2に固定
R1(config)# ip ssh version 2

! Step 4: ログイン用ローカルユーザーの作成
R1(config)# username admin privilege 15 secret StrongPassword123

! Step 5: VTY回線(リモート接続口)でSSHのみを許可
R1(config)# line vty 0 4
R1(config-line)# login local
R1(config-line)# transport input ssh
R1(config-line)# end
コマンド意味
hostname R1機器のホスト名。鍵の名前(FQDN)の材料になる
ip domain-name機器のドメイン名。ホスト名とつないで FQDN になる
crypto key generate rsa
modulus 2048
SSH のホスト鍵になる RSA 鍵ペアを 2048 ビットで作る。鍵ができると SSH サーバが有効になる
ip ssh version 2SSH バージョン 2 だけを受け付ける。バージョン 2 には 768 ビット以上の鍵が必要
username … secret …ログインに使うローカルユーザー。secret はパスワードをハッシュにして保存する。privilege 15 にするとログイン直後から特権モードになる
line vty 0 4リモート接続を受ける仮想回線(VTY)0〜4 の設定に入る
login localusername で作ったユーザーで認証する
transport input sshこの VTY 回線で受け付ける接続を SSH だけにする。Telnet での接続は受け付けない
注意
  • スイッチは VTY 回線が 0〜15 の16本あることが多く、line vty 0 4 だけでは 5〜15 の設定が変わりません。show running-config で VTY 回線の数を確かめ、line vty 0 15 のようにすべての回線を同じ設定にそろえます。
  • 鍵長は、SSH バージョン 2 では 768 ビット以上が必要です。Cisco は 2048 ビットを推奨しているので、2048 ビット以上(3072、4096 など)を指定します。鍵長が長いほど、作るのに時間がかかります。

初回接続で共通鍵を作るしくみ

PC から Cisco スイッチへ SSH で接続するとき、ネットワークは盗聴されているかもしれません。そのような経路で、第三者に知られずに両者が同じ共通鍵(セッション鍵)を持つために使うのが、Diffie-Hellman(DH)鍵交換です。

Diffie-Hellman 鍵交換で共有秘密を作る

PC とスイッチは、それぞれ自分だけが知る秘密の値をもとに公開値(e と f)を作って送り合います。そして、受け取った公開値と自分の秘密の値から計算すると、両者で同じ共有秘密 K ができます。ネットワークに流れるのは公開値だけで、K そのものは流れません。流れている値から K を求めるのは、計算量の面で現実的ではありません。

DH 鍵交換をくわしく

絵の具の混色にたとえたしくみや、TLS・IPsec(IKE)での使われ方、鍵長の選び方は、【初心者】Diffie-Hellman 鍵交換をイメージで解説 で説明しています。

DH 鍵交換だけでは、相手が本物のスイッチかどうかはわかりません。途中に偽者が入り込むと、偽者との間で鍵交換が成り立ってしまいます。SSH では、スイッチがホスト秘密鍵で署名を付け、PC がそれを確かめることで、これを防いでいます(下の流れの④⑤)。

共有秘密から、実際に使う鍵を作る

DH 鍵交換でできた共有秘密 K は、そのまま暗号化に使うわけではありません。K をもとに、用途ごとに別々の鍵を作ってから使います。合鍵の原本から、用途に合わせた鍵を何本か削り出すイメージです。

共有秘密 K交換ハッシュ HDH 鍵交換でできた値ハッシュ関数+ A〜F の1文字PC → スイッチスイッチ → PC初期値(IV)A初期値(IV)B暗号化の鍵C暗号化の鍵D改ざん検知の鍵E改ざん検知の鍵F
図3 共有秘密から、行きと帰りそれぞれの鍵を作る

作る値は次の3種類です。行き(PC → スイッチ)と帰り(スイッチ → PC)で別々に作るので、全部で6つになります。

作る値何に使うか
暗号化の鍵コマンドや応答を暗号化して、途中で見られても読めないようにする
改ざん検知の鍵
(MAC 用)
届いたデータが途中で書き換えられていないかを確かめる
初期値(IV)暗号化を始めるときに使う値

どれも、K と、鍵交換の内容をまとめた値(交換ハッシュ H)をハッシュ関数に通して作ります。このとき A〜F の1文字を付け足すので、同じ材料から6つの別々の値ができます。PC とスイッチは同じ材料で同じ計算をするので、鍵そのものを送り合わなくても、同じ6つの値を持てます。

初回接続の全体の流れ

TCP で 22 番ポートに接続してから、暗号化した通信が始まるまでの流れです。

PCスイッチTCP で接続(宛先ポート 22)① 識別文字列の交換(SSH-2.0-…)② SSH_MSG_KEXINIT(使う方式の交渉)③ SSH_MSG_KEXDH_INIT(e)K と H を計算し、ホスト秘密鍵で H に署名④ SSH_MSG_KEXDH_REPLY(K_S, f, 署名 s)K_S を確かめ、署名を検証。K と H から鍵を作る⑤ SSH_MSG_NEWKEYS(次から新しい鍵)⑥ ユーザー認証 → CLI 操作(すべて暗号化)
図4 SSH 接続の流れ。⑤の NEWKEYS のあとから、新しい鍵で暗号化される
No.やり取り何をしているか
①識別文字列の交換お互いに SSH-2.0-ソフトウェア名 の形の文字列を送り、プロトコルのバージョン 2.0 で話すことを確かめる
②SSH_MSG_KEXINIT鍵交換の方式、ホスト鍵の方式、暗号化の方式(AES など)、MAC の方式、圧縮の方式を、使える順に並べたリストで送り合い、使う組み合わせを決める
③SSH_MSG_KEXDH_INITPC が DH の公開値 e を送る
④SSH_MSG_KEXDH_REPLYスイッチが f と K、交換ハッシュ H を計算し、ホスト秘密鍵で H に署名する。ホスト公開鍵 K_S、f、署名 s を返す
⑤SSH_MSG_NEWKEYSPC は K_S が本当にそのスイッチの鍵かを確かめ、K と H を計算して署名を検証する。両者が NEWKEYS を送り合い、このメッセージのあとから新しい鍵と方式で暗号化する
⑥ユーザー認証・
CLI 操作
暗号化された通信の上でユーザー認証(ssh-userauth)を行い、成功すると CLI を操作できる
初回接続で表示されるフィンガープリント

はじめて接続する機器では、クライアントはその機器のホスト公開鍵をまだ知らないので、鍵のフィンガープリントを表示して確認を求めます。ここで受け入れた鍵は保存され(OpenSSH なら known_hosts)、次からは同じ鍵かどうかを自動で比べます。この「最初の1回を信用する」考え方を TOFU(Trust On First Use)と呼びます。最初の1回が偽者だと気づけないので、できればコンソールなど別の経路で機器の鍵を確かめてから受け入れます。

まとめ:実務で押さえるポイント

ポイント理由・やること
hostname と ip domain-name を先に入れるラベルなしで RSA 鍵を作ると、FQDN が鍵の名前になる。2つがそろっていないと鍵を作れない
鍵長は 2048 ビット以上SSH バージョン 2 には 768 ビット以上が必要で、Cisco の推奨は 2048 ビット
transport input ssh を
すべての VTY 回線に
Telnet(平文)での接続を受け付けないようにする。line vty 0 15 など、機器の VTY 回線すべてにそろえる
設定を保存する鍵は設定を保存したときに NVRAM に書き込まれる。保存せずに再起動すると鍵が消える
初回のフィンガープリントを確かめるDH 鍵交換で盗聴は防げるが、相手が本物かはホスト鍵の確認で決まる

この記事の説明は、SSH の仕様(RFC 4253 など)と Cisco の公式ドキュメントをもとにしています。

コメント