背景提要
最近新搭建的 WordPress 站点,刚好是在搬瓦工自己买的VPS来建站的。这两天就发现我的VPS服务器上有多密码暴力破解登录记录。
# 这个查询 Ubuntu 服务器上尝试 root 密码暴力破解登录失败记录
root@demo-server:/var/log# sudo grep "Failed password for root" /var/log/auth.log.1 | awk '{print $11}' | sort | uniq -c | sort -nr | more
33857 180.101.88.218 # 这个公网地址尝试 33857 输入错入 root 用户密码,就是抓肉鸡
22335 180.101.88.237
8572 61.220.127.240
4569 Failed
864 106.38.105.12
503 218.92.0.24
448 218.92.0.29
448 218.92.0.107
431 218.92.0.27
426 218.92.0.113
422 61.177.172.160
417 61.177.172.185
406 218.92.0.76
396 218.92.0.56
390 218.92.0.34
387 218.92.0.118
372 218.92.0.25
359 180.101.88.247
356 61.177.172.140
350 61.177.172.179
347 218.92.0.108
340 218.92.0.31
330 218.92.0.112
290 218.92.0.22
274 61.177.172.136
117 200.111.136.214
90 185.220.103.114
82 92.222.108.86
有没有感受到公网上都是扫肉鸡的?
分析缘由
正常我们暴露公网上的服务器,每天每时每刻都是经受着互联网上大量的扫描攻击,包括漏洞扫描、密码暴力破解、各种类型漏洞破解等等。因为有很多黑客或是骇客,需要抓肉鸡,然后使用肉鸡来做非法的事情。我们自己的服务器是用来正常对外提供服务的,而不是来沦为这些骇客的肉鸡的。那么又如何避免让自己的服务器变成别人的肉鸡呢?
我的经历和安全加固操作
让我来分享一下我近期的经历,那是关于我自己的公网 VPS 服务器被黑客攻击,沦为他们的肉鸡的故事。我这台公网 VPS 服务器的主要用途是作为 ChatGPT 官网 API 的代理,服务器位于美国。在服务器上运行的只有 Nginx 服务(80/443 端口)和 SSH 服务(22 端口),并没有运行其他多余的服务。
然而,就在昨天,我接到了一通来自英国的电话,对方是一位英语口音的工程师。由于我已经多年没有实际使用过英语口语,这突如其来的英文交流让我有些手足无措。幸运的是,由于我常年阅读英文资料,我还是能理解他的意思。他告诉我,他们发现我的 VPS 服务器近期出现了被攻击的迹象,CPU 资源负载过高,他建议我立即检查服务器,否则可能会面临服务被停止的风险。
听到这个消息,我立刻意识到事情的严重性,我的服务器很可能已经被黑客控制,成为他们的肉鸡。更糟糕的是,这台服务器还在为外部提供服务。我不能坐视他们肆意妄为,破坏我的服务器。
这种感觉就像你家里有宝贝,而有一群强盗一直在觊觎你的财物,甚至有的已经悄悄潜入你的家中进行抢劫。看着自己的宝贝被这些强盗肆意糟蹋,而自己却只能无奈地看着,无法做出有效的反抗,这种感觉,你能理解吗?
我要自卫,要把这些强盗拒之门外。开始搜索加固自己 VPS 的方案。具体有以下两点:
- 加固 SSH 服务
# SSH 服务加固操作包括: 修改 SSH 服务默认端口号、禁用空密码登录、使用公钥认证登录、禁用 root 用户 SSH 登录
# 修改 SSH 服务配置文件
vim /etc/ssh/sshd_config
PermitRootLogin no
MaxAuthTries 6
Port 23697
PasswordAuthentication yes
PermitEmptyPasswords no
PubkeyAuthentication yes
# 重启 SSH 服务
systemctl restart sshd
- 禁止 root 用户远程登录,日常使用普通用户操作
# 创建普通用户用于日常维护远程登录使用
# 创建一个 ops 用户
root@proud-pod-1:~# adduser ops
Adding user `ops' ...
Adding new group `ops' (1000) ...
Adding new user `ops' (1000) with group `ops' ...
Creating home directory `/home/ops' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for ops
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]
# 为 ops 用户配置 sudo 免密操作权限
export EDITOR=vi # 使用 vi 编辑器来修改 sudo 配置
visudo
ops ALL=(ALL) NOPASSWD: ALL
经过上面的 SSH 服务加固和使用普通用户替代 root 用户来远程登录维护,可以避免网络上 85%以上的肉鸡扫描和密码暴力破解攻击。切记在公网服务器使用弱口令,密码必须满足一定的复杂性要求,长度、字符类别、组合复杂度等等,尽量用复杂的口令。
进一步加固,部署 fail2ban 服务将暴力破解破解的攻击源拒之门外
先来简单介绍一下我们下面的主角 Fail2Ban 项目,Fail2Ban 是一个入侵检测系统框架,主要用于保护电脑服务器免受蛮力攻击。就是我前面遭遇的就是网络上每时每刻都在发生的蛮力攻击。
Fail2ban 和 DenyHosts 是类似的工具,可以阻止有人恶意以字典暴力破解密码,通常应用于有开启 sshd、telnetd 和 ftpd 的主机上。Fail2ban 的做法是将超过多次失败连接的 IP 列用 iptables(给 IPv4 使用)或 ip6tables(给 IPv6 使用)禁止该 IP 之后的连接。至于要多久之后可以再允许该 IP 再次连接可以在 Fail2ban 的配置文件内设置。
下面是 Fail2ban 在 Ubuntu 服务器上的部署和配置。
# 安装 fail2ban 软件包
cd /opt
git clone https://github.com/fail2ban/fail2ban.git
cd fail2ban
python setup.py install
# 修改配置文件
vim /etc/fail2ban/jail.conf
## 新增如下配置行
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=jhxt1989@126.com, sender=fail2ban@email.com]
logpath = /var/log/auth.log
# logpath = /var/log/secure
maxretry = 6
## 配置行结束
# 配置服务启动脚本
cp files/debian-initd /etc/init.d/fail2ban
update-rc.d fail2ban defaults
service fail2ban start
# 测试服务是否正常
root@demo-server:/opt/fail2ban# sudo fail2ban-client ping
Server replied: pong
总结
经过以上的安全加固操作,我的公网 VPS 服务器可以抵挡绝大多数的蛮力攻击,对网上的大多数的端口扫描,密码暴力破解攻击都能置之不理,这正是我们要做的,我们的服务器是用来提供服务,而不是给强盗强行拿去当犯罪工具的。这是我们有公网 VPS 服务器的小伙伴必须要有的安全意识,希望上面的总结能对你有帮助。