Cisco機器にパスワード入力してログインしてるやつなんておらんよな？？？？ ～CiscoIOSにSSH公開鍵認証を設定するの巻

```
Username: cisco
Password:
```

こんなログイン画面みたことあるやつ昭和生まれくらいだよな？？？？？？

いま令和やぞ？？？？？？

~~すいませんわたしも昭和生まれですいませんすいません~~

# この記事の概要

令和なのでCiscoIOSのパスワード認証をやめてRSA公開鍵認証を行います。

~~「令和なら楕円曲線暗号だろｗｗｗｗｗ」~~

すいませんCisco機器のSSH鍵認証がRSAしか対応してないので今回はこれで我慢してください。

これを設定することにより、Cisco機器にパスワード入力無しでログインできるようになります。

(比較的)セキュアにCisco機器に接続できるようになります。

ついでに自動化もしやすくなるので、Ansibleで自動化を行います。

# Cisco機器にSSH公開鍵認証の設定を投入する

参考： [Using SSH public key authentication with Cisco](https://nsrc.org/workshops/2016/renu-nsrc-cns/raw-attachment/wiki/Agenda/Using-SSH-public-key-authentication-with-Cisco.htm)

英語のページだし若干古いので補足をしつつ手順を書きます。

## 0. そもそもSSH公開鍵認証ってなに

これを初学者向けに説明していると結構沼ってしまうので省略します。

以下のページなどを参考にして理解してください。

[公開鍵暗号方式 | サイバーセキュリティ情報局](https://eset-info.canon-its.jp/malware_info/term/detail/00198.html)

わかりやすく説明しようかなと思ったけど、僕自身「完全に理解し」ている程度なので頑張って「理解」してください。

今回は実際にCiscoIOSに対して同設定をするのか、ということを主軸において書かせていただければと思います。

## 1. 想定環境構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/5990a560-678f-f226-6093-a0a676faae59.png)

はい、作業PCからルータにSSHするっていうだけの超つまらないパターンですね。

公開鍵を設定するときだけコンソールとかtelnetとかから入ります。

その後は公開鍵認証でsshで公開鍵認証ができると思います。

## 2. 作業PCで秘密鍵/公開鍵を作成する

このセクションではTeratermでの手順とWSLでの手順で分けて紹介します。

僕的にはWSLのほうが使い慣れてるんだけど、みなさんTeratermのほうがわかりやすいでしょ？？？？？(偏見)

**※お好きなシステム/ソフトウェアを利用して鍵を作成してください。**

### 2-1. Teratermで秘密鍵/公開鍵を作成する。

以下、スクショに沿って解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/c46efde9-28e0-c374-8dc3-94ff855b08ac.png)

まずTeratermを起動します。。。が、ここでSSHするのは我慢して「キャンセル」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/e5d933b7-9081-d07e-2f86-4a1c43320bc2.png)

「設定」→「SSH鍵生成」と選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/87671f2c-f0bf-04fc-d981-ed46470ddeac.png)

鍵の種類は「RSA」ビット数は3072にし、「生成」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/3aa8ad08-ee8c-096b-b83a-ecef0e0bb18e.png)

「鍵を生成しました」と表示されたら、「公開鍵の保存」と「秘密鍵の保存」をそれぞれ押下し、「**id_rsa.pub**」と「**id_rsa**」という名前のファイルをわかりやすいところに保存します。

ここでありがちなのが 「あれ？どこに保存したっけ？？？？」ってやつですね。

そういう場合はもう一回「公開鍵の保存」か「秘密鍵の保存」を押して、保存フォルダの見当をつけてくださいね！！！Documentフォルダの中に保存されてたのがわかりましたね！！！！！(しらんけど)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/8efb7154-32bb-bea5-01cc-3140bed59d73.png)

そしたら先程保存した「**id_rsa.pub**」ファイルを高機能テキストエディタで開きましょう。

