IX の ssh ログイン設定

# NEC UNIVERGE IX ルータで ssh 接続の設定をしてみた
メモ代わりですが。

## 前提
ssh の ipv4 対応は Version 8.7 以降
ipv6 対応は Version 8.9 以降
動作を確認した機械は以下の通り

- IX2005 Ver.  8.9.25
- IX2105 Ver. 10.2.35
- IX2207 Ver. 10.6.21


## ユーザ登録
管理者権限のユーザを登録。
ユーザ名/パスワード = admin/admin-pass でユーザを登録、パスワードを暗号化。

```config:
IX2105-a(config)# username admin password plain admin-pass
% User 'admin' has been added.
% Password strength estimation: score 1(poor).
IX2105-a(config)# service password-encryption
IX2105-a(config)#
IX2105-a(config)# sh run
...
username admin password hash 9B157AC9d62174C2c4E2C408Ad797f@ administrator
...
```
パスワードの強度が評価され (10.6 以降？)、パスワードが暗号化されます。
console からのログインでこのユーザで認証されるようになります。

## ssh に使う認証方法を指定
上で登録したユーザを ssh ログインの認証に使います。場合によっては RADIUS もありかもしれません。

```config:
IX2105-a(config)# aaa enable
IX2105-a(config)# aaa authentication login ssh-login-list local
IX2105-a(config)# ssh-server authentication ssh-login-list
```

## 鍵の生成
ssh を有効化し鍵を生成する (Cisco の様にホスト名やドメイン名は設定しなくても作成可能)

```config:
IX2105-a(config)# ssh-server ip enable
Generating RSA private key ................
IX2105-a(config)# ssh-server ipv6 enable
IX2105-a(config)#
IX2105-a(config)# pki private-key generate dsa
Generating DSA private key .........
IX2105-a(config)#
IX2105-a(config)# show ssh-server host-key fingerprint
RSA fingerprint:
  SHA1 57:f5:b7:5b:77:dd:26:9b:f7:b7:61:3e:6b:5f:15:c4:23:a5:87:88
  MD5 8c:c0:d4:44:1c:7d:d8:1d:4d:69:bf:ec:11:17:c9:32
DSA fingerprint:
  SHA1 56:77:f6:7d:33:46:cd:19:85:d9:32:1f:18:bc:60:44:fb:b1:31:e7
  MD5 61:75:b9:ae:2c:6f:49:78:f9:93:3c:c1:a7:08:e1:f2
IX2105-a(config)#
```
fingerprint を見ることができます。(export/import もできそうですが、作り直した方が早くない？と思ってしまう)
``ssh-server ip enable`` で RSA 鍵を作成されなかった場合は ``pki private-key generate rsa`` で別途作成してください

## ssh の有効化
```config:
IX2105-a(config)# ssh-server ip enable
```

古いクライアントがうまく接続できない場合、旧鍵交換タイプ、旧暗号アルゴリズム、旧 MAC アルゴリズムを有効にする
```config:
IX2105-a(config)# ssh-server key-exchange compatibility
IX2105-a(config)# ssh-server encryption compatibility
IX2105-a(config)# ssh-server mac compatibility
```

## ポート番号の変更
関係者外が遊びでいじったりしないように、ポート番号を変えておく (アクセスリストを指定すれば不要かもしれません)

```config:
IX2105-a(config)# ssh-server ip port 4044
IX2105-a(config)# ssh-server ipv6 port 6066
```

## アクセスリスト
どこからでもアクセスできるとなんか嫌なので、接続できるホストを制限する
最後に暗黙の deny が自動的に入ります。気になるなら、明示的に deny を書きましょう。

