今天早上我登录我的 VPS,发现该root
用户和其他甚至不存在的用户的数百万次登录尝试失败。我采取了以下措施来试图混淆攻击者的努力(已经持续了几个月)。
问题)
- 这是一个适当的回应吗?
- 还能做些什么?
- 我可以用这些 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
更新
以下是我从答案中采取的措施。
- 禁用根登录
- 更改 SSH 端口
- 安装和配置fail2ban
- 禁用密码验证并启用公钥验证
我实际上并没有做 4,因为我通常通过chrome 安全 shell 客户端连接,而 AFAIK 没有公钥支持。