Linux服务器安全:自动封禁SSH暴力破解攻击IP
背景介绍
服务器经常会遇到SSH暴力破解攻击,攻击者通过反复尝试不同的密码组合来尝试获取系统访问权限。这种攻击会在系统日志中留下大量失败登录记录。本文提供了在Ubuntu和CentOS系统上自动识别并封禁此类攻击IP的解决方案。
工作原理
本文提供的脚本通过分析系统认证日志,识别出短时间内多次SSH登录失败的IP地址,并将这些IP地址添加到系统的/etc/hosts.deny
文件中,从而阻止这些IP的后续连接请求。
Ubuntu系统脚本
Ubuntu系统的SSH失败登录记录存储在/var/log/auth.log
文件中:
#!/bin/bash
# 脚本功能:分析Ubuntu auth.log日志,封禁多次SSH登录失败的IP
# 使用方法:将脚本保存为ban_ip.sh并添加执行权限 chmod +x ban_ip.sh
# 提取失败登录的IP地址及尝试次数
cat /var/log/auth.log | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2"="$1;}' > /tmp/blackIP.txt
# 设置封禁阈值,超过此次数将被封禁
TRYCOUNT="5"
# 处理每个IP
for i in `cat /tmp/blackIP.txt`
do
# 提取IP地址
IP=`echo $i | awk -F= '{print $1}'`
# 提取失败次数
NUM=`echo $i | awk -F= '{print $2}'`
# 判断失败次数是否超过阈值
if [ $NUM -gt $TRYCOUNT ]; then
# 检查IP是否已经在封禁列表中
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ]; then
# 添加封禁记录,包含时间戳
echo "#"`date` >> /etc/hosts.deny
echo "ALL:$IP:deny" >> /etc/hosts.deny
fi
fi
done
CentOS系统脚本
CentOS系统的SSH失败登录记录存储在/var/log/secure
文件中:
#!/bin/bash
# 脚本功能:分析CentOS secure日志,封禁多次SSH登录失败的IP
# 使用方法:将脚本保存为ban_ip.sh并添加执行权限 chmod +x ban_ip.sh
# 提取失败登录的IP地址及尝试次数
cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2"="$1;}' > /tmp/blackIP.txt
# 设置封禁阈值,超过此次数将被封禁
TRYCOUNT="5"
# 处理每个IP
for i in `cat /tmp/blackIP.txt`
do
# 提取IP地址
IP=`echo $i | awk -F= '{print $1}'`
# 提取失败次数
NUM=`echo $i | awk -F= '{print $2}'`
# 判断失败次数是否超过阈值
if [ $NUM -gt $TRYCOUNT ]; then
# 检查IP是否已经在封禁列表中
grep $IP /etc/hosts.deny > /dev/null
if [ $? -gt 0 ]; then
# 添加封禁记录,包含时间戳
echo "#"`date` >> /etc/hosts.deny
echo "ALL:$IP:deny" >> /etc/hosts.deny
fi
fi
done
自动化部署:结合crontab定时任务
为实现自动封禁功能,可以将脚本设置为crontab定时任务,定期执行:
# 编辑crontab配置
crontab -e
# 添加定时任务,每小时执行一次脚本
0 * * * * /path/to/ban_ip.sh
注意事项
执行脚本前,确保
/etc/hosts.deny
文件存在且有写入权限调整
TRYCOUNT
变量值可以改变封禁阈值该脚本使用TCP Wrappers机制进行封禁,确保系统支持此功能
考虑定期清理
/etc/hosts.deny
文件,避免文件过大
高级配置
可以添加白名单功能,避免误封重要IP
可以设置封禁时限,在一定时间后自动解除封禁
可以加入日志功能,记录封禁历史
相关工具
更强大的SSH防护可以考虑使用以下工具:
Fail2Ban
DenyHosts
CSF (ConfigServer Security & Firewall)
Last updated
Was this helpful?