※あくまで「高機能」テキストエディタです。notepadでは開かないようにしましょう。

これをCiscoIOSのコンフィグに投入するわけですが、このままだと1行に対する文字数が長すぎるためうまくコンフィグ投入できません。

なので72文字単位で分割してあげましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/f924e14d-00c9-f63f-fac4-05a0acae6059.png)

置換前： `(.{0,72})`
置換後： `\1\n`
正規表現：チェック

で、「すべて置換」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/2768bf61-a006-ab1e-4149-2eb408b31ddc.png)

すると、なんということでしょう！

1行のテキストが、72文字単位で分割されたではないですか！！(例のBGM)

コレがコンフィグとなります。

```
username <SSH公開鍵を登録するユーザ名> privilege 15
ip ssh pubkey-chain
  username <SSH公開鍵を登録するユーザ名>
   key-string
    ssh_rsa <さっき分割した>
    <72文字ごとの>
    <id_rsa.pubファイルを>
    <ここに貼り付ける>
   exit
  exit
exit
```

これをCiscoIOS実機にログインし、コンフィグを投入しましょう。

コンフィグ投入作業は皆さんお手の物ですね？

わからない人はCCNAを取得しましょう

### 2. WSLで秘密鍵/公開鍵を作成する

前項のTeratermで鍵を作る手順を書くのに疲れたので、面倒なのでコマンドだけ紹介します。

WSL知ってるやつは↓のコマンドの意味くらいわかるよな？？？？？(煽)

```shell
$ ssh-keygen -t rsa -b 3072 -f <id_rsa_filename>
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in <id_rsa_filename>
Your public key has been saved in <id_rsa_filename>.pub
The key fingerprint is: ※↓ここのfingerprintがcisco機器内のコンフィグと同値になる
MD5:44:e9:14:cc:ae:74:d7:fb:47:20:e4:78:4e:b7:c2:55 WSLUser@WSLHostname
The key\'s randomart image is:
+---[RSA 3072]----+
|       ooo       |
|       .=   .   E|
|       +.  =   . |
|      ..+ o * +  |
|     . oS. = = o |
|      .     = . .|
|             o . |
|              . .|
|               . |
+------[MD5]------+

$ fold -b -w 72 <id_rsa_filename>.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC425yjple4VP2kI3hpzKevKTJL+DX9BXBX
PoIkh3Ops5DNnUEKeX4gEajQJHwWjDVW1iewioZFU5D6Uo2a9KM+Z3QqIgPqQOCSnaFNdzjH
RKAgegxhRXxXn3L0pUb2Oxqq0aeF2exFtl17/xJKibi8CtZMP53rObrHthHLEtTRVtpOIWmC
E3T+/NE3D/XukW2HHKT12hLxLvvww/lqtfVbi0E2hH0hyWD8KTGZfZGJlZGKx02cVD7AwDb9
0o6TyQM+2e/StAN0y8QxTLv/SNYf1lLLQQLaRJ3PASZUGApDsiivlFHkpoFrJLUWMxR22jep
TkFdEB0nJ9Umpkex3X6F8u2RMURiEq15UZ9vbzvn76RdoR0gE1ujaKyLUfu3shWDifoY4YyN
o9AifHI4R4CkRFU48sKphshUaJbpHvkuW5c50VA3VxkSY6s0i8YumMmKHYowzZfUwZ9GjthT
k01TaApnxIJ5TcknasM0wD6L75Ca6KCDuT39o38aWiI6BxU= WSLUser@WSLHostname
↑ これをコピペする。

$ telnet <cisco_router>
Username: cisco
Password:
RT>en
Password:
RT#conf t
RT(config)#username <SSH公開鍵を登録するユーザ名> privilege 15
RT(config)#ip ssh pubkey-chain
RT(conf-ssh-pubkey)#username wdsadm
RT(conf-ssh-pubkey-user)#key-string
RT(conf-ssh-pubkey-data)#ssh_rsa <さっき分割した>
RT(conf-ssh-pubkey-data)#<72文字ごとの>
RT(conf-ssh-pubkey-data)#<id_rsa.pubファイルを>
RT(conf-ssh-pubkey-data)#<ここに貼り付ける>
RT(conf-ssh-pubkey-data)#exit
RT(conf-ssh-pubkey-user)#exit
RT(conf-ssh-pubkey)#exit
RT(config)#exit
RT#sh run | sec ip ssh pubkey-chain
ip ssh pubkey-chain
  username <SSH公開鍵を登録するユーザ名> privilege 15
   key-hash ssh-rsa 44E914CCAE74D7FB4720E4784EB7C255 WSLUser@WSLHostname
   ↑このハッシュ値がfingerprintと同値になる
RT#wri mem
RT#exit
```

