当我的服务器被恶意攻击后想到的

42 阅读 2569 字 · 约 9 分钟

前天收到一堆告警,腾讯云官方通知说发现频繁的密码破解尝试。点开一看,一堆美国 IP 在试我的主机。用户名轮着换——root、admin、test、ubuntu,能想到的都试了一遍。

第一反应不是慌,是惭愧。SSH 密钥登录、改默认端口、fail2ban 自动封 IP、安全组只放行必要来源,这些手段我都知道。但服务器一直裸奔着,密码登录开着,22 端口大敞,root 能直接登。

不是不知道,是没做。

不是知识问题

我并不是网络安全行业的从业者,但自忖在这方面的知识还不算太少。至少一些基本的防火墙、SSH、应用防护之类的知识还是了解的,运维方面算不上精通,但也还算熟练。

但这丝毫不妨碍我依然会在这上面栽跟头。

因此这并不是知识问题,而是意识、习惯等问题。安全知识不稀缺,搜「服务器安全加固」,文章能看一整天。教材里有,面试题里有,公司培训里也有。但卡住的不是知识,是动力。

做产品容易有一个直觉:价值等于用户能感知到的东西。新功能、新界面、新交互,用户看见了,点到了,反馈了,这就是价值。安全不在用户感知范围内,所以排在优先级最后面。你加固了 SSH,封了恶意 IP,然后呢?什么都不会发生。没人跑来跟你说「今天没被爆破,干得好」。安全理想的状态就是「什么都没发生」,而「什么都没发生」在人的感知里约等于「不需要做什么」。

做了,看不到效果。没做,短期也看不到后果。直到前天那堆告警弹出来。

花了半小时改完所有该改的:关密码登录、换密钥认证、22 端口换掉、fail2ban 装上、安全组收紧到只放行几个 IP。一年的裸奔,半小时补完。执行成本很低,真正高的是启动它的意愿。意愿需要一个触发器,对我来说就是那堆告警。

环卫工人

安全像环卫工人。你走在干净的街道上,不会想「今天扫得真干净」。你甚至不会意识到有环卫工人这回事。但如果连续一周没人扫,垃圾堆起来,味道出来,你立马就感觉到了。

系统正常运行的时候,没人觉得安全做了什么。防火墙拦了攻击,你觉得网络本来就该通。密钥认证挡了爆破,你觉得登录本来就该顺。这些「本来就该」的背后,是一堆你感知不到的工作在兜底。

我的价值观里,安全的价值是反向的。它不创造你能看到的东西,它阻止你看不到的东西。一个没被攻破的系统,和一个做了加固的系统,从外面看一模一样。区别在于没做加固的那个,随时可能从「一模一样」变成「全军覆没」。

被发现

这次能发现,说实话是运气好。我在腾讯云上有几台服务器,幸运的是腾讯云至少有基础的安全检测,帮我及时发现了这些常见的网络攻击。如果我是自己机房里的服务器,那可能被当成肉鸡很长时间都不知道。

这并不罕见。事实上很多服务器正在经历这种攻击、渗透和挟持而不自知。这也是为什么我们经常能看到大量的数据泄漏新闻——不是攻击突然变多了,是一直在发生,只是有的被发现了,有的没有。

自己暴露的信息

被爆破吓到之后,我开始回头想,哪些行为可能泄露了自己的信息。

GitHub 上有些 public repo,某些 commit 里可能包含了自己的 IP、用户名。以前觉得无所谓,放着就放着。但在 AI 能力的加持下,恶意的攻击者们可以很轻松地扫描、识别并利用这些信息进行攻击。你的 IP、你的用户名、你的端口,拼起来就是一条攻击路径。

还有一件为了方便起见干的事:我开启了各个云服务器之间的免密登录。一台被攻破,其他几台跟着沦陷。方便是方便了,但攻击面也跟着放大了。

不只是服务器的事

我能想到的这些恶意行为,目前还只是在攻击我的服务器。所幸上面并没有特别有价值的信息,而且我也可以随时关掉它们并进行恢复。

但这只是对我当下的处境。

如果它们攻击的是我的应用服务呢?如果我的服务是生产环境呢?如果我的服务是公开给很多用户的呢?后果不堪设想。

服务器被攻破,大不了重装。但生产环境的数据被拖走,用户隐私被泄露,那是用「重装」补不回来的。我这次能轻描淡写地说「随时关掉恢复」,是因为运气好,攻击面只到了服务器层。下次不一定。

过犹不及

也有另一种极端。把服务器封成铁桶——所有端口关掉,只用 VPN 内网访问,每次登录双因素认证,密码三十天强制换一次,换的时候不能跟前十二次相似。安全是安全了,用起来累。

我被爆破吓到之后想过这些措施,但是想想太累。每次连服务器先开 VPN,再过双因素,再输密码,想想就觉得折腾,就为改一个配置文件。安全措施的摩擦力一旦大到影响正常使用,反而会让人偷懒——该改的配置拖着不改,因为登上去太麻烦了。

安全做到够用就行,关键是找到风险和可用性之间你自己能接受的那个点。我的服务器上没什么值钱的东西,博客数据有备份,数据库有快照,被攻破了恢复一遍,损失的是时间不是数据。所以我的策略是挡住自动化批量扫描就行,不防针对性高级攻击。密钥认证加 fail2ban 够了,VPN 和双因素对我这个场景太重。

每个人的平衡点不一样,取决于你服务器上跑着什么,丢了什么最心疼。

隐性成本

这次实际做的事情比单纯加固 SSH 要多一些:移除了服务器之间的免密互通、清理了可能暴露 IP 等信息的记录、修改了密码、重新生成了密钥。很多云厂商尽管也提供类似 WAF 之类的服务和基础的防护能力,但是要么花钱,要么覆盖不全面。开发者还是要对自己的应用服务负责,不能完全依赖第三方。

当我们开发系统时,这部分隐性的安全加固成本也是不容忽略的,尤其是面向外部开放的时候。

安全是常态化的

这次加固完,松了一口气。但这种安心感是有保质期的。

安全是常态化的工作,不是一次性做完就不管的工作。这也是为什么企业产品都会有主动的漏洞扫描、安全巡检、安全升级等制度。今天封住的口子,明天可能因为一次更新又开了。这次加固完不管了,过半年跟裸奔也没太大区别。

这也提醒着我们:数据安全是理想,泄漏是常态。攻击者一直在找新的入口,防守者总有漏的时候。企业靠制度和流程把安全变成日常,个人开发者没有这套制度,只能靠自觉——但自觉这东西,前面已经验证过了,不太靠谱。

被打醒总比被打穿好

这次被爆破,说到底是好事。一堆告警弹出来,等于免费做了一次安全演练。如果等到真被打穿,数据被删、服务被挂马、被拿来当肉鸡挖矿,那成本就不是半小时能补回来的了。

挨一刀但不致命,反而能让人长记性。怕的是从来没挨过刀,以为自己刀枪不入。

我的服务器现在不裸奔了。但说实话,如果没有那堆告警,我大概率还是不会动。知和行之间隔着一个触发器,对我来说就是那堆告警。