为什么改成仅密钥登录
口令认证的最大问题是它可以被猜:公网暴露的 SSH 服务每天会收到成千上万次尝试,弱口令一旦命中,攻击者就拿到了一个可用账号。密钥认证用一对密钥替代口令,私钥不出本机,服务端只保存公钥,几乎不存在被穷举的空间,还能配合口令短语再加一层保护。把认证方式收敛到仅密钥,是 SSH 加固里收益最高的一步,但操作顺序必须谨慎:先把密钥通道验证通,再关闭口令认证。
基本信息
| 服务端文件 | 用户家目录下的 .ssh/authorized_keys |
|---|---|
| 客户端私钥 | 通常位于家目录下的 .ssh 目录,权限需为仅属主可读写 |
| 目录权限 | 家目录与 .ssh 目录不能对组和其它用户开放写权限 |
| 生效方式 | 改配置后先做语法校验再重载服务 |
| 服务名差异 | RPM 系通常为 sshd,DEB 系通常为 ssh |
| 适用平台 | Kylin V10 / UOS / openEuler 均为 OpenSSH |
典型使用场景
- 公网可访问的服务器:消除口令爆破带来的失陷风险
- 自动化与发布通道:用密钥让脚本免交互登录
- 集中运维:为运维账号统一部署公钥,便于账号与密钥的生命周期管理
- 合规要求:身份认证方式需要收敛,禁用弱认证手段
- 多机批量操作:配合批量执行工具走密钥通道,避免密码分发
- 离职与交接:只需撤销对应公钥即可收回访问权限
部署密钥
部署密钥
ssh-keygen -t ed25519 -C 'ops@example' # 生成密钥对,注意保管私钥
ssh-copy-id -i ~/.ssh/id_ed25519.pub ops@10.0.0.9 # 公钥写入服务端
ssh -i ~/.ssh/id_ed25519 -o PreferredAuthentications=publickey ops@10.0.0.9 # 验证仅密钥可登录
chmod 700 ~/.ssh # 服务端目录权限收紧
chmod 600 ~/.ssh/authorized_keys # 服务端公钥文件权限收紧
restorecon -Rv ~/.ssh 2>/dev/null || true # 启用 SELinux 的系统上修正上下文关闭口令登录
关闭口令登录
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 改前备份
# 编辑以下两项
# PasswordAuthentication no
# PubkeyAuthentication yes
sshd -t # 语法校验,必须先过
systemctl reload sshd # 生效,不断开现有会话免密登录失效的常见原因
| 现象 | 常见原因 | 检查方向 |
|---|---|---|
| 仍提示输入口令 | 仍允许口令认证或密钥未被接受 | 核对认证相关配置与实际生效值 |
| 提示权限过于开放 | 家目录或公钥文件权限过宽 | 收紧家目录与 .ssh 权限 |
| 反复要求输入口令短语 | 私钥未加载到代理 | 把私钥加入代理后重试 |
| 服务端日志显示拒绝 | 公钥内容不完整或被截断 | 重新拷贝公钥并核对内容 |
关闭口令登录前必须确认所有需要登录的通道都已配好密钥,并保留一个已登录会话与带外通道。私钥损坏或丢失后将无法登录,密钥需要有备份与撤销流程,不要只存一份在本机。
调整权限与上下文之前,先确认系统是否启用了强制访问控制。启用后仅改权限不够,还需要把目录与文件的安全上下文修正过来,否则日志里会看到明确的拒绝记录。