随着越来越多的人开始用SSH取代Telnet,我发现人们对SSH守护进程处理密码警告、过期和宽限时间的方式越来越困惑。部分困惑源于人们错误地认为SSH会复制Telnet和login命令的行为。本文旨在阐明其工作原理。
首先,请记住SSH源自Unix/Linux世界,而该环境并不具备VOS登录命令所提供的密码过期前7天预警及修改选项。最初发布的SSH守护进程同样未提供此类预警/选项。
从2.0.0e版本(修复了ssl-205和ssl-268漏洞)开始,该行为已调整:SSH守护进程会在密码到期前7天要求用户输入新密码,与登录命令的行为一致。然而,建立隧道连接的用户会因密码更改请求卡住,因为该请求从未显示给用户。 问题根源在于隧道建立过程通常不分配伪终端,导致系统无处显示提示信息。
因此从2.0.0k版(ssl-295)开始,SSH守护进程恢复了其原始行为。代码中新增了一个外部变量,允许站点根据需要启用密码过期前的更改提示功能。实现方式是将sshd$pw_change_method变量设置为1。
请注意,SSH守护进程在7天警告期内提示更改密码时的行为与Telnet连接时的登录行为不同。Telnet/登录允许您直接按回车键跳过更改密码步骤。 SSH守护进程强制要求您更改密码。这种差异源于SSH守护进程的密码修改机制。若在登录命令中添加change_password参数,同样无法跳过密码修改步骤——这本质上与SSH守护进程的行为一致。虽然ssl-279号缺陷报告描述了此行为差异,但工程团队认定其不属于缺陷。 若同时使用Telnet/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 守护进程会断开当前会话,要求用户重新连接并使用新密码登录。
最后还有一个需要讨论的漏洞。如果set_login_security命令显示的req_change_first_login参数设置为“yes”,则SSH守护进程将把所有密码视为 过期 过期,无论其实际状态如何。此漏洞(ssl-361)已在2.0.0u版本中修复,建议所有将req_change_first_login参数设为yes的模块立即升级至该版本或更高版本。
由于sshd进程会为每个连接创建子进程,因此可以在不强制所有SSH连接用户断开的情况下安装新版sshd.pm文件。具体操作如下:
- 切换目录至 >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”
