前言
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服务的安全性。
欢迎大家关注我的公众号,将会为大家推荐更优质的内容!