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

注意事项

  1. 执行脚本前,确保/etc/hosts.deny文件存在且有写入权限

  2. 调整TRYCOUNT变量值可以改变封禁阈值

  3. 该脚本使用TCP Wrappers机制进行封禁,确保系统支持此功能

  4. 考虑定期清理/etc/hosts.deny文件,避免文件过大

高级配置

  • 可以添加白名单功能,避免误封重要IP

  • 可以设置封禁时限,在一定时间后自动解除封禁

  • 可以加入日志功能,记录封禁历史

相关工具

更强大的SSH防护可以考虑使用以下工具:

  • Fail2Ban

  • DenyHosts

  • CSF (ConfigServer Security & Firewall)

Last updated

Was this helpful?