前段时间,公司一台测试环境服务器出现了异常情况。最开始我们只是感觉机器偶尔会卡顿,CPU负载会莫名其妙升高几分钟,但很快又恢复正常。因为业务访问量不大,应用日志里也没有明显报错,所以一开始并没有太在意。
直到有一天排查另一个问题时,我顺手查看了一下系统认证日志,才发现这台服务器正在遭受持续不断的SSH暴力破解攻击。
执行查看命令后:
grep "Failed password" /var/log/secure
满屏都是类似这样的记录:
Failed password for root from xxx.xxx.xxx.xxx
Failed password for admin from xxx.xxx.xxx.xxx
Failed password for test from xxx.xxx.xxx.xxx
几乎每隔几秒钟就会出现一次登录失败记录。
那一刻我突然意识到,原来服务器暴露在公网之后,并不是等别人盯上你才会被攻击,而是从开放端口的那一刻开始,就已经进入了各种自动化扫描工具的视野。
为什么SSH会成为攻击重灾区?
很多开发和运维都有一个误区,认为自己的业务规模不大,服务器数量不多,黑客不会专门攻击自己。
事实上,现在绝大多数网络攻击根本不是人工发起的,而是自动化程序在全网范围内不断扫描。
这些扫描程序会持续探测公网IP开放的端口。当发现22端口开放时,就会自动尝试各种常见用户名和密码组合。例如:
-
root
-
admin
-
test
-
ubuntu
-
oracle
以及各种弱密码字典。
攻击者甚至不关心你是谁,他们只是不断尝试。对于他们来说,只要成功控制一台服务器,这次扫描任务就已经有价值了。
一天两万次尝试,远比想象中夸张
为了确认攻击规模,我统计了一下失败登录记录。
结果发现,仅仅一天时间,服务器就遭遇了超过两万次登录尝试。
攻击源来自多个国家和地区,而且尝试的用户名远远不止root。
除了常见账号之外,还出现了:
-
mysql
-
postgres
-
git
-
ftp
-
deploy
甚至一些业务账号名称。
这说明如今的自动化攻击工具已经相当成熟,会根据不同服务自动切换攻击策略。
如果服务器存在弱密码或者密码泄露问题,被攻破可能只是时间问题。
真正危险的是侥幸心理
很多企业服务器的安全配置其实并不复杂:
-
Root允许远程登录
-
使用密码认证
-
密码多年不修改
-
SSH直接暴露公网
这些问题单独看似乎都不严重。
但当它们同时存在时,就会成为攻击者最喜欢的目标。
安全领域有一句很现实的话:
不是会不会被扫描,而是什么时候被扫描。
只要服务器开放在公网环境,扫描几乎是必然发生的事情。
发现问题后需要做什么?
确认存在暴力破解行为后,我们立即进行了几项整改。
首先关闭SSH密码认证:
PasswordAuthentication no
统一改用密钥登录。
其次关闭Root远程登录:
PermitRootLogin no
改用普通运维账号配合sudo进行权限管理。
随后增加访问控制策略,只允许办公网络和VPN出口访问SSH端口。
最后增加异常登录监控。当同一IP在短时间内出现大量认证失败时,自动触发告警。
这些调整并不复杂,但安全性提升非常明显。
安全建设关键在基础配置
经历这次事件之后,我对安全有了新的认识。
以前总觉得安全建设是一件很复杂的事情,需要防火墙、WAF、安全设备、漏洞扫描平台等各种工具。
但真正接触实际运维之后才发现,很多安全问题恰恰来自最基础的配置错误。
例如:
-
弱密码
-
开放公网端口
-
权限配置不规范
-
漏洞长期不修复
-
缺少日志审计
攻击者往往不会先挑战最难的目标,而是优先寻找最容易得手的目标。
所以真正有效的安全建设,往往是先把这些基础工作做好。
中小企业更容易忽略哪些风险?
经过这次事件,我意识到安全不是装个杀毒软件就能解决的事,而是需要持续关注的日常。尤其是服务器访问控制、弱密码检测、异常登录监控这些基础项,如果靠人工定期检查,很容易遗漏。
后来我和同行聊到这个问题,了解到有些运维服务商会把这些安全检查做成标准化服务。比如江苏立维在提供云运维和应用运维服务时,会将服务器安全巡检、异常登录监测、监控告警以及业务稳定性分析纳入日常运维体系。其旗下OPSEYE监控平台除了监控服务器运行状态外,还能够帮助企业持续发现异常访问行为、SSH暴力破解、端口暴露等潜在风险。这种方式对于没有专职安全运维的小团队来说,确实挺省心的。
SSH暴力破解最终没有造成损失,但它让我重新理解了一件事:
真正的安全从来不是出了问题之后再补救,而是在问题发生之前,把那些最容易被忽略的风险提前发现并解决。
很多时候,攻击者并不比你聪明。他们只是比你更早发现了漏洞。