SSH爆破攻击如何防御

wen 网络安全 29

本文目录导读:

SSH爆破攻击如何防御

  1. 最核心、最有效的防御:禁用密码登录,使用密钥认证
  2. 强密码与用户管理(如果必须使用密码)
  3. 更换默认端口
  4. 使用Fail2Ban(最推荐的辅助工具)
  5. 使用防火墙限制来源IP(IP白名单)
  6. 启用SSH日志记录与审计
  7. 其他高级或防御性措施
  8. 快速落地实战步骤

SSH爆破攻击(即暴力破解攻击)是指攻击者通过自动化工具,尝试大量用户名和密码组合来登录你的服务器,防御这种攻击的核心思路是:减少攻击面、增加破解难度、及时阻断与告警

以下是针对不同程度和需求的防御方案,按推荐优先级排序:

最核心、最有效的防御:禁用密码登录,使用密钥认证

这是彻底根除SSH暴力破解的根本方法,密码可以被猜测,但私钥(通常2048位或4096位)在数学上几乎无法暴力破解。

  • 操作步骤:
    1. 生成密钥对(如果还没有): 在你的本地客户端(电脑)上运行 ssh-keygen -t rsa -b 4096
    2. 将公钥复制到服务器: ssh-copy-id username@your_server_ip (或手动将公钥内容追加到服务器的 ~/.ssh/authorized_keys 文件中)。
    3. 修改服务器SSH配置: 编辑 /etc/ssh/sshd_config 文件:
      • PasswordAuthentication no(禁用密码登录)
      • PubkeyAuthentication yes(启用密钥认证)
      • ChallengeResponseAuthentication no(禁用挑战响应认证,通常也建议关闭)
    4. 重启SSH服务: sudo systemctl restart sshd (或 sudo service ssh restart 视系统而定)。

注意: 在修改配置前,务必保持一个已登录的SSH会话未关闭,以防配置错误导致自己无法登录,测试新会话正常后再关闭旧会话。

强密码与用户管理(如果必须使用密码)

如果由于特殊原因(如自动脚本、特定第三方工具)无法完全禁用密码,必须设置高复杂度密码并限制用户。

  • 强密码策略: 要求密码长度至少16位,包含大小写字母、数字和特殊字符,可以使用 pwgen 工具生成随机密码。
  • 禁止root直接登录: 编辑 /etc/ssh/sshd_config,设置 PermitRootLogin no,使用普通用户登录后通过 su -sudo 提权,这极大增加了攻击者猜测“小概率”用户名的难度。
  • 限制特定用户: 设置 AllowUsers your_username,只允许指定的用户通过SSH登录。

更换默认端口

虽然这不是安全防御,但能“静默”地避开大量自动化扫描脚本(它们默认只扫22端口)。

  • 操作:/etc/ssh/sshd_config 中修改 Port 2222(或其他大于1024的非标准端口)。
  • 注意: 这不会阻止针对你新端口的定向攻击,但能减少99%的无差别扫描噪音,你需要更新防火墙规则和本地SSH客户端配置(ssh -p 2222 user@host)。

使用Fail2Ban(最推荐的辅助工具)

Fail2Ban 是一个实时日志监控工具,它监控 /var/log/auth.log(或其他系统日志),发现来自同一个IP的多次失败登录尝试后,会自动修改本地防火墙(如iptables/nftables)规则,临时或永久封禁该IP。

  • 安装: sudo apt install fail2ban (Debian/Ubuntu)或 sudo yum install fail2ban (CentOS/RHEL)。
  • 配置: 复制默认配置 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local,编辑 jail.local 文件,关键是找到 [sshd] 部分,设置:
    • maxretry = 3(尝试3次失败后封禁)
    • bantime = 3600(封禁3600秒,即1小时,-1为永久封禁)
    • findtime = 600(在10分钟内累计达到maxretry次)
  • 效果: 自动、动态地阻断暴力攻击来源IP。

使用防火墙限制来源IP(IP白名单)

如果你的服务器只从特定IP(如公司办公网络、家庭固定公网IP)访问,这是最理想的状态:只允许这些IP连接SSH。

  • iptables/nftables(Linux): sudo ufw allow from 192.168.1.100 to any port 22 (UFW示例) 或 sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
  • 云服务商安全组: 在阿里云、腾讯云、AWS等控制台中,找到服务器的安全组规则,修改SSH(22端口)的 来源IP你的_公网IP/328.8.8/32),这是最推荐的做法,因为防火墙在数据传输到服务器之前就被过滤掉了。

启用SSH日志记录与审计

即使有防御,也建议开启详细日志以便追溯。

  • 操作:/etc/ssh/sshd_config 中设置 LogLevel VERBOSE
  • 监控: 使用 journalctl -u sshdtail -f /var/log/auth.log 实时查看登录尝试,结合 fail2ban 使用效果更佳。

其他高级或防御性措施

  • 端口敲门(Port Knocking): 按顺序访问一组关闭的端口,服务器检测到后才会短暂地开放SSH端口,非常有效,但配置稍复杂。
  • SSH-2 协议限制: 确保只使用 SSH 协议第二版(Protocol 2),禁用不安全的旧版协议。
  • 空闲超时自动断开: 设置 ClientAliveInterval 300ClientAliveCountMax 0,让闲置5分钟以上的连接自动断开。
  • 使用SSH堡垒机/跳板机: 所有SSH连接先到一台配置了严格策略的中间服务器,再跳转到目标主机。

快速落地实战步骤

如果你是普通站长,想快速有效防御:

  1. 第一优先级: 禁用密码登录,只使用密钥 + 修改默认端口(22改到比如 12345)。
  2. 第二优先级: 启用 Fail2Ban
  3. 第三优先级(可选但强烈建议): 在云服务商后台,将SSH端口的白名单设为你的固定公网IP(如果不是固定IP,可配合DDNS或使用VPN服务器)。

最终提醒: 修改SSH配置或防火墙规则时,始终保留一个已连接的SSH会话作为安全通道,避免意外锁死自己,配置完成后,务必重启SSH服务(sudo systemctl restart sshd)。

抱歉,评论功能暂时关闭!