近期有报告称,新注册用户使用SSH登录时出现问题。系统管理员为Alice注册账户后,Alice尝试通过SSH登录时,系统提示身份验证错误。
系统错误日志中的消息似乎表明爱丽丝尚未注册。
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 的影子信息
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]: 接受密码
+来自 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账户并让其尝试登录。由于距离上次认证请求已超过5分钟,posix_regdb_server刷新了其数据库副本,将Bob识别为有效用户,从而允许其登录。 此时系统管理员注册Alice并让其尝试登录。但由于Bob登录仅过去一两分钟,posix_regdb_service未刷新数据库副本,导致系统未找到Alice记录,因此拒绝其登录请求。
无法更改5分钟的刷新窗口。若停止posix_regdb_server进程,其重启时会刷新注册数据库副本。通常该进程会在一分钟内自动重启,但最多可能需要2分钟。因此虽然可以加快处理速度,但提升幅度有限。
更优的策略是在尝试任何用户之前,同时注册所有新用户。同时应选择无人通过SSH登录的时段进行注册,这样当首位新用户尝试登录时,posix_regdb_server将刷新其数据库,从而一次性获取所有新用户信息。
当然,要找到一个没人试图通过SSH登录的时间点可能很难,所以最佳策略是将所有新用户同时注册,然后去喝杯咖啡,最后再通知他们可以登录。
