ルータやスイッチをリモートで管理するときは、SSH(Secure Shell)を使います。この記事では、Telnet ではなく SSH を使う理由、Cisco の設定で ip domain-name を先に入れる理由、そして初回接続のときに裏側で共通鍵(セッション鍵)をどう作っているのかを、図を使って説明します。
- Telnet と SSH の違いと、SSH が公開鍵暗号と共通鍵暗号を組み合わせて使う理由
- Cisco IOS の SSH 設定と、ホスト名・ドメイン名が RSA 鍵の名前になるしくみ
- 初回接続で Diffie-Hellman 鍵交換を使って共通鍵を作り、暗号化を始めるまでの流れ
SSH とは(暗号化の基本イメージ)
Telnet(ハガキ)と SSH(鍵付き金庫)の違い
Telnet は、ログインのパスワードや設定コマンドを暗号化せずにそのまま流すプロトコルです。たとえるならハガキで手紙を送るようなもので、途中の経路でパケットを見れば誰でも中身を読めます。
SSH は、通信をまるごと暗号化して送るプロトコルです。鍵付きの金庫に入れて送るイメージで、途中で盗み見られても中身はわからず、書き換えられれば受け取った側で気づけます。
| 項目 | Telnet | SSH |
|---|---|---|
| 通信 | 平文(暗号化しない) | 暗号化+改ざん検知 |
| たとえ | ハガキ(中身が丸見え) | 鍵付きの金庫 |
| ポート番号 | TCP 23 | TCP 22 |
| パスワード | そのまま読める | 暗号化されて読めない |
公開鍵暗号と共通鍵暗号を組み合わせる
SSH は、性質の違う2種類の暗号を役割分担させて使っています。公開鍵暗号は計算が重いかわりに、相手が本物かを確かめる署名が得意です。共通鍵暗号は暗号化と復号に同じ鍵を使い、処理が速いのが特長です。
| 方式 | 特徴 | SSH での役割 |
|---|---|---|
| 公開鍵暗号 (非対称暗号) | 公開鍵と秘密鍵のペアを使う。計算は重いが、署名で本人確認ができる | 接続先の機器が本物かを確かめる(ホスト認証)。鍵交換の内容に署名する |
| 共通鍵暗号 (対称暗号) | 暗号化と復号に同じ鍵を使う。処理が速い | 鍵交換のあとの通信(コマンドとその応答)をすべて暗号化する |
最初のあいさつと身元確認には「重いが確実な南京錠(公開鍵暗号)」を使い、相手を確かめられたら「軽くて素早いダイヤル錠(共通鍵)」をその場で作って、以降の通信に使います。ポイントは、共通鍵そのものはネットワークに流さず、両者がそれぞれ計算して同じ鍵を作ることです(後半で説明します)。
Cisco IOS の設定と、設定値のつながり
Cisco の機器で SSH を使えるようにするには、いくつかのコマンドを順番に入れます。このうち hostname と ip domain-name は、単なる名前の設定ではなく、SSH で使う RSA 鍵の名前の材料になっています。
ホスト名とドメイン名が RSA 鍵の名前になる
hostname R1で機器のホスト名を設定します。ip domain-name lab.example.comで機器のドメイン名を設定します。- IOS はホスト名とドメイン名をつないで、FQDN(完全修飾ドメイン名)
R1.lab.example.comとして扱います。 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 keys | modulus 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 2 | SSH バージョン 2 だけを受け付ける。バージョン 2 には 768 ビット以上の鍵が必要 |
| username … secret … | ログインに使うローカルユーザー。secret はパスワードをハッシュにして保存する。privilege 15 にするとログイン直後から特権モードになる |
| line vty 0 4 | リモート接続を受ける仮想回線(VTY)0〜4 の設定に入る |
| login local | username で作ったユーザーで認証する |
| 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 を求めるのは、計算量の面で現実的ではありません。
絵の具の混色にたとえたしくみや、TLS・IPsec(IKE)での使われ方、鍵長の選び方は、【初心者】Diffie-Hellman 鍵交換をイメージで解説 で説明しています。
DH 鍵交換だけでは、相手が本物のスイッチかどうかはわかりません。途中に偽者が入り込むと、偽者との間で鍵交換が成り立ってしまいます。SSH では、スイッチがホスト秘密鍵で署名を付け、PC がそれを確かめることで、これを防いでいます(下の流れの④⑤)。
共有秘密から、実際に使う鍵を作る
DH 鍵交換でできた共有秘密 K は、そのまま暗号化に使うわけではありません。K をもとに、用途ごとに別々の鍵を作ってから使います。合鍵の原本から、用途に合わせた鍵を何本か削り出すイメージです。
作る値は次の3種類です。行き(PC → スイッチ)と帰り(スイッチ → PC)で別々に作るので、全部で6つになります。
| 作る値 | 何に使うか |
|---|---|
| 暗号化の鍵 | コマンドや応答を暗号化して、途中で見られても読めないようにする |
| 改ざん検知の鍵 (MAC 用) | 届いたデータが途中で書き換えられていないかを確かめる |
| 初期値(IV) | 暗号化を始めるときに使う値 |
どれも、K と、鍵交換の内容をまとめた値(交換ハッシュ H)をハッシュ関数に通して作ります。このとき A〜F の1文字を付け足すので、同じ材料から6つの別々の値ができます。PC とスイッチは同じ材料で同じ計算をするので、鍵そのものを送り合わなくても、同じ6つの値を持てます。
初回接続の全体の流れ
TCP で 22 番ポートに接続してから、暗号化した通信が始まるまでの流れです。
| No. | やり取り | 何をしているか |
|---|---|---|
| ① | 識別文字列の交換 | お互いに SSH-2.0-ソフトウェア名 の形の文字列を送り、プロトコルのバージョン 2.0 で話すことを確かめる |
| ② | SSH_MSG_KEXINIT | 鍵交換の方式、ホスト鍵の方式、暗号化の方式(AES など)、MAC の方式、圧縮の方式を、使える順に並べたリストで送り合い、使う組み合わせを決める |
| ③ | SSH_MSG_KEXDH_INIT | PC が DH の公開値 e を送る |
| ④ | SSH_MSG_KEXDH_REPLY | スイッチが f と K、交換ハッシュ H を計算し、ホスト秘密鍵で H に署名する。ホスト公開鍵 K_S、f、署名 s を返す |
| ⑤ | SSH_MSG_NEWKEYS | PC は 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 の公式ドキュメントをもとにしています。
コメント