```config:
IX2105-a(config)# ip access-list ssh-in permit tcp src any dest 192.168.10.0/24 dport eq 4044
IX2105-a(config)# ip access-list ssh-in permit ip src 10.8.0.0/8 dest any
IX2105-a(config)# ip access-list ssh-in permit ip src 172.16.0.0/12 dest any
IX2105-a(config)# ip access-list ssh-in permit ip src 192.168.0.0/16 dest any
IX2105-a(config)# ssh-server ip access-list ssh-in
IX2105-a(config)#
IX2105-a(config)# ipv6 access-list ssh-src permit tcp src any dst X:X:X:X:X:X:X:X/<0-128> dport eq 6066
IX2105-a(config)# ipv6 access-list ssh-src permit ip src X:X:X:X:X:X:X:X/<0-128> dst any
IX2105-a(config)# ssh-server ipv6 access-list ssh-in
IX2105-a(config)#
```
1行目で受信するインターフェイスとポート番号を指定。
以降の行で接続可能なクライアントを指定。
IPv6 は良く分からないので省略。

## こんなところかな？
これで大方の要件はクリアできると思います。

# ついでなので Cisco版

## ホスト名とドメインを設定
ホスト名とドメイン名を設定しないと鍵を作成できないので、ホスト名とドメイン名を設定します。

```conf
Router#conf t
Router(config)#hostname C1901
C1901(config)#ip domain-name my.home
```
ホスト名を設定するとプロンプトが変わります。

## ドメイン名が設定されていることを確認
`ip hosts xxx` で登録しているホスト (hosts ファイル代わり) や、DNS キャッシュも見ることができます。

```conf
C1901#show hosts
Default domain is my.home
Name/address lookup uses domain service
Name servers are 1.1.1.1, 8.8.4.4

Codes: UN - unknown, EX - expired, OK - OK, ?? - revalidate
       temp - temporary, perm - permanent
       NA - Not Applicable None - Not defined

Host                      Port  Flags      Age Type   Address(es)
one.one.one.one           None  (temp, OK)  0   IP    1.0.0.1
                                                      1.1.1.1
dns.google                None  (temp, OK)  2   IP    8.8.8.8
```

## 鍵を作成
今どきは鍵長は 2048 以上。長期間使う可能性があるなら 4096bit にしておくと安心だと思います。(そこまで要らないという人もいると思いますので、必要に応じて設定してください)
ssh の バージョンを明示的に 2 にします。

```conf
C1901(config)#crypto key generate rsa
The name for the keys will be: C1901.my.home
Choose the size of the key modulus in the range of 360 to 4096 for your
  General Purpose Keys. Choosing a key modulus greater than 512 may take
  a few minutes.

How many bits in the modulus [512]: 4096
% Generating 4096 bit RSA keys, keys will be non-exportable...
[OK] (elapsed time was 36 seconds)

C1901(config)#ip ssh version 2
```

## 作成した鍵の確認

```conf
C1901#show crypto key mypubkey rsa
% Key pair was generated at: 08:27:59 JST Mar 13 2022
Key name: C1901.my.home
Key type: RSA KEYS
 Storage Device: not specified
 Usage: General Purpose Key
 Key is not exportable.
 Key Data:
  30820222 300D0609 2A864886 F70D0101 01050003 82020F00 3082020A 02820201
  00B3BEC1 8FDAA25D FCD8703A BE861B40 4328A205 62C6AC61 3C779761 29F7DF4F
  7BB172A9 B59D084F F7F6CC4C 9B31D09A 93ED2164 8F3C4352 49A95CA0 1223DD7A
...snip...
  A5020301 0001
% Key pair was generated at: 08:28:02 JST Mar 13 2022
Key name: C1901.my.home.server
Key type: RSA KEYS
Temporary key
 Usage: Encryption Key
 Key is not exportable.
 Key Data:
  307C300D 06092A86 4886F70D 01010105 00036B00 30680261 00BC8726 901FFD47
...snip...
  9A804AEA 7EB8A4D3 165F6531 CA180EB6 6AE80111 62E9D72C 73020301 0001
```

## パスワードを設定
接続するときのユーザ名・パスワードと、enable パスワードを設定します。

```conf
C1901(config)#username admin secret Cisco123
C1901(config)#enable secret Yahoo321
```

ユーザ名 `admin`、パスワード `Cisco123`
enable したときに聞かれるパスワードが `Yahoo321`
複数、ユーザを登録すればその全てで接続できるようになります。

