标题:SSH 防爆破:动态拉黑恶意IP 出处:沧海一粟 时间:Mon, 20 Jan 2025 09:53:42 +0000 作者:jed 地址:http://www.dzhope.com/post/1291/ 内容: 前言 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服务的安全性。 Generated by Bo-blog 2.1.1 Release