码间随笔 · ESSAY

06:05 的告警:我以为是自己,日志说不是

早上六点零五分,手机在枕头边震了一下。

云厂商的安全提醒:检测到异常登录。我那台跑着医院业务系统的云主机,半夜不该有人动它——而且告警写的是:一个外网 IP,登录成功。

我翻身坐起来,想立刻 ssh 上去看。然后发现自己也被挡在门外:白名单没加我的账户,控制台密钥还绑错了实例。门里门外一起不对劲。

01 凌晨的震动

等我把钥匙理顺、登进真正的机器,直奔 /var/log/auth.log,看到的时间线是:

06:05:48 —— 运维账户(下文称 A 账户)用口令登录成功,来源一处手机蜂窝出口(36.x 网段);
06:05:49 —— 不到一秒,authorized_keys 里多了一枚 RSA 公钥,注释 mdrfckr;
06:05:50 —— 同一个 IP 又发起一条连接,去试一个乱码用户名 345gs5662d34。

看到这里,我第一反应竟是:“不会是我自己手机干的吧?”——因为那个账户的命令历史里,确实都是些正常的运维操作。我差点就下了“虚惊一场、是我自己”的结论。

02 我差点下错结论

冷静下来一核对,那个“是我”的直觉站不住:

一是口令,不是我的密钥。 我平时登录用的是本机那枚 ed25519 密钥。这次是拿 A 账户的密码登进来的——一个睡得迷糊的人,不会半夜爬起来用密码敲。

二是这个 IP 从来没出现过。 我把 A 账户的历史登录来源全拉了一遍:我常态的办公出口 IP 出现了 29 次,而那处手机蜂窝出口只此一次。一个“自己的手机”,不该是登录史里的孤例。

三是行为不像人。 登录成功 1 秒后,同一个 IP 去试 345gs5662d34 这种乱码用户名——这是自动化工具、扫描器的手笔,不是人。

再加上我彼时确实在睡觉、是醒来才看到告警。结论很清楚:那个人不是我。

03 三个事实打脸了

拼起来,这是一次典型的、未授权登录尝试:

某个来源拿到了 A 账户的口令(怎么拿到的另说——这台机器当天还挨了上百次来自各地的暴破,口令可能就在某个泄露库里),从手机运营商的出口 IP 登进来,进门第一秒就装一枚后门公钥,顺手还扫了一把别的用户名。云厂商的告警,正好把它按在门口。

不是所有“看起来像自己”的,都是自己。

04 所以这是一次真入侵

判明不是自己之后,动作就得按入侵来打,不能当误会轻轻放下:

1. 轮换了 A 账户的口令,让旧的失效;

2. 关掉口令登录,只留密钥——那枚被用掉的口令从此没用了;

3. 轮转了数据库口令(改完当场连了一遍,业务还在);

4. 注释并移除了 mdrfckr 那枚后门公钥,原文件留了备份备查;

5. 用防火墙封掉 41 个境外 IP。

关完门,我又反手查了一遍有没有“第二道后门”:/root/.ssh/authorized_keys 是空的、没有异常监听端口、/etc 近期改动全是这次加固自己留下的、没有新增的系统服务或计划任务。目前看,那次会话只来得及装后门 + 扫用户名,没留下更深的痕迹。

05 我们怎么关的门

那天早上我学到的最实在的一句话,和最初想写的相反:

最好的安全事件,不是虚惊一场;是它真的发生过,而你把它关在了门外。

真正让人踏实的,不是“应该没事”,而是“告警响了我去看了、看了我用证据下了结论、下了结论我把门焊死了”。下次再收到这种告警,我希望自己少一点“大概是我吧”的侥幸,多一点“拿日志说话”的较真。

至于登录方式,这一遭给了我一个很实在的提醒:把口令登录彻底收起来,只走密钥通道。入口收得越窄,留给撞库者的缝隙就越小——这扇门,本来就不该用密码推开。

← 返回码间随笔 码间随笔 · 码不停蹄