跳转至主要内容

最近有报告称,新注册用户在使用 SSH 登录时遇到了问题。系统管理员为爱丽丝注册账户后,让爱丽丝尝试通过 SSH 登录。爱丽丝报告称出现了身份验证错误。

syserr_log 中的消息似乎表明 Alice 尚未注册。

05:04:02 进程 1111812D,root.root (sshd),已创建。 
05:04:02 root (sshd) : [AUTH] [INFO] sshd [PID=0x1111812D]: 无效用户 alice 
+ 来自 127.0.0.1 
05:04:02 root (sshd) : [AUTH] [INFO] sshd [PID=0x1111812D]: input_userauth_req 
+uest: 无效用户 alice 
05:04:02 root (sshd) : [AUTH] [INFO] sshd [PID=0x1111812D]: 验证失败,用户 alice 无效,来自 127.0.0.1 端口 54869 ssh2 
05:04:06 root (sshd) : [AUTH] [ERR] sshd [PID=0x1111812D]: 错误:无法获取 
+NOUSER 的 shadow 信息 
05:04:06 root (sshd) : [AUTH] [INFO] sshd [PID=0x1111812D]: 来自 127.0.0.1 端口 54869 的无效用户 alice 的 ssh2 密码验证失败

 

但如果爱丽丝使用 Telnet 客户端而不是 SSH 客户端,她就能顺利登录。

05:04:23 进程 1111812E,PreLogin.System(登录前),已创建。 
05:04:38 进程 1111812E 切换至 alice.CAC(登录)。

 

此外,如果爱丽丝在注册后不立即尝试登录,而是等上几分钟,她就能顺利登录。

05:12:51 进程 11118130,root.root (sshd),已创建。 
05:12:55 root (sshd) : [AUTH] [INFO] sshd [PID=0x11118130]: 已接受来自 127.0.0.1 端口 54909 的 ssh2 连接,密码为 alice 来自 127.0.0.1 端口 54909 ssh2 
05:12:55 进程 11118131,root.root (sshd),已创建。 
05:12:55 进程 11118131 已切换至 alice.CAC (登录)。

 

最令人沮丧的是,有时第一个新注册的用户通过 SSH 认证毫无问题,但第二个用户却遇到了问题。

到底是怎么回事?

让 SSH 等 POSIX 程序直接引用注册数据库会存在某些问题。因此,它们的身份验证调用由 posix_regdb_server 进程处理。该进程维护着注册数据库的一份副本,并以此来判断用户是否有效。 每次 posix_regdb_server 查询用户 ID 时,它都会将当前时间与上次读取注册数据库的时间进行比较;如果该时间距当前已超过 5 分钟,则会重新读取数据库。因此,新注册的用户可能需要等待长达 5 分钟才能通过 SSH 登录。

在第一位新注册用户没有问题但第二位用户出现问题的场景下,具体情况是:系统管理员注册了 Bob,并让 Bob 尝试登录。由于距离上次身份验证请求已超过 5 分钟,posix_regdb_server 会刷新其数据库副本,将 Bob 识别为有效用户,因此 Bob 可以成功登录。 现在,系统管理员注册了 Alice 并让 Alice 尝试登录。然而,由于距离 Bob 登录仅过去了一两分钟,posix_regdb_service 并未刷新其数据库副本,因此找不到 Alice,故不允许其登录。

无法更改 5 分钟的时间窗口。如果您停止 posix_regdb_server 进程,该进程在重启时会刷新其注册数据库的副本。通常,该进程会在一分钟内自动重启,但最多可能需要 2 分钟,因此虽然您可以加快这一过程,但速度提升有限。

更好的策略是在尝试使用任何新用户之前,先一次性注册所有新用户。此外,应在没有其他用户通过 SSH 登录的时候进行注册,这样当第一个新用户尝试登录时,posix_regdb_server 就会刷新其数据库,并一次性获取所有新用户。

当然,要找到一个恰好没人通过 SSH 登录的时间点可能很难,所以最好的策略是先一次性注册所有新用户,然后去喝杯咖啡,再通知他们可以登录。