SSH 密钥登录入门与安全加固
SSH 密钥登录入门与安全加固
摘要:本文从零介绍 SSH 密钥登录的基本原理与配置流程,并给出生产环境中常用的安全加固实践,帮助开发者在云服务器(如华为云 ECS、ECS 控制台、各类 Linux 发行版)上安全地替代密码登录。
一、为什么用密钥而不是密码
传统密码登录 SSH 存在两个痛点:密码在网络上以挑战-应答方式传输,虽然 SSH 协议本身已加密,但一旦服务器遭遇暴力破解脚本,弱密码很快会被试出;另一方面,运维人员在多台机器上记忆或粘贴密码,容易把凭据写入文档或聊天工具,增加泄露面。
SSH 密钥登录把"知道什么"换成"拥有什么":客户端持有私钥,服务器保存对应的公钥。私钥不出本机,登录时由客户端用私钥对服务器发来的随机挑战做签名,服务器用公钥验签通过即放行。整个过程不传输私钥本身,也天然抵抗字典和暴力破解。
二、生成密钥对
在本地或跳板机上执行:
ssh-keygen -t ed25519 -C "your-name@device" -f ~/.ssh/id_ed25519
优先选择 Ed25519:密钥短、签名快、安全性优于传统的 RSA 2048。如果目标服务器版本较老不支持 Ed25519,再回退到 ssh-keygen -t rsa -b 4096。生成时若提示"overwrite",请确认是否要覆盖已有密钥。
生成完毕后,私钥 id_ed25519 留在本地,公钥 id_ed25519.pub 将部署到服务器。务必为私钥设置严格权限:
chmod 600 ~/.ssh/id_ed25519
三、把公钥部署到服务器
3.1 使用 ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
该命令会自动把公钥追加到服务器 ~/.ssh/authorized_keys,并修正目录与文件权限。
3.2 手动部署
若无法使用 ssh-copy-id(例如只能临时用密码登录),可手动操作:
- 复制公钥内容(
cat ~/.ssh/id_ed25519.pub) - 在服务器上确保
~/.ssh目录存在,执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "粘贴公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
3.3 通过华为云控制台注入密钥
在华为云 ECS 控制台创建或修改密钥对时,可下载私钥文件(.pem),并在创建实例时关联。通过控制台注入的方式适合首次没有密码/无法 SSH 入站的场景,后续仍建议补充自己的 ed25519 密钥。
四、验证密钥登录
在本地执行:
ssh -i ~/.ssh/id_ed25519 user@server-ip
首次连接会提示确认 host key,核对指纹后输入 yes。若直接进入服务器 shell 且不再要求密码,说明密钥登录已生效。可用 -v 参数查看调试输出,确认用的是 publickey 认证。
五、安全加固
5.1 禁用密码登录
在 /etc/ssh/sshd_config 中确认或添加:
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
然后重载:systemctl reload sshd。重要:在关闭密码登录前,务必已在当前会话外另行验证密钥登录可用,否则一旦断连将无法再用密码救回。
5.2 绑定特定用户与 root 登录控制
PermitRootLogin prohibit-password
AllowUsers your-user deploy-user
prohibit-password 允许 root 仅通过密钥登录;结合 AllowUsers 把可登录账户白名单化,进一步缩小攻击面。
5.3 密钥权限与所有者
authorized_keys 的属主必须是登录用户本人,sshd 在 StrictModes(默认开启)下会拒绝属主/权限不匹配的密钥文件。服务器端 ~/.ssh 属主不正确是导致"有公钥却仍要密码"的最常见原因。
5.4 限制源 IP 与失败锁定
- 通过云安全组/防火墙只放通行运维网段到 22 端口;
- 配合
fail2ban对反复认证失败的源地址做临时封禁; - 条件允许时把 SSH 迁移到非标准端口(例如 2222),降低自动化扫描的命中概率,但注意端口变更不能替代真正的访问控制。
5.5 私钥保护
- 生成私钥时务必设置 passphrase(密码短语),私钥被拖走后仍多一层保护;
- 在 ssh-agent 中缓存 passphrase,避免每次交互输入;
- 不要在脚本或 CI 里把私钥以明文写入文件,优先使用托管式密钥(如华为云密钥对服务、KMS 或 CI 的 Secret 变量)。
六、日常运维小贴士
- 一台新机器上线的标准动作为:注入公钥 → 验证密钥登录 → 关闭密码登录 → 绑定安全组 → 纳入监控/审计。
- 定期轮换密钥:离职、机器重建或怀疑泄露时,在服务器 `autho
rized_keys` 中移除旧公钥并重新部署新公钥。
- 使用
ssh-keygen -lf ~/.ssh/id_ed25519.pub核对公钥指纹,方便在多人协作时确认"这是谁的公钥"。 - 若使用跳板机(bastion),可在
~/.ssh/config中用ProxyJump简化串联,但跳板机本身的密钥权限同样要按上述规范收紧。
七、总结
SSH 密钥登录用非对称签名替代了明文或弱密码认证,是服务器安全基线里性价比最高的一步。生成 ed25519 密钥对、把公钥写入 authorized_keys、关闭 PasswordAuthentication、收紧 PermitRootLogin 与 AllowUsers、配合安全组和 fail2ban,这几项组合起来就能覆盖绝大多数入侵场景。把密钥轮换和私钥密码短语纳入日常规范,安全性会从"能用"进一步走到可审计、可回收。
作者声明:本文内容为个人学习与实践总结,不涉及任何商业推广。配置生产环境前请在测试机验证,并在修改 sshd_config 前保留可通过控制台或 VNC 登录的救回通道。
- 点赞
- 收藏
- 关注作者
评论(0)