secret で設定しているので、パスワードは暗号化されます。(これは 5 なので、MD5 でハッシュ化されています)
```conf
C1901#show running-config | inc secret
enable secret 5 $1$ByKE$BjPTf1A6szcICUP.zTyIL/
username admin secret 5 $1$qQkX$IACV88.bOFr.EkZIQX/270
```

当然ながら、もう一度同じパスワードを設定しても seed が変わり違うハッシュになります。
```conf
C1901(config)#username admin secret Cisco123
C1901(config)#enable secret Yahoo321
C1901(config)#exit
C1901#show running-config | inc secret
enable secret 5 $1$w8DH$Ucc/Z9xLARr71CbakLO3i0
username admin secret 5 $1$4IxR$8sAa/pY75jT2GjDDUU1gF0
```

`show run` で見えたり、容易に復元できる `enable password <パスワード>` や `username <ユーザ> password <パスワード>` は使わないようにしましょう。

## ssh の接続を有効にする
```conf
C1901(config)#line vty 0 15
C1901(config-line)#login local
C1901(config-line)#transport input ssh
C1901(config-line)#end
```

`transport input ssh` を `transport input telnet ssh` とすると telnet での接続も可能。(もちろんお勧めではありません)

## ssh が有効化されていることを確認
```conf
C1901#show ip ssh
SSH Enabled - version 2.0
Authentication timeout: 120 secs; Authentication retries: 3
Minimum expected Diffie Hellman key size : 1024 bits
IOS Keys in SECSH format(ssh-rsa, base64 encoded): NONE
```

## ポート番号の変更
6226 番ポートで待ち受ける (22番ポートと両方で待ち受ける)
```conf
C1901(config)#ip ssh port 6226 rotary 1
C1901(config)#line vty 0 15
C1901(config-line)#rotary 1
C1901(config-line)#end
```

acl で 6226番ポートのみ接続を許可する (22番ポートの接続を拒否する)
この acl を書き換えて、接続元を絞ることもできます
```conf
C1901(config)#access-list 122 permit tcp any any eq 6226
C1901(config)#
C1901(config)#line vty 0 15
C1901(config-line)#access-class 122 in
C1901(config-line)#exit
```

## 接続状況の確認
接続していないときと、接続が 1つ、2つあるとき

```conf
接続がない
C1901#show ssh
%No SSHv2 server connections running.
%No SSHv1 server connections running.


接続が一つ
C1901#show ssh
Connection Version Mode Encryption  Hmac         State                 Username
0          2.0     IN   aes256-cbc  hmac-sha1    Session started       admin
0          2.0     OUT  aes256-cbc  hmac-sha1    Session started       admin
%No SSHv1 server connections running.


接続が二つ
C1901#show ssh
Connection Version Mode Encryption  Hmac         State                 Username
0          2.0     IN   aes256-cbc  hmac-sha1    Session started       admin
0          2.0     OUT  aes256-cbc  hmac-sha1    Session started       admin
1          2.0     IN   aes128-cbc  hmac-sha1    Session started       admin
1          2.0     OUT  aes128-cbc  hmac-sha1    Session started       admin
%No SSHv1 server connections running.
```

## 鍵の削除
`crypto key generate rsa` で作成した鍵を削除する場合
```config
C1901(config)#crypto key zeroize rsa
% All keys will be removed.
% All router certs issued using these keys will also be removed.
Do you really want to remove these keys? [yes/no]: yes
```

## 他の機器へ ssh する場合
Cisco の機器から、他の機器へ ssh するときは `ssh -l <ユーザ名> <IPアドレス>` とします。
接続後には known_hosts が登録されます
```conf
C1901#show ip ssh
SSH Enabled - version 2.0
Authentication timeout: 120 secs; Authentication retries: 3
Minimum expected Diffie Hellman key size : 1024 bits
IOS Keys in SECSH format(ssh-rsa, base64 encoded):
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCzvsGP2qJd/NhwOr6GG0BDKKIFYsasYTx3l2Ep999P
e7FyqbWdCE/39sxMmzHQmpPtIWSPPENSSalcoBIj3Xpj5F0oLB26K2zI+WJSiAlrMtDp1ZyJdyR9fg98
59CpdWEx8ck/KWK+dv4GOffYRYhAMD59A/tmVJErGRIjsYwwPMg3BDVMe0ws6Xg9F+BlC8tH8Ky1L39H
....snip...
```

