如何应对单个 VPS 上的 SSH 暴力攻击?

信息安全 防火墙 SSH 蛮力 事件响应
2021-08-20 07:21:07

今天早上我登录我的 VPS,发现该root用户和其他甚至不存在的用户的数百万次登录尝试失败。我采取了以下措施来试图混淆攻击者的努力(已经持续了几个月)。

问题)

  1. 这是一个适当的回应吗?
  2. 还能做些什么?
  3. 我可以用这些 IP 列表做些什么有价值的事情?

Centos7 vps 的系统信息

uname -a
inux vm01 3.10.0-327.22.2.el7.x86_64 #1 SMP Thu Jun 23 17:05:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

步骤1

创建了一个脚本来从安全日志中获取所有无法登录的 IP 地址。( /var/log/secure)

# get_ips.sh
grep "Failed password for" /var/log/secure \
| grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" \
| sort \
| uniq -c

第2步

编写一个脚本来创建防火墙规则,以阻止从步骤 1 中的脚本中找到的 ip 地址。这个脚本是 ip_list_to_rules.sh

#!/bin/bash
# ip_list_to_rules.sh
# script to parse output of get_ips.sh and create firewall rules
# to block ssh requests

if [ -z $1 ]; then
  echo "arg1 must be path to a list of the form <COUNT> <IP>\n"
  exit
fi

LIST=$(readlink -f $1)
SSH_IP=$(echo $SSH_CLIENT | head -n1 | awk '{print $1;}')

echo "Reading IPs from ${LIST}"
echo "SSH Client IP will be ignored (${SSH_IP})"

while read COUNT IP; do

  echo "Creating rule for ${IP}"
  firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -m tcp --source $IP -p tcp --dport 22 -j REJECT
  firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -m tcp --source $IP/24 -p tcp --dport 22 -j REJECT

done<<<"$(cat ${LIST} | grep -v ${SSH_IP})"

第 3 步

全部运行并保存规则。

./get_ips.sh > attack_ips.list
./ip_list_to_rules.sh attack_ips.list
firewall-cmd --reload

更新

以下是我从答案中采取的措施。

  1. 禁用根登录
  2. 更改 SSH 端口
  3. 安装和配置fail2ban
  4. 禁用密码验证并启用公钥验证

我实际上并没有做 4,因为我通常通过chrome 安全 shell 客户端连接,而 AFAIK 没有公钥支持。

4个回答

是的,这是一种完全合理且常见的方法。但是,您重新发明了 fail2ban您可能想改用它,这样您就不必调试脚本的问题,并且可以利用现有的 ssh、apache 和其他常见服务过滤器。

不幸的是,您对这些 IP 无能为力。您可以尝试将活动报告给为其 IP 块列出的滥用联系人,但除非他们做更严重的事情,否则这并不值得您花时间。

您还应该进行标准的 ssh 强化,例如禁用基于密码的登录和 root 登录,除非您绝对需要它们。

保护 SSH 系统的最有效方法是仅使用 ssh 私钥登录。您应该禁用密码验证并禁止直接 root 登录。在那之后,您仍然会遇到许多失败的身份验证尝试,但是在地狱蛮力攻击者中没有机会成功。

如果你想在这之后保持你的日志干净,你应该把你的 SSH 端口移动到一个不同的端口号。

看到一百万次失败的登录尝试可能会令人生畏,但老实说,这些尝试使用的带宽和处理能力......是微不足道的。

所以真正的问题变成了,您的系统是否安全:

  • 您是否禁用了root登录?
  • 您是否禁用密码身份验证以支持 pub 密钥?
  • 您是否更改了 VPS 上 sshd 服务的默认端口?

所有这些更改都可以在 /etc/ssh/sshd_config 文件中完成(确保在进行更改后重新启动 sshd)

您可以使用 fail2ban 或一些自定义脚本在防火墙上阻止这些 IP,但 sshd 身份验证本身就足够安全了……增加更多复杂性并不一定更安全,而且很可能会导致您意外锁定自己退出vps。

正如其他人所提到的。Fail2ban 具有相当苛刻的规则(例如:3 个错误密码或尝试使用不存在的用户登录)可能非常有效。

我还建议将 SSH 移动到非标准端口。当然,这对抵御任何类型的智能攻击毫无帮助,但它确实淘汰了最基本的自动扫描仪,其中有不少。

如果你将它与检测端口扫描的东西结合起来,并将其与 fail2ban 连接起来,你甚至可以抵御相当大一部分的扫描仪、僵尸网络和其他垃圾。