## 3. SSH公開鍵認証で接続

おめでとうございます！！！！！これでSSH公開鍵認証ができるようになりました！！

※すでにSSH接続の設定ができている場合は繋がります。
当ページの設定以外にそもそもSSH接続の設定なんてしてねーよ！って人は [\[Ciscoルータ - SSHの設定\]](https://www.infraexpert.com/study/ciscorouter7.html) を参照してください。

### 3-1. TeratermでSSH公開鍵認証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391534/e22a5efd-c1fa-ce3a-1c8c-4dbc82dec5a9.png)

パスフレーズを設定した場合は入力してください。

### 3-2. WSLでSSH公開鍵認証

コマンド書けばわかるやろ？？

```shell
ssh -i id_rsa -l <SSH公開鍵を登録するユーザ名> <接続ホスト名>

※なんかエラーで繋がらないんだけど？って人は以下のオプションを付けてみてください。

ssh -i id_rsa -l <SSH公開鍵を登録するユーザ名> <接続ホスト名> \
  -o 'KexAlgorithms=+diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1' \
  -o 'HostkeyAlgorithms=ssh-rsa' \
  -o 'PubkeyAcceptedKeyTypes=ssh-rsa' \
  -o 'FingerprintHash=md5'

※ 以下のように~/.ssh/configに設定を入れておいてもいいです

cat ~/.ssh/config
Host cisco_rt
    HostName <接続ホスト名>
    User <SSH公開鍵を登録するユーザ名>
    IdentityFile id_rsa
    KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
    HostkeyAlgorithms ssh-rsa
    PubkeyAcceptedKeyTypes ssh-rsa
    FingerprintHash md5

ssh cisco_rt
```

## 4. (予告)SSH公開鍵認証を使って設定の自動化をする

いかがだったでしょうか！？！？！？！？(アフィブログ定型文)

今回は「エンジニアを名乗ってくるくせにインフラエンジニアはセキュリティのこと全然無視してパスワード共有して運用してやがる！！」をぶち壊すための第一歩として、SSH公開鍵認証をCiscoIOS機器に投入する記事を書いてみました。

これで、インフラエンジニアだってセキュリティの事考えてるんだぜ！って胸張って言えますね！

言えるのかな。RSA認証ごときで何いってんだって言われそうですね。そうですね。すいませんそもそもCiscoIOSのSSH接続がRSA認証にしか対応してなくて……

とはいえ、SSHを公開鍵認証にすることには大きなメリットがあります。Ansibleを使って自動化することができるようになります。

まぁ、これまでもsshpassを導入すればAnsibleの自動化はできていたわけです。でも結局SSHのパスワードを平文で残すのかよ！って言うのがあって、そういうのがモヤモヤしてたんですよね。

なので、今回のこの記事はそういったモヤモヤを解消するためのものでした。あぁ良かったお通じが良くなった。

長くなってしまったので、今回の記事はこの辺にします。次回の記事はいつになるのかな。ちゃんと書くのかな。ちゃんと書きたいな。。。というところで、Ansible自動化したよPlaybook公開したよ記事を書きたいと思います。お楽しみに！