新服务器开机第一天,建议你执行一条命令看看这个世界的真实恶意:
lastb | head -20
# lastb 读的是 /var/log/btmp,记录所有登录失败的尝试
# 新机器跑上几小时,轻轻松松几千条
# root、admin、test、ubuntu……全自动脚本按字典轮着试
这些是全网扫描 22 端口的爆破机器人,你的服务器只要暴露在公网上就一定会被扫。密码认证开着的时候,机器人在和你的 root 密码玩概率游戏——密码再复杂也架不住每天几万次尝试。这篇讲两板斧:第一斧关掉密码登录只留密钥,让爆破在数学上不可行;第二斧装 fail2ban,把反复试错的 IP 直接封进小黑屋。先划边界:《CC 攻击与小流量打压应急:limit_req 与 fail2ban 联动》的 limit_req 管 HTTP 层的 CC 攻击,这篇管 SSH 层,两者互不替代。
第一步,在你自己的电脑上生成密钥对(Windows 用 PowerShell,Mac/Linux 用终端):
# 生成ed25519密钥对(比RSA更现代,密钥更短更安全)
ssh-keygen -t ed25519 -C "my-server-key"
# 一路回车用默认路径 ~/.ssh/id_ed25519
# passphrase 建议设一个,密钥文件泄露时还有第二道防线
# 把公钥传到服务器(一条命令搞定)
ssh-copy-id root@你的服务器IP
# Windows没有ssh-copy-id的话,手动把 ~/.ssh/id_ed25519.pub
# 的内容追加到服务器的 /root/.ssh/authorized_keys
传完先验证:开个新终端窗口,用 ssh root@IP 登录,不再问密码(或只问 passphrase)说明密钥通了。这一步千万别跳过——接下来要关密码登录,密钥没通就关,你会把自己锁在门外。
第二步,修改 SSH 服务端配置。编辑 /etc/ssh/sshd_config:
# /etc/ssh/sshd_config 关键项
# 禁止root用密码登录(密钥登录root仍可用)
PermitRootLogin prohibit-password
# 全局关闭密码认证——核心开关
PasswordAuthentication no
# 挑战应答也一并关掉
KbdInteractiveAuthentication no
# 空密码账户禁止登录
PermitEmptyPasswords no
# 可选:改端口降低扫描噪音(22 -> 52222之类的高位端口)
# 改了之后记得防火墙同步放行新端口!
Port 52222
关于改端口多说一句:这是一道有争议的防线。真正的攻击者用 nmap 一扫就知道你的新端口,它挡不住针对性攻击,但能把全网的批量噪音扫描挡掉九成——lastb 日志立刻清爽,对判断真实入侵企图反而更有利。改不改看你取舍,改的话防火墙规则记得先放行新端口再重启 sshd,顺序反了就是自锁。用 IPv6 的话还有个附加项 AddressFamily any 检查一下。改完重载服务并用新参数测试:
sudo systemctl reload sshd
# 验证:新开终端测试(保留旧会话别退出!)
ssh -p 52222 root@你的服务器IP
# 通了再去关旧会话
第三板斧,fail2ban。它的原理是盯着认证日志,同一个 IP 短时间失败超过阈值就调用防火墙封禁一段时间。安装配置:
# Ubuntu/Debian
sudo apt install fail2ban -y
# 不要直接改jail.conf,官方约定写jail.local覆盖
sudo tee /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
port = 52222
# 10分钟内失败5次
maxretry = 5
findtime = 600
# 封禁1小时(屡犯加重:bantime.increment = true会翻倍增长)
bantime = 3600
bantime.increment = true
EOF
sudo systemctl enable --now fail2ban
验证 fail2ban 工作状态:
sudo fail2ban-client status sshd
# 输出里看三个数:
# Currently banned / Total banned —— 已经封了多少IP
# Total failed —— 拦下的失败尝试总数
# 手动解封误伤的IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
几个容易翻车的点记一下。第一,关密码认证前确认密钥验证通过,且旧 SSH 会话保持不断开,新开窗口测试成功再退出——这是所有 SSH 操作的铁律。第二,改了 sshd 端口,fail2ban 的 jail 里 port 必须同步改成新端口,不然 fail2ban 盯着 22 端口的日志,新端口的爆破它根本看不见。第三,云服务器安全组那一层也要同步:改端口后安全组放行新端口、关掉 22,任何一层漏了都连不上。第四,PasswordAuthentication no 会让所有没配密钥的用户无法登录,如果服务器上还有别的账号需要登录,先给它们都配上密钥再关。
做完这两板斧,你的服务器在 SSH 层面已经超过绝大多数裸奔机器:密钥认证让爆破在数学上不可行(ed25519 密钥空间不是试得完的),fail2ban 让剩下扫端口的噪音连日志都刷不起来。《UFW防火墙十分钟入门:先立规则再开门,别把自己锁外面》接下来把 UFW 防火墙立起来,把没用的端口统统关掉,加固三件套就齐了。
相关阅读:SSH 是安全组的第一项,也是总纲里优先级最高的勾。《性能与安全加固总清单:按这张表打勾,新站48小时达到生产水准》安全组五篇从入口到证书层层设防,本篇是第一道门。
A5创业网 版权所有