使用密钥认证替代密码登录

# 本地生成密钥对(推荐 ed25519)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

/etc/ssh/sshd_config 关键配置

# 禁用密码登录,强制密钥认证
PasswordAuthentication no
PermitEmptyPasswords no

# 禁止 root 远程登录
PermitRootLogin no

# 更改默认端口,降低自动化扫描命中率(非核心防护手段,只是降噪)
Port 22022

# 限制协议版本与登录尝试
Protocol 2
MaxAuthTries 3
LoginGraceTime 30

# 仅允许特定用户/组登录
AllowUsers deploy admin

修改后重启服务:

sudo systemctl restart sshd

注意:修改端口或禁用密码登录前,务必保留一个已登录的会话窗口,避免配置错误导致无法远程访问。

使用 fail2ban 防暴力破解

sudo apt install fail2ban
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22022
maxretry = 5
bantime = 3600
findtime = 600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

双因素认证(可选增强)

对高安全要求场景,可结合 libpam-google-authenticator 实现 SSH 二次验证,在密钥认证基础上再叠加一层动态口令。

限制来源 IP

若访问来源固定,建议直接在防火墙层限制 SSH 端口的可访问 IP 段,而非仅依赖应用层配置,具体见《Linux 防火墙配置指南》一文。

小结

SSH 是服务器最重要的入口之一,密钥认证 + 禁用 root 登录 + fail2ban 是性价比最高的三件套,可以覆盖绝大多数暴力破解与凭证泄露风险。