
核心要点(TL;DR)
- SSH 密钥登录 + 禁用密码认证是治本手段,fail2ban 是降低噪音的辅助层。
- 改 sshd_config 前先备份,并保留一个已登录会话验证,避免把自己锁在门外。
- fail2ban 的 findtime、maxretry、bantime 三参数决定拦截强度,需按业务调整。
- 用 sshd -t 校验配置、systemctl reload sshd 平滑生效,比直接重启更安全。
先确认:你是被爆破,还是被误报
登录服务器执行 lastb | head -20 或查看 /var/log/auth.log(Debian/Ubuntu)与 /var/log/secure(CentOS/RHEL),如果看到成片的 Failed password for root、Invalid user admin,来源 IP 遍布全球,那就是典型的 SSH 暴力破解扫描。先别急着改配置,用一条命令统计攻击规模:
grep "Failed password" /var/log/auth.log | awk '{print }' | sort | uniq -c | sort -rn | head输出里单个 IP 动辄上千次失败,说明它已在字典跑库。此时要做的不是换密码,而是把认证方式从「密码」切换到「密钥」,再用 fail2ban 把高频来源挡在门外。
第一步:配置 SSH 密钥登录
在本地机器生成密钥对,推荐 ed25519:
ssh-keygen -t ed25519 -C "ops@example" -f ~/.ssh/id_ed25519
把公钥推送到服务器,没有 ssh-copy-id 时手动追加:
mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "ssh-ed25519 AAAA... ops@example" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
权限是密钥登录失败的头号原因:家目录不能组可写,.ssh 必须 700,authorized_keys 必须 600。改完先别关当前会话,另开一个终端执行 ssh -i ~/.ssh/id_ed25519 user@host 验证能免密登录,再进入下一步。
第二步:修改 sshd_config 禁用密码认证
备份原配置后编辑 /etc/ssh/sshd_config,至少确认以下参数:
| 参数 | 建议值 | 作用 |
|---|---|---|
| PubkeyAuthentication | yes | 启用公钥认证 |
| PasswordAuthentication | no | 关闭密码登录,治本 |
| PermitRootLogin | prohibit-password | root 仅允许密钥 |
| MaxAuthTries | 3 | 限制单连接尝试次数 |
| LoginGraceTime | 30 | 缩短认证等待窗口 |
保存后先校验语法再平滑加载:
sshd -t && systemctl reload sshd
注意部分发行版服务名是 ssh。reload 不会踢掉现有连接,但新连接立即按新策略认证,务必用新窗口验证一次再退出旧会话。
第三步:用 fail2ban 自动封禁高频来源
安装并启用 sshd 监控:
apt install fail2ban -y # CentOS 用 yum/dnf systemctl enable --now fail2ban
不要直接改 jail.conf,新建 /etc/fail2ban/jail.local:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 findtime = 600 bantime = 3600 ignoreip = 127.0.0.1/8 你的办公出口IP
三个参数的含义:findtime 内失败达到 maxretry 次即封禁 bantime 秒。初期用 1 小时观察误封,稳定后可加长到 1 天甚至更久。生效与查看:
fail2ban-client reload fail2ban-client status sshd fail2ban-client set sshd unbanip 1.2.3.4
上线检查清单
- 新窗口能用密钥登录,密码登录被明确拒绝。
sshd -t无报错,服务状态为 active。- fail2ban 的
status sshd能看到当前封禁数与封禁列表。 - ignoreip 已包含本机、办公出口与监控 IP。
- 云主机控制台/VNC 登录方式可用,作为回滚后路。
- 日志轮转正常,避免 auth.log 撑爆磁盘。
如果希望把这类规则集中管理、减少逐台调参,可以在防护建议环节评估 AegisX 的登录防护与异常来源识别能力,与主机侧 fail2ban 形成互补。
行动建议
顺序不要乱:先密钥登录验证通过,再禁用密码认证,最后上 fail2ban 调参。每一步都保留一个已登录会话和一条控制台后路,改完立即用新连接验证。做完这三步,SSH 暴力破解基本只剩日志噪音,服务器暴露面会明显收窄。
常见问题(FAQ)
我已经用密钥登录了,还需要装 fail2ban 吗?
建议装。禁用密码登录后爆破已无法成功,但攻击流量仍会持续消耗连接与日志空间。fail2ban 能自动封禁高频来源 IP,减少 auth.log 噪音并降低扫描面,属于低成本高收益的辅助层。
改了 sshd_config 之后连不上服务器怎么办?
关键是保留后路:修改前用 sshd -t 校验语法,改完用 systemctl reload sshd 平滑加载,并保持当前已登录会话不退出,另开窗口用新配置测试登录。云主机还可通过控制台 VNC 登录回滚配置。
fail2ban 封禁后会不会误伤自己或客户?
有可能。建议把公司出口 IP 与监控 IP 加入 ignoreip 白名单,maxretry 不要设成 1 到 2,bantime 初期用 1 小时观察,确认无误后再加长。使用 CDN 或跳板机时要注意日志中的真实来源 IP。
为什么禁用了密码登录,日志里还有失败记录?
这通常是扫描器在尝试不存在的用户名或旧协议,认证阶段就被拒绝,并不代表密码被猜中。只要 PasswordAuthentication 为 no 且密钥权限正确,这类记录属于正常噪音,配合 fail2ban 封禁即可。
密钥登录后还需要改默认 22 端口吗?
改端口属于降噪手段而非安全核心,能减少大量自动化扫描,但也会增加运维成本与端口管理负担。优先级应是:密钥登录 > 禁用密码 > fail2ban > 改端口,前两项做完再考虑端口调整。