# OpenSSH で接続できない場合
### `no matching key exchange method found.` と表示された場合
古く、今では使用を推奨しない鍵交換方式を有効化します。telnet を使うよりは強度が弱くても ssh を使う方が遥かにましです。
```tcsh
% ssh -p 6226 192.168.0.46
Unable to negotiate with 192.168.0.46 port 6226: no matching key exchange method found. Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```
↓以下の設定を追加
```config:.ssh/config
Host <接続先>
KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```
`<接続先>` は IP アドレスでも、ホスト名でも可。

### `no matching cipher found.`と表示された場合
古く、今では使用を推奨されていない (無効化されている) 暗号化方式を有効化します。telnet を使うよりは (略)
```tcsh
% ssh -p 6226 192.168.0.46
Unable to negotiate with 192.168.0.46 port 6226: no matching cipher found. Their offer: aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc
```
↓以下の設定を追加
```config:.ssh/config
Host <接続先>
Ciphers +aes256-cbc,aes192-cbc,aes128-cbc,3des-cbc
```
`<接続先>`  は IP アドレスでも、ホスト名でも可。

片方が表示されたら両方まとめて追加してもいいでしょう。ssh クライアントがインターネット越しで接続を行うような場合は Host を必ず指定することをお勧めします。


たとえば、鍵交換`KexAlgorithms` で無効化されている sha1 は [OpenSSH 8.5 リリース時の記事](https://blog.desdelinux.net/ja/openssh-8-5-llega-con-updatehostkeys-correcciones-y-mas/ "OpenSSH 8.5には、UpdateHostKeys、修正などが付属しています。"), [OpenSSH 8.5p1 での変更点のまとめ](https://www.unixuser.org/~haruyama/security/openssh/henkouten/henkouten_8.5.txt "OpenSSH 8.5p1 での変更点のまとめ")によると 約50万ドル (2015年時点で 10万ドル前後という記事も) をかけることで衝突を見つけることができると見積もられるそうです。ちょこっと書き換えるだけで追加料金無く、遙かに安全な暗号化手法を使えるのであれば、わざわざ危険と言われている方法を使う必要は無いでしょう。
一時期、早いと好まれた arcfour (Alleged RC FOUR≃RC4) はそもそも暗号強度が弱く、blowfish なんかは CBC 系でまとめて危殆化しているそうです。使ってはいけません。

## RC4 や、 cbc モードは使わないに越したことはない
RC4 なんで 1987年に考えられたもので、現在から考えたら遥かに少ない計算機資源で利用できるものでしたから、逆に攻撃者にとっても少ない計算機資源で突破できる暗号であると言えます。
[RC4の脆弱性とSSL/TLSへの攻撃](https://www2.nict.go.jp/csri/plan/H26-symposium/files/3-1.pdf "RC4の脆弱性とSSL/TLSへの攻撃")
[SSH CBC vulnerability](https://www.kb.cert.org/vuls/id/958563 "SSH CBC vulnerability")、[SSH通信において低確率ながら一部データが漏えいする可能性](https://security.srad.jp/story/08/11/18/0341216/ "SSH通信において低確率ながら一部データが漏えいする可能性")
危険と分かってから切り替えるのは危険に晒される期間ができてしまいますので、新規構築の際はできるだけ強度の高いものを利用し更改の手間を減らすのが良いと思います。

- SSH プロトコルについて参考
-- [OpenSSHがSHA-1を使用したRSA署名を廃止、BacklogのGitで発生した問題と解決にいたるまでの道のり](https://nulab.com/ja/blog/backlog/disables-rsa-sig-using-the-sha-1-in-openssh/ "OpenSSHがSHA-1を使用したRSA署名を廃止、BacklogのGitで発生した問題と解決にいたるまでの道のり")
-- [OpenSSH 完全に理解した(笑)](https://text.baldanders.info/remark/2021/01/openssh-mystery/ "OpenSSH 完全に理解した(笑)")