SRX300におけるSSHサービスの振る舞いについて
ジュニパー社製SRX300上のJUNOS 20.1Rにて、管理コンソールアクセスのためのSSHサービスの設定について調べてみた。
特に、しばらく操作していないと強制切断されてしまう件について、色々と調べてみた結果、それらとは違う点が見受けられたので、ここにメモを残しておく。
はじめに
今回以下の装置、バージョンをターゲットに実験してみた。微妙な最新バージョン、メーカー推奨バージョンでないのはツッコミ不要で。
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
具体的に何が問題か
SRX300にSSHでログインしていて、しばらく操作していない=アイドル時間が長いと、下記のように、SRX300から強制切断される現象が見られる。
@ 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
@
この問題の解決について検索してみると、いくらか回答が見付かる。
- アプリケーション別のタイムアウト設定
- [Juniper]SRX アプリケーション別のタイムアウト設定
- How to change the timeout for telnet/ssh/web services for accessing the SRX
- [SRX] How to check application timeout for default Junos applications on SRX devices
要はSSHセッションのタイムアウトが短い(1800秒)ので延ばそうという話である。
ところが実際に設定してみようと思うと、下記の理由で実施できない。
更にテストしてみると、実際には30分(=1800秒)ではなく、2時間。これは何か違うな、ということで調べてみた。
結論から言えば、アプリケーション別のタイムアウト設定は無関係であった。
むしろこの設定はガン無視でよく、将来的にも見る必要が無い設定であった。
対策としてはSSHサーバーとしての設定を見直そう。そう、ヒントはそこにあった。
SSHサービスの有効化
コンフィグレーションモードにて下記の設定を行うことで、SSHサービスを有効にするのは既知だとは思う。
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】120秒に一回、クライアントへ死活確認パケットを投げる。
- 【client-alive-count-max】クライアントからの応答が無い場合、30回までは死活確認パケットを投げる(それでも帰ってこない場合はクライアントは死んだものと判断する)。
つまり2時間で強制切断された理由は、TCPのキープアライブ時間(デフォルト値)だったのだ。「「「なんだって~!」」」
公開鍵認証に限定
更に設定を見てみると、パスワード認証でのログインを制限する設定が見付かった。
下記設定により、公開鍵認証でしかSRX300にログインできなくなるので、設定すべし。
set system services ssh root-login deny-password
set system services ssh no-passwords
commit
パスワードレスはいいぞ。自動化とも実に相性がよい。
OpenSSHとの設定比較
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
上記4つの設定は、OpenSSH的(sshd_config)には下記の設定に該当する(no-passwords は二行分)。
ClientAliveInterval 120
ClientAliveCountMax 30
PermitRootLogin prohibit-password
PasswordAuthentication no
ChallengeResponseAuthentication no
authorized_keysの設定
SSH鍵認証の使用を推奨するに当たって、公開鍵の登録について解説する。
Root PasswordやJunos OS User Accountsを読むと、公開鍵がそれぞれの種類毎に、一行しか設定できないように見える。
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
また一挙に設定したい場合、URL(https など)を指定してロードできるので、まとめて設定できる。下記設定を実行した後は、上記設定として展開される。
set system root-authentication load-key-file URL
set system login user アカウント名 authentication load-key-file URL
commit
よくある質問とその答え
Q.どうしてアプリケーション別タイムアウト設定をスルーしていいのですか?
A.当然ですが、通信してる間はこの設定は機能しません。今回のSSH設定に関して言えば、120秒毎にSSH死活確認パケットが流れてますから、1800秒のタイムアウト設定なんて、アウトオブ眼中となります。
他のプロトコルでも同様のことが言えます。本当に必要であれば定期的に通信すべきで、大抵は通信しているか、切れても再度接続しに行くため、問題になりません。
切れると困る通信だけが問題となりますが、その手のプロトコルは大抵、死活確認通信するような仕組みがあるので、それを有効にすべきです。