直接禁用密码认证、仅保留密钥登录是提升ssh安全最有效的方式;需生成ed25519密钥对,推送公钥,配置sshd_config启用pubkeyauthentication并禁用passwordauthentication,验证权限与登录后重启服务。

直接禁用密码认证、只留密钥登录,是提升 SSH 安全最有效的一环。它不是“加锁”,而是把暴力破解和弱口令这条路彻底堵死。关键不在步骤多,而在每一步都踩准权限、路径和验证节奏。
生成并部署密钥对(客户端操作)
优先选用 ed25519 算法(比 RSA 更快更安全),兼容性不足时再退到 rsa -b 4096:
-
ssh-keygen -t ed25519 -C "admin@prod"—— 按回车用默认路径(~/.ssh/id_ed25519),可设密码增强本地私钥保护 - 公钥自动存为
~/.ssh/id_ed25519.pub,私钥务必不泄露、不上传、不共享 - 用
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip一键推送;失败则手动执行:
ssh user@server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh"cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
服务端配置与权限加固
编辑 /etc/ssh/sshd_config,确保以下几行明确启用且未被注释:
-
PubkeyAuthentication yes—— 必须打开,否则密钥无效 -
PasswordAuthentication no—— 核心开关,关掉所有密码入口 -
PermitRootLogin prohibit-password—— 允许 root 用密钥登录,但禁止密码方式(比no更灵活,保留应急通道) -
ChallengeResponseAuthentication no—— 关闭键盘交互式认证,防绕过
改完别急着重启,先检查语法:sudo sshd -t。无报错再执行:sudo systemctl restart sshd
验证与防锁死要点
这是最容易出问题的环节,务必按顺序操作:
- 保持当前终端连接不关闭,新开一个终端窗口测试:
ssh user@server_ip - 成功登录后,再试密码登录:
ssh -o PubkeyAuthentication=no user@server_ip—— 应立即拒绝 - 确认
~/.ssh目录权限为700,authorized_keys为600,否则 SSH 主动忽略密钥 - 若使用 SELinux(如 CentOS/RHEL),补一句:
sudo restorecon -Rv ~/.ssh
如果误操作导致无法登录,请通过云平台 VNC、物理控制台或救援模式进入,临时改回 PasswordAuthentication yes 再修正。
进阶加固建议(非必需但推荐)
在密钥登录稳定运行后,可叠加以下措施:
- 限制可登录用户:
AllowUsers deploy admin,避免账号枚举 - 改默认端口(如
Port 2222),同步更新防火墙规则(ufw allow 2222或firewall-cmd --add-port=2222/tcp) - 启用双因素(需额外配置 PAM):
AuthenticationMethods publickey,keyboard-interactive - 定期轮换密钥(建议每 90 天),旧密钥从
authorized_keys中及时清理
整个过程不需要第三方工具,所有命令原生支持,主流发行版开箱即用。真正耗时的不是敲命令,而是等你亲手验证那一次无密码直连成功。











