3、SSH密钥管理与认证:密钥对生成、公钥分发策略、ssh-agent使用、证书认证(CA)方案

密码登录,说白了就是「一次泄露,全线崩溃」。我见过太多因为弱口令被爆破的案例了。所以,SSH 密钥认证才是远程访问的底线。这一章,我们把这套体系彻底讲透。

3.1 密钥对生成:别再用默认参数了

生成密钥对很简单,但很多人第一步就错了。直接用 ssh-keygen 一路回车?嗯,这里要注意。

⚠ 警告: 默认的 RSA 2048 位密钥虽然能用,但已经不够安全了。我个人习惯至少用 RSA 4096 或 Ed25519。

Ed25519 是目前推荐的算法。它更快,更短,而且安全性更高。我在项目中遇到过客户还在用 DSA 1024,结果被扫描工具直接标记为高风险。

推荐生成命令:

# 生成 Ed25519 密钥对(推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"

# 如果必须用 RSA,至少 4096 位
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

你会被问到两个问题:

  • 文件保存路径: 默认 ~/.ssh/id_ed25519,我建议你给不同用途的密钥起不同名字,比如 id_ed25519_github、id_ed25519_work。
  • 密码短语(passphrase): 一定要设!这是最后一道防线。就算私钥文件被偷,没有密码短语也白搭。
💡 小技巧: 密码短语可以是一句只有你知道的话,比如 MyCatLikesFish@2024!。别用生日或简单单词。

3.2 公钥分发策略:别一股脑全塞进去

公钥分发,核心就是管理 ~/.ssh/authorized_keys 这个文件。但怎么分发才安全?

常见分发方式对比:

方式 安全性 适用场景 我的评价
ssh-copy-id 中 临时授权、小规模 方便,但依赖密码登录一次
手动追加 高 服务器数量少 最可控,但累死人
配置管理工具(Ansible/Puppet) 高 大规模集群 我推荐这种方式,统一管理
SSH 证书(CA) 最高 企业级、动态环境 终极方案,后面细讲

我曾经见过一个团队,把所有人的公钥都塞到一台跳板机的 authorized_keys 里。离职的人也不删,结果被利用作为跳板攻击内网。所以,定期审计 authorized_keys 文件 是必须的。

🔑 核心原则: 最小权限。只给需要的人,只给需要的服务器,用完即撤。

3.3 ssh-agent 使用:别每次都输密码

你设了密码短语,安全是安全了,但每次 SSH 都要输一遍,烦不烦?ssh-agent 就是解决这个问题的。

它像一个钥匙保管员。你把私钥「加」进去,它帮你记住密码短语。之后你 SSH 连接时,它自动帮你完成认证。

基本用法:

# 启动 ssh-agent(通常系统会自动启动)
eval "$(ssh-agent -s)"

# 添加私钥
ssh-add ~/.ssh/id_ed25519

# 查看已添加的密钥
ssh-add -l

# 删除所有密钥
ssh-add -D

你想想看,如果你有 10 台服务器,每台都用不同的密钥。没有 agent,你得手动指定 -i 参数。有了 agent,它会自动尝试匹配。

⚠ 注意: ssh-agent 默认会一直运行。如果你在共享服务器上使用,记得用完 ssh-add -D 清空,或者直接退出终端。我曾经在公共开发机上忘了退出,结果别人用我的会话连上了生产环境……嗯,那场面很尴尬。

3.4 证书认证(CA)方案:这才是企业级的玩法

前面说的都是「用户-服务器」直接信任。但当你管理几百台服务器时,每台机器都要维护 authorized_keys,简直是噩梦。离职一个人,你要去所有机器上删他的公钥。

SSH 证书认证(CA)就是来解决这个问题的。它借鉴了 HTTPS 的思路:

  • 你有一个 CA 根证书(私钥)。
  • 你给每个用户的公钥签名,生成一个用户证书。
  • 你给每台服务器的主机公钥签名,生成一个主机证书。
  • 服务器信任 CA 根证书,而不是信任具体的用户公钥。

核心流程:

# 1. 生成 CA 根密钥(放在绝对安全的离线机器上)
ssh-keygen -t ed25519 -f user_ca -C "SSH CA Key"

# 2. 签名用户公钥(生成用户证书)
ssh-keygen -s user_ca -I "username" -n "username" -V "+52w" ~/.ssh/id_ed25519.pub

# 3. 在服务器上配置信任 CA
# 编辑 /etc/ssh/sshd_config
# TrustedUserCAKeys /etc/ssh/user_ca.pub
# 然后重启 sshd

证书认证的优势:

特性 传统密钥 证书认证
用户管理 每台服务器手动添加/删除 CA 签名/吊销即可
有效期 永久有效(除非手动删除) 可设置过期时间(如 52 周)
主机验证 首次连接提示指纹 自动验证主机证书
审计 困难 证书 ID 可追踪
🚀 我的建议: 如果你管理的服务器超过 20 台,或者团队超过 10 人,直接上证书认证。前期配置成本高一点,但后期运维成本直线下降。

我曾经帮一个客户从 200 台服务器的 authorized_keys 泥潭里爬出来。他们之前每次有人离职,运维要花一整天去删公钥。用了 CA 之后,只需要吊销一个证书,所有服务器自动生效。说白了,这才是真正的「一劳永逸」。

3.5 本章知识体系图

下面这张图帮你理清 SSH 密钥管理的核心脉络:

SSH 密钥管理与认证体系 SSH 密钥管理与认证体系 密钥对生成 公钥分发策略 ssh-agent 使用 证书认证 (CA) ssh-copy-id 配置管理工具 ssh-add / ssh-add -l CA 签名 & 验证 核心原则 最小权限 · 定期审计 · 证书化 · 自动化
📌 总结: 密钥对生成是基础,公钥分发是策略,ssh-agent 是效率工具,证书认证是终极方案。从个人到企业,一步步升级,别一口吃成胖子。