ＪＵＮＯＳ（ＳＲＸ３００）におけるＳＳＨサービスの挙動について

# ＳＲＸ３００におけるＳＳＨサービスの振る舞いについて

ジュニパー社製ＳＲＸ３００上のＪＵＮＯＳ ２０．１Ｒにて、管理コンソールアクセスのためのＳＳＨサービスの設定について調べてみた。
特に、しばらく操作していないと強制切断されてしまう件について、色々と調べてみた結果、それらとは違う点が見受けられたので、ここにメモを残しておく。

## はじめに
今回以下の装置、バージョンをターゲットに実験してみた。微妙な最新バージョン、メーカー推奨バージョンでないのはツッコミ不要で。

```
root@XXXXXXXXXXXX> show version
Hostname: XXXXXXXXXXXX
Model: srx300
Junos: 20.1R1.11
JUNOS Software Release [20.1R1.11]

root@XXXXXXXXXXXX> show chassis hardware
Hardware inventory:
Item             Version  Part number  Serial number     Description
Chassis                                XXXXXXXXXXXX      SRX300
Routing Engine   REV 0x08 650-077890   XXXXXXXXXXXX      RE-SRX300
FPC 0                                                    FPC
  PIC 0                                                  6xGE,2xGE SFP Base PIC
Power Supply 0
```

## 具体的に何が問題か

ＳＲＸ３００にＳＳＨでログインしていて、しばらく操作していない＝アイドル時間が長いと、下記のように、ＳＲＸ３００から強制切断される現象が見られる。

```console
@ slogin root@XXX.XXX.XXX.XXX
Last login: Thu Aug  6 10:27:42 2020 from YYY.YYY.YY.YYY
--- JUNOS 20.1R1.11 built 2020-03-20 20:36:18 UTC
% Fssh_packet_write_wait: Connection to XXX.XXX.XXX.XXX port 22: Broken pipe
@ 
```

この問題の解決について検索してみると、いくらか回答が見付かる。

- [アプリケーション別のタイムアウト設定](https://tech-memo.hatenadiary.org/entry/20140803/1407022231)
- [[Juniper]SRX アプリケーション別のタイムアウト設定](https://www.harumaki.net/2014/01/28/juniper-srx-atimeout-configure/)
- [How to change the timeout for telnet/ssh/web services for accessing the SRX](https://forums.juniper.net/t5/SRX-Services-Gateway/How-to-change-the-timeout-for-telnet-ssh-web-services-for/td-p/108892)
- [[SRX] How to check application timeout for default Junos applications on SRX devices](https://kb.juniper.net/InfoCenter/index?page=content&id=KB21344)

要はＳＳＨセッションのタイムアウトが短い（１８００秒）ので延ばそうという話である。
ところが実際に設定してみようと思うと、下記の理由で実施できない。

- [Junos 15.1X49以降、junos-httpなどの定義済みアプリケーションのタイムアウト値を変更しようとするとエラーが出力されますが何故ですか？](https://csps.hitachi-solutions.co.jp/juniper/faq/srx/fw/application_02.html)

更にテストしてみると、実際には３０分（＝１８００秒）ではなく、２時間。これは何か違うな、ということで調べてみた。

結論から言えば、アプリケーション別のタイムアウト設定は無関係であった。
むしろこの設定はガン無視でよく、将来的にも見る必要が無い設定であった。
対策としてはＳＳＨサーバーとしての設定を見直そう。そう、ヒントはそこにあった。

# ＳＳＨサービスの有効化

コンフィグレーションモードにて下記の設定を行うことで、ＳＳＨサービスを有効にするのは既知だとは思う。

```
set system services ssh
commit
```

これに下記の設定を追加することで、強制切断問題が解消する。

```
set system services ssh client-alive-interval 120
set system services ssh client-alive-count-max 30
commit
```

- 【client-alive-interval】１２０秒に一回、クライアントへ死活確認パケットを投げる。
- 【client-alive-count-max】クライアントからの応答が無い場合、３０回までは死活確認パケットを投げる（それでも帰ってこない場合はクライアントは死んだものと判断する）。

つまり２時間で強制切断された理由は、ＴＣＰのキープアライブ時間（デフォルト値）だったのだ。「「「なんだって～！」」」

## 公開鍵認証に限定

更に設定を見てみると、パスワード認証でのログインを制限する設定が見付かった。
下記設定により、公開鍵認証でしかＳＲＸ３００にログインできなくなるので、設定すべし。

```
set system services ssh root-login deny-password
set system services ssh no-passwords
commit
```

パスワードレスはいいぞ。自動化とも実に相性がよい。

## ＯｐｅｎＳＳＨとの設定比較

```
set system services ssh client-alive-interval 120
set system services ssh client-alive-count-max 30
set system services ssh root-login deny-password

set system services ssh no-passwords
```

上記４つの設定は、ＯｐｅｎＳＳＨ的（sshd_config）には下記の設定に該当する（no-passwords は二行分）。

```
ClientAliveInterval 120
ClientAliveCountMax 30
PermitRootLogin prohibit-password

PasswordAuthentication no
ChallengeResponseAuthentication no
```

# ａｕｔｈｏｒｉｚｅｄ＿ｋｅｙｓの設定

ＳＳＨ鍵認証の使用を推奨するに当たって、公開鍵の登録について解説する。
[Root Password](https://www.juniper.net/documentation/en_US/junos/topics/topic-map/user-access-root-password.html#id-configuring-the-root-password)や[Junos OS User Accounts](https://www.juniper.net/documentation/en_US/junos/topics/topic-map/junos-os-user-accounts.html#id-junos-os-user-accounts-overview)を読むと、公開鍵がそれぞれの種類毎に、一行しか設定できないように見える。

```
set system root-authentication ssh-rsa "..."
set system root-authentication ssh-ecdsa "..."
set system root-authentication ssh-ed25519 "..."
set system login user アカウント名 authentication ssh-rsa "..."
set system login user アカウント名 authentication ssh-ecdsa "..."
set system login user アカウント名 authentication ssh-ed25519 "..."
```

しかし、実際に設定してみるとわかるが、上記の設定は各々、下記のように複数設定できる。

```
set system root-authentication ssh-rsa "ssh-rsa AAAAB3NzaC1yc2EAAAABJ...."
set system root-authentication ssh-rsa "ssh-rsa AAAAB3NzaC1yc2EAAAABI...."
commit
```

また一挙に設定したい場合、ＵＲＬ（https など）を指定してロードできるので、まとめて設定できる。下記設定を実行した後は、上記設定として展開される。

```
set system root-authentication load-key-file ＵＲＬ
set system login user アカウント名 authentication load-key-file ＵＲＬ
commit
```

# よくある質問とその答え

## Ｑ．どうしてアプリケーション別タイムアウト設定をスルーしていいのですか？
Ａ．当然ですが、通信してる間はこの設定は機能しません。今回のＳＳＨ設定に関して言えば、１２０秒毎にＳＳＨ死活確認パケットが流れてますから、１８００秒のタイムアウト設定なんて、アウトオブ眼中となります。

他のプロトコルでも同様のことが言えます。本当に必要であれば定期的に通信すべきで、大抵は通信しているか、切れても再度接続しに行くため、問題になりません。
切れると困る通信だけが問題となりますが、その手のプロトコルは大抵、死活確認通信するような仕組みがあるので、それを有効にすべきです。

# 参考文献
- [ssh (System Services)](https://www.juniper.net/documentation/en_US/junos/topics/reference/configuration-statement/ssh-edit-system.html)