加固 SSH:密钥、端口、限制
如何配置 sshd:仅用密钥登录、限制用户和地址、更改端口,以及在此过程中如何不丢失访问权限。
更新于 2026年8月23日
SSH 是您每天使用的机器的唯一入口,也是自动化暴力破解攻击的主要目标。只需配置一次,之后便无需再操心。
所有修改都放在单独的文件 /etc/ssh/sshd_config.d/99-hardening.conf 中——这样软件包更新就不会覆盖您的配置,导致您失去访问权限。
用密钥代替密码
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
PermitEmptyPasswords no
应用之前,请确认密钥确实可用:在另一个窗口中用密钥登录。在 /hosting/vds/m/<id> 面板的“Access”标签页中添加的密钥会分配给 root 用户;其他用户需要手动将密钥写入 ~/.ssh/authorized_keys。
在您本地生成密钥:
ssh-keygen -t ed25519 -C "work laptop"
ed25519 比 RSA 更短、更快。如果您的工具不支持它,请使用长度至少为 4096 位的 rsa。
谁可以登录
PermitRootLogin prohibit-password
AllowUsers artem deploy
MaxAuthTries 3
LoginGraceTime 20
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers 是禁用密码之后最有效的规则:针对其他用户名的暴力破解会立即停止。关于 root 的更多内容——禁用 root 密码登录。
如果您从固定位置工作,可以限制地址:
Match Address 203.0.113.5
PermitRootLogin yes
更改端口
将 SSH 从 22 端口迁移到非标准端口并不能保护您免受针对性攻击,但可以消除日志中几乎所有来自自动化扫描器的噪音。
Port 2222
步骤顺序严格如下:
ufw allow 2222/tcp
sshd -t
systemctl restart ssh
ssh -p 2222 artem@<address>
ufw delete allow 22/tcp
防火墙规则要在重启之前添加,而删除旧规则只能在通过新端口成功登录之后进行。另请参阅端口。
应用与验证
sshd -t
sshd -T | grep -Ei "passwordauth|permitroot|allowusers|port"
systemctl restart ssh
sshd -t 检查语法,sshd -T 显示最终生效的配置——是生效的配置,而不是您在文件中写的内容。
配置期间请保持当前会话开启。它能在 sshd 重启后继续存活,您可以通过它回滚失败的修改。如果您真的把自己锁在外面了——面板中的“Console”标签页独立于 SSH 运行。
常见错误
| 错误 | 后果 | 解决方法 |
|---|---|---|
| 未测试密钥就禁用了密码 | 完全失去网络访问 | 通过面板控制台登录并恢复设置 |
在主文件中修改,覆盖了 sshd_config.d 中的某行 | 设置不生效 | 用 sshd -T 检查 |
| 更改了端口却没有 ufw 规则 | 失去访问权限 | 先加规则,再改端口 |
~/.ssh 的权限比 700 更宽松 | 密钥被静默忽略 | chmod 700 ~/.ssh、chmod 600 authorized_keys |
AllowUsers 中没有包含自己的用户名 | 把自己锁在外面 | 面板控制台,编辑文件 |
在
sshd_config中,参数的首次出现生效,而sshd_config.d中的文件会在开头被包含进来。因此请用sshd -T验证结果,而不是直接阅读文件。
fail2ban 可以消除剩余的暴力破解噪音。