我注意到我的系统日志报告某些身份验证条目的时间不正确。典型行为如下所示:
Feb 16 13:32:20 dev sshd[29537]: Invalid user oracle from 110.188.0.123
Feb 16 12:32:20 dev sshd[29538]: input_userauth_request: invalid user oracle
Feb 16 13:32:20 dev sshd[29537]: pam_unix(sshd:auth): check pass; user unknown
Feb 16 13:32:20 dev sshd[29537]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=110.188.0.123
Feb 16 13:32:20 dev sshd[29537]: pam_succeed_if(sshd:auth): error retrieving information about user oracle
Feb 16 13:32:22 dev sshd[29537]: Failed password for invalid user oracle from 110.188.0.123 port 64368 ssh2
Feb 16 12:32:23 dev sshd[29538]: Received disconnect from 110.188.0.123: 11: Bye Bye
注意小时是如何来回交换的。有没有人见过类似的行为?什么可能导致这种情况?这似乎是系统的,并且每次连接尝试的相同条目都比应有的时间早一个小时报告。系统时钟为 GMT。时区 GMT+1。
请注意,一个进程 29537 总是发送标记为比进程 29538 晚一小时的消息。系统日志协议指定客户端发送以文本 MMM DD HH:MM:SS 格式标记的消息,这根本不是明智之举。
在 UNIX/Linux 上,有一个系统时间(自 1970 年以来的秒数),但系统上的每个进程都可以将其解释为好像它位于不同的时区一样。这是如何处理的,每个想要将秒数转换为实际 HH:MM:SS 文本的进程首先读取 $TZ 环境变量。因为每个进程都有自己独立的环境,每个进程可以有不同的 $TZ 值并显示来自不同时区的日期。
在您的系统上,如果 /etc/environment 中的 $TZ 已更改,但此后 sshd 进程未重新启动,它将使用原始的 $TZ。因此,请重新启动所有 sshd 进程并重复您的测试。
您不会碰巧同时运行两个 syslog 守护程序,其中一个没有正确配置(即您更改了夏令时生效的时间并且没有重新启动它)?然后竞争条件会影响哪个守护进程拦截系统调用并写入磁盘。