SSH 安全加固实战:密钥认证与登录防护配置

适用场景

SSH 安全加固适用于所有通过 SSH 远程管理的 Linux 服务器,包括云服务器、物理机和容器宿主机。凡是暴露在公网、存在密码登录、或曾遭遇暴力破解日志的服务器,都应将本文的加固措施作为基线配置。对生产环境执行前,务必先在测试机验证,避免误锁远程登录通道。

前置条件

  • Linux 服务器,具备 root 或 sudo 权限,SSH 服务正常(OpenSSH 7.x 及以上版本)
  • 本机已生成 SSH 密钥对(ssh-keygen -t ed25519),公钥可上传至服务器
  • 有可用的备用登录通道(如云厂商 VNC/控制台),防止配置错误后无法回退

原理说明

SSH 安全加固的核心思路是「收缩攻击面 + 收紧认证策略」。默认 sshd_config 允许 root 密码登录、密码重试无次数限制,攻击者可借此发起高频字典爆破。加固通过四层手段压缩风险:其一,用 Ed25519 密钥认证替代密码认证,密钥强度高且无法被字典猜测;其二,关闭 PermitRootLoginPasswordAuthentication,消除最高权限账户的爆破入口;其三,用 AllowUsers 白名单限定可登录账户,用 MaxAuthTries 限制尝试次数;其四,联动 fail2ban 与防火墙,对异常来源 IP 自动封禁,形成纵深防御。

操作步骤

1. 生成并部署密钥对

在本机生成 Ed25519 密钥(比 RSA 更安全且性能更好),并将公钥追加到服务器 authorized_keys:

# 本机执行
ssh-keygen -t ed25519 -C "admin@example.com" -f ~/.ssh/id_ed25519
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip

2. 修改 sshd_config 核心参数

编辑 /etc/ssh/sshd_config,逐项确认以下参数:

# 禁止 root 直接登录,必须使用普通用户 + sudo
PermitRootLogin no
# 仅允许密钥认证,禁止密码
PasswordAuthentication no
# 密钥重试次数上限
MaxAuthTries 3
# 登录超时 60 秒
LoginGraceTime 60
# 限定可登录用户白名单(按需替换)
AllowUsers admin deploy
# 仅监听必要地址(可改为内网地址)
ListenAddress 0.0.0.0

保存后先执行 语法检查,再重载服务:

sudo sshd -t && sudo systemctl reload sshd

sshd -t 输出错误,说明配置有误,禁止重载,立即排查。

3. 修改默认端口并限制来源

将 SSH 从 22 端口迁移到高位端口(如 2222),可大幅降低扫描器命中率。修改 sshd_config 后同步更新防火墙:

Port 2222
# 修改后
sudo systemctl restart sshd
# iptables 放行新端口
sudo iptables -A INPUT -p tcp --dport 2222 -s 你的办公IP -j ACCEPT

4. 联动 fail2ban 与防火墙

密钥认证已默认免疫密码爆破,但对应用层滥用(如认证失败重试)仍需兜底。安装 fail2ban 并启用 sshd jail:

sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# jail.local 中启用
[sshd]
enabled = true
maxretry = 3
bantime = 3600
sudo systemctl restart fail2ban

配置验证

# 1. 验证端口与认证方式(新开终端,勿断开当前会话)
ssh -p 2222 -i ~/.ssh/id_ed25519 admin@server_ip
# 2. 确认密码登录已被拒绝
ssh -p 2222 admin@server_ip -o PreferredAuthentications=password
# 应提示 Permission denied (publickey)
# 3. 查看认证日志确认无异常
sudo journalctl -u ssh -f | grep "Failed password"

三项验证全部符合预期,说明加固生效;随后用 sudo -i 测试 root 提权是否正常,确认后再关闭旧端口。

常见问题

Q1:禁用密码登录后,新服务器如何快速部署密钥?

分两步:先在测试阶段保留密码认证并开启密钥,用 ssh-copy-id 完成公钥部署;确认密钥可正常登录后,再设置 PasswordAuthentication no 并重载。切勿在一台未部署密钥的服务器上直接禁用密码,否则会锁死访问。

Q2:修改端口后连接超时怎么办?

优先确认云厂商安全组/防火墙是否放行新端口,再检查 sshd -tsystemctl status sshd。若服务器已不可达,使用云厂商 VNC 控制台回退 Port 22。经验做法是先添加新端口监听并验证,再删除旧端口。

总结

SSH 安全加固应遵循「密钥认证优先、最小权限、白名单控制、多因素兜底」的原则。完成本文配置后,服务器远程入口将从「可爆破目标」变为「密钥唯一入口」,配合 fail2ban 与防火墙规则,暴力破解与未授权登录风险可基本消除。建议将加固步骤固化为服务器初始化脚本,并在每次系统升级后复查 sshd_config 是否被重置。