SSH 被暴力破解怎么办?fail2ban 与密钥登录加固实操 核心要点图解,SSH 被爆破先看日志确认来源,再上 fail2ban 自动封禁,最后用密钥登录关掉密码入口。;fail2ban 的 jail 要绑定真实日志路径与 sshd 端口,改端口后必须同步修改。;密钥登录加固核心是 PasswordAuthentication no,改前先验证密钥可登录,避免锁死自己。;加固后用 lastb 与 fail2ban-client status 复查,确认封禁生效且无异常登录。
SSH 被暴力破解怎么办?fail2ban 与密钥登录加固实操 · 核心要点一图读懂(AegisX)

核心要点(TL;DR)

  • SSH 被爆破先看日志确认来源,再上 fail2ban 自动封禁,最后用密钥登录关掉密码入口。
  • fail2ban 的 jail 要绑定真实日志路径与 sshd 端口,改端口后必须同步修改。
  • 密钥登录加固核心是 PasswordAuthentication no,改前先验证密钥可登录,避免锁死自己。
  • 加固后用 lastb 与 fail2ban-client status 复查,确认封禁生效且无异常登录。

早上打开终端,/var/log/auth.log 里刷出成百上千条 Failed password for root,来源 IP 遍布全球——这是绝大多数公网服务器的日常。SSH 被暴力破解本身不可怕,可怕的是弱口令被猜中后无人察觉。本文面向要立刻动手的运维和站长,给出从定位到加固的完整实操:先用 fail2ban 自动封禁高频失败来源,再用密钥登录彻底关掉密码入口,最后用检查清单确认没有把自己锁在门外。

一、先定位:爆破来自哪里、打了哪些账号

不要急着改配置,先看清攻击面。多数发行版的 SSH 日志在 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL 系),使用 systemd-journald 的系统也可直接查 journal。

# 统计失败登录来源 IP Top10
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head

# 统计被尝试的用户名
grep "Failed password" /var/log/auth.log | awk '{print $(NF-5)}' | sort | uniq -c | sort -rn | head

# 查看成功登录记录,确认是否有陌生 IP
last -i | head -20

重点看两件事:被尝试最多的用户名是否是真实存在的账号(如 root、admin、你的业务用户名),以及 last 中是否出现陌生来源的成功登录。若发现陌生成功记录,先按后文的应急步骤处理,再继续加固。

二、fail2ban:把高频失败来源自动挡在门外

fail2ban 通过读取日志匹配失败模式,超过阈值即调用防火墙封禁 IP。安装后不要直接改 jail.conf,应新建 jail.local 覆盖,避免升级被重置。

# Debian/Ubuntu
apt install fail2ban -y
# RHEL/CentOS
# yum install epel-release -y && yum install fail2ban -y

cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 你的办公固定IP

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
EOF

systemctl enable --now fail2ban
fail2ban-client status sshd

关键点有三个:port 必须与 sshd 实际端口一致,改过端口的服务器要同步修改;logpath 在 journal 系统上由 %(sshd_log)s 自动解析,若日志路径特殊需手动指定;ignoreip 务必加入自己的固定出口 IP,防止误封。执行 fail2ban-client status sshd 能看到 Currently banned 列表才算生效。

三、密钥登录:从认证方式上消除密码猜测面

fail2ban 只是限速,弱口令仍可能被低频爆破猜中。真正有效的是改用密钥认证并关闭密码登录。先在本地生成密钥并上传:

ssh-keygen -t ed25519 -C "ops@example"
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# 验证密钥可登录后再改服务端
ssh -i ~/.ssh/id_ed25519 user@server

确认密钥登录成功后,编辑 /etc/ssh/sshd_config(或 sshd_config.d/ 下的片段):

PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
LoginGraceTime 30
AllowUsers deploy ops

改完先做语法检查再重载,避免配置错误导致 sshd 起不来:sshd -t && systemctl reload sshd。注意保持当前会话不要退出,另开终端验证新连接可登录,再关闭旧会话。AllowUsers 建议只保留实际使用的账号,缩小攻击面。

四、加固后的复查与应急清单

加固不是改完配置就结束,需要验证封禁与认证都在按预期工作:

  • 执行 fail2ban-client status sshd,确认 banned 列表有记录、日志路径正确。
  • 执行 lastb | head 查看失败登录是否仍在增长,结合 last 确认无陌生成功登录。
  • 检查 ~/.ssh/authorized_keys 是否只有自己的公钥,权限应为 600,家目录 700。
  • 排查 crontab -l、/etc/cron.d/ 与 systemd 单元是否有异常任务。
  • 若怀疑已失陷:立即更换密钥对、封禁来源 IP、检查 /etc/passwd 新增账号并保留日志取证。
措施作用是否可单独依赖
fail2ban自动封禁高频失败 IP,降低爆破频率否,低频爆破可绕过
密钥登录消除密码猜测面,认证强度高是,建议作为主防线
改端口减少扫描噪音,非安全边界否,仅作辅助

在边界防护上,如果服务器前有云防火墙或 WAF,可把 SSH 管理端口限制为固定办公 IP 白名单,与 fail2ban 形成互补;AegisX 的访问控制与登录审计能力也可用于集中查看异常登录来源,减少逐台翻日志的成本。

五、行动建议:今天就能做完的三步

第一步,跑一遍日志统计命令,确认爆破规模与被尝试账号;第二步,部署 fail2ban 并把办公 IP 加入 ignoreip,观察一天封禁列表;第三步,在验证密钥可登录的前提下关闭密码认证并收紧 AllowUsers。三步完成后,SSH 暴力破解日志会明显下降,剩下的零星尝试交给 fail2ban 自动处理即可。

常见问题(FAQ)

fail2ban 装了但 IP 还是能一直尝试登录,是哪里没配对?

多半是 jail 没绑定真实日志或端口不一致。先确认 sshd 日志路径(/var/log/auth.log 或 journal),再检查 jail.local 中 logpath、port 与实际一致;用 fail2ban-client status sshd 看当前封禁列表,若为空说明规则未命中,可临时调低 maxretry 验证。

改成密钥登录后,怎么避免把自己锁在服务器外面?

关键是先验证再关闭密码。保持当前会话不断开,另开一个终端用密钥登录成功,再修改 PasswordAuthentication no 并 reload sshd;同时确认防火墙未拦 22 端口、密钥权限为 600、家目录权限正确,确认无误后再退出旧会话。

SSH 端口改成非 22 后 fail2ban 不封禁了怎么办?

fail2ban 的 jail 配置里 port 必须同步改成新端口,否则封禁规则会下错位置。修改 jail.local 中 [sshd] 的 port 字段,执行 fail2ban-client reload,再用 fail2ban-client status sshd 确认监听端口与规则生效。

只做 fail2ban 不做密钥登录够不够?

不够。fail2ban 只能降低爆破频率,无法阻止弱口令被猜中,且分布式低频爆破可绕过阈值。密钥登录从认证方式上消除密码猜测面,两者叠加才有效;建议同时禁用 root 直接登录并限制可登录用户。

怎么确认服务器已经被爆破成功过?

重点看成功登录记录与异常会话。用 last 与 lastb 对比成功/失败登录,检查 auth.log 中 Accepted 记录来源 IP 是否陌生,排查 authorized_keys 是否被追加未知公钥、crontab 与 systemd 是否有异常任务,发现可疑立即改密钥并封禁来源。