随着越来越多的人开始用 SSH 代替 Telnet,我看到人们对 SSH 守护进程对密码警告、到期和宽限期的处理方式感到困惑。部分困惑是由错误的期望而引起的,即认为 SSH 会重复Telnet和登录命令的操作。本篇博客将为您介绍它的工作原理。
首先,请记住,SSH来自Unix/Linux世界,而这个世界并没有VOS登录命令提供的7天到期前警告和更改密码选项。最初发布的SSH守护进程也没有提供这一警告/选项。
从2.0.0e版开始(bug修复ssl-205和ssl-268),这一设置发生了变化,因此,SSH守护进程会在密码过期前7天请求设置一个新密码,就像登录命令一样。然而,设置隧道的连接会在更改密码请求时挂起,因为该请求从向用户显示。问题是隧道设置通常不会分配一个伪终端,所以无法显示提示。
因此,从2.0.0k版本(ssl-295)开始,SSH守护进程被改回了原来的设置。在代码中添加了一个外部变量,以允许网站在需要时启用过期前更改密码的提示。这是通过将sshd$pw_change_method变量设置为1来实现的。
请注意,SSH守护进程在7天警告期时间内提示输入新密码时的方式与使用Telnet连接时login不同。Telnet/login允许您只按回车键跳过更改密码的步骤。SSH守护进程则要求您更改密码。由于SSH守护进程更改密码的方式不同,行为自然也就不同。即使您在登录命令中加入change_password参数,您也不允许跳过更改密码步骤。这基本上就是SSH守护进程的工作原理。ssl-279号错误中描述了这种行为上的差异,但工程人员并不认为这是错误。如果您同时使用Telent/login和SSH登录,您可能会注意到另外一种情况,那就是Telnet/login会提示您的密码将在N天后过期,而SSH守护进程可能会提示您的密码会在N+1天后过期。这种行为取决于最后一次修改密码的时间。这已被上报为ssl-368号错误。
上面讨论的是7天警告期内的时间,那么在宽限期(由login_admin命令的password_grace_time值定义)呢?在宽限期内,SSH守护进程允许您使用旧密码登录,并要求您输入新密码,就像Telnet/login一样。然而SSH守护进程显示的信息有些误导。它表示您的密码即将到期。ssl-366号建议中已要求更改消息,以表示您的密码已经过期。然而,无论消息提示什么,最终结果都是一样的 - 您必须输入一个新的密码。
最后需要考虑的时间段是在宽限期之后。在这段时间内,SSH守护进程允许您使用旧密码登录且提示您输入新密码,但在您输入新密码后它会终止连接。Telnet/login命令会在您输入旧密码后终止连接。这被记录为ssl-367号建议,SSH守护进程不应提示输入新密码。
在更改密码时,Telnet/login和SSH守护进程的行为还有一个区别。更改密码后,SSH守护进程会断开会话,要求您重新连接并使用新密码登录。
最后,还有一个bug需要讨论。如果 set_login_security 命令显示的 req_change_first_login 参数被设置为“yes”,那么 SSH 守护进程会将所有密码视为 不会 过期,而无论其实际状态如何。该ssl-361号错误,在2.0.0u版本中得到了修复,建议将req_change_first_login参数设置为“yes”的所有模块立即升级到至少这一版本。
由于sshd进程为每个连接分叉出一个新的进程,所以安装新版本的sshd.pm文件无需强制所有SSH连接用户断开系统。要做到这一点,您需要
- 更改路径为 >system>openssl>sbin
- 将正在运行的sshd.pm文件改名为original_sshd.pm。
- 将新的sshd.pm 副本移至当前目录
- Execute the command “kill (contents <etc>sshd.pid)” to stop the parent sshd process
- 使用switch_to_root命令切换到root用户。您需要知道root密码。
- 启用新的sshd进程,如果您不确定如何启用 sshd,请检查您的module_start_up.cm。
修改sshd$pw_change_method变量值的过程几乎是一样的。其中第1、2、4、5和6步是一样的,但第3步改为
3. 将 original_sshd.pm 复制到 sshd.pm 中。
同时,增加了一个新的步骤3a来实际设置变量
3a. 执行命令
“set_external_variable sshd$pw_change_method -in sshd.pm -type integer -to 1”