SSH 防爆破:动态拉黑恶意IP 不指定

jed , 2025-1-20 09:53 , 服务器技术 , 评论(0) , 阅读(54) , Via 本站原创 | |
前言
SSH(Secure Shell)是用于安全远程登录和管理服务器的协议,但其广泛使用也使其成为攻击者暴力破解的目标。SSH爆破攻击是指攻击者通过不断尝试用户名和密码组合,试图破解服务器的登录凭证。这种攻击不仅会消耗服务器资源,还可能导致系统被入侵。因此,采取有效的措施防止SSH爆破攻击至关重要。

实现方式
在Linux系统中,/etc/hosts.allow和/etc/hosts.deny文件用于控制对服务的访问权限。这两个文件的规则基于TCP Wrapper机制,允许系统管理员定义哪些IP地址或主机可以访问特定服务(如SSH)。

/etc/hosts.allow:定义允许访问服务的IP地址或主机。

/etc/hosts.deny:定义禁止访问服务的IP地址或主机。

当两个文件同时存在时,/etc/hosts.allow的规则优先于/etc/hosts.deny的规则。如果某个IP地址在/etc/hosts.allow中被允许访问,那么即使它在/etc/hosts.deny中被拒绝,它仍然可以访问服务。

如果 /etc/hosts.deny 文件为空,所有IP地址都可以访问SSH。

如果 /etc/hosts.deny 文件包含拒绝规则(如 sshd: ALL),则所有IP地址默认被拒绝,除非它们在 /etc/hosts.allow 中被明确允许。

监控并动态更新黑名单
为了动态检测并阻止恶意IP地址,可以编写一个简单的Shell脚本,监控SSH登录失败的日志,并将多次尝试失败的IP地址自动加入 /etc/hosts.deny 文件。


#!/bin/bash

# 配置参数
LOG_FILE="/var/log/auth.log"  # Debian/Ubuntu的SSH日志文件路径
MAX_ATTEMPTS=5                # 允许的最大失败尝试次数
TEMP_FILE="/tmp/ssh_blacklist.tmp"  # 临时文件存储IP尝试次数
LAST_POS_FILE="/tmp/ssh_last_pos.tmp"  # 记录上次处理的日志位置

# 获取上次处理的日志位置
if [ -f "$LAST_POS_FILE" ]; then
    LAST_POS=$(cat "$LAST_POS_FILE")
else
    LAST_POS=0
fi

# 获取当前日志文件大小
CURRENT_POS=$(stat -c %s "$LOG_FILE")

# 如果日志文件没有更新,直接退出
if [ "$CURRENT_POS" -le "$LAST_POS" ]; then
    exit 0
fi

# 从上次位置开始解析日志
tail -c +$((LAST_POS + 1)) "$LOG_FILE" | while read line; do
    if echo "$line" | grep -q "Failed password"; then
        IP=$(echo "$line" | awk '{print $11}')
        if [ -n "$IP" ]; then
            ATTEMPTS=$(grep -c "$IP" "$TEMP_FILE")
            if [ "$ATTEMPTS" -ge "$MAX_ATTEMPTS" ]; then
                # 检查IP是否已在黑名单中
                if ! grep -q "$IP" /etc/hosts.deny; then
                    echo "sshd:$IP" >> /etc/hosts.deny
                    echo "IP $IP 已加入黑名单,禁止登录。"
                fi
            else
                echo "$IP" >> "$TEMP_FILE"
            fi
        fi
    fi
done

# 更新日志位置
echo "$CURRENT_POS" > "$LAST_POS_FILE"

将上述脚本保存为 ssh_blacklist.sh并赋予执行权限:


chmod +x ssh_blacklist.sh

手动运行脚本或通过定时任务定期运行:


# 手动执行

./ssh_blacklist.sh

# 设置定时任务执行
crontab -e
添加以下内容:


# 每 5 分钟执行一次检测
*/5 * * * * /path/to/ssh_blacklist.sh

通过合理配置 /etc/hosts.allow 和 /etc/hosts.deny 文件,结合简单的Shell脚本监控SSH登录失败日志,您可以实现一个基本的SSH黑名单机制,有效拦截异常IP地址,防止暴力破解攻击。这种方法简单易行,适合大多数Linux系统,能够显著提高SSH服务的安全性。
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]