前几日笔者的朋友,也即本工作室的另一成员 Roy 在聊天软件中向我发送了如下图片:
在搭建本网站的工作中,我主要负责的是前端的设计。因此对于服务器以及后端的各种技术不甚了解。最开始,我并不知道这些文字是什么意思。后来一番询问后才得知,这是服务器登陆失败的记录。当时大吃一惊,因为这些记录密密麻麻的有很多行,几乎每天每时每刻都会有陌生 IP 尝试登陆服务器。
后来经过一番查询才得知,这种行为其实是非常常见的。攻击者会通过一些自动化的扫描工具,例如 masscan, zmap 等对全网进行扫描,以试图找到那些开放了 SSH 端口的服务器,并通过暴力破解尝试登陆。如果服务器采用了弱密码,后果将不堪设想。
虽然本工作室服务器的 root 用户采用的是随机生成的密码,若要暴力破解得花上相当长的时间,不过这也不能代表能就此高枕无忧。为了谨慎起见,我又到网上去了解了一些基本的网络安全知识,并学习了几种应对这类现象的常见防御手段。
第一点便是有针对性地封锁 IP。通过命令lastb | awk '{print $3}' | sort | uniq -c | sort -nr | head -20,可以筛选并排序出 lastb 记录里失败次数排名前 20 的 IP 地址。而fail2ban则会自动监控 SSH 登陆失败的记录,例如相同 IP 连续登陆失败 5 次,对其进行临时封禁。
第二种方法是更换 SSH 使用的端口。SSH 默认会使用端口 22,而切换成其他的端口就可以大大减小被自动化扫描的几率。
第三种是在 SSH 连接时采用密钥的方式认证,而非密码。比起传统的密码,这种方式安全性更强。首先可以通过命令ssh-keygen -t rsa -b 4096来生成密钥对,也即是id_rsa.pub(公钥)和id_rsa(私钥)这两个文件。公钥就相当于家里用的密码锁,而私钥就相当于打开这把锁的钥匙。密码锁大家都能看到,但没有正确的钥匙就无法打开。在登陆服务器时,服务器会通过公钥加密一串随机的信息,要求私钥持有者解密这串信息。唯有正确的私钥持有者才能解密出正确的信息,服务器才会允许登陆。
在升级了我们的防御措施之后,我也开始对那些“名列前茅”的 IP 产生了兴趣。又是一番学习后,得知通过 WHOIS 查询可以得知有关该域名的诸多信息。例如,我在lastb记录中发现了有几条 IP 的登陆失败次数完全一致,而且IP地址也高度相似。当时便怀疑攻击者是否是使用了代理服务器或者 VPN 。而在查询后验证了这一猜想,攻击者的确是通过代理服务器发动了分布式攻击。除此之外,通过 ipinfo 还可以进一步查询到该IP精确到街道级的信息。而这一查才发现,攻击者真是来自五湖四海,全球各地。而从登陆失败用的用户名中也可见一斑,其中不乏例如 muhamed 和 ahmed 这类极具地域特色的名字。
这次的经历得以让我对网络安全这一领域初窥门径。以前偶尔会在新闻上听说各式各样某服务器用户数据泄露等等新闻。当时只觉得挺遥远。而现在,这类事件就近在眼前,也促使我开始了解这一领域的一些基础知识。这仅仅是冰山一角,后续随着网站的规模越来越大,要面临的安全问题肯定也不止如此,比如 XSS 注入,DDoS 等等。这篇文章就当作是记录我在这条路上的学习历程和心得感悟吧。