摘要
本文系统性对比三种主流 SSH 认证模型:
- 基于密码的认证(Password Authentication)
- 基于传统密钥对的认证(Public Key Authentication)
- 基于证书颁发机构(CA)的认证(SSH Certificate Authentication)
在分析认证流程、信任模型与安全性的基础上,提供基于 HashiCorp Vault 的 SSH CA 企业级落地方案,包括:
- CA 初始化
- 角色配置
- 证书签发
- 生命周期管理(续期/轮换)
一、SSH 认证模型对比
1.1 基于密码的认证
认证流程
客户端 → 用户名/密码 → 服务器验证
客户端 ← known_hosts(首次信任)
特点
- 基于口令
- 易受暴力破解
- 无信任链
安全性评估
| 维度 | 评价 |
|---|---|
| 抗暴力破解 | 低 |
| 抗中间人攻击 | 低 |
| 自动化能力 | 低 |
1.2 基于密钥对的认证
认证流程
客户端 → 私钥签名
服务器 → authorized_keys 验证
客户端 → known_hosts 验证服务器
特点
- 非对称加密
- 公钥分散存储
- 无统一信任体系
关键结论
❗ 不是真正双向认证:
- 服务器验证客户端 ✔
- 客户端弱验证服务器 ❌
1.3 基于 CA 的 SSH 认证
认证流程
客户端 → 用户证书 → 服务器验证(User CA)服务器 → 主机证书 → 客户端验证(Host CA)
特点
- 中心化信任
- 支持短期证书
- 自动化友好
核心结论
✔ 真正双向认证
✔ 基于 CA 信任链
二、三种模型对比总结
| 项目 | 密码 | 密钥 | CA |
|---|---|---|---|
| 客户端认证 | 密码 | 私钥 | 证书 |
| 服务器认证 | 弱 | 弱 | 强 |
| 双向认证 | 否 | 否 | 是 |
| 管理方式 | 分散 | 分散 | 集中 |
三、Vault SSH CA 初始化
3.1 启用 SSH 引擎
用于内网
vault secrets enable -path=ssh-client-signer ssh vault secrets enable -path=ssh-host-signer ssh
用于公网
vault secrets enable -path=ssh-client-signer-public ssh vault secrets enable -path=ssh-host-signer-public ssh
3.2 生成 CA
用于内网
vault write ssh-client-signer/config/ca generate_signing_key=true vault write ssh-host-signer/config/ca generate_signing_key=true
用于公网
vault write ssh-client-signer-public/config/ca generate_signing_key=true vault write ssh-host-signer-public/config/ca generate_signing_key=true
3.3 导出 CA 公钥
用于内网
vault read -field=public_key ssh-client-signer/config/ca > user_ca.pub vault read -field=public_key ssh-host-signer/config/ca > host_ca.pub
用于公网
vault read -field=public_key ssh-client-signer-public/config/ca > user_ca_public.pub vault read -field=public_key ssh-host-signer-public/config/ca > host_ca_public.pub
3.4 创建 User Role
vault write ssh-client-signer/roles/user \
key_type=ca \
allow_user_certificates=true \
allowed_users="truenas_admin" \
default_user="truenas_admin" \
ttl=24h \
max_ttl=72h
vault write ssh-client-signer-public/roles/user \
key_type=ca \
allow_host_certificates=true \
allow_user_certificates=false \
allow_bare_domains=true \
allow_subdomains=false \
allow_empty_principals=false \
ttl=8760h \
max_ttl=26280h
3.5 创建 Host Role
vault write ssh-host-signer/roles/host \
key_type=ca \
allow_host_certificates=true \
allow_user_certificates=false \
allowed_domains="home.arpa" \
allow_bare_domains=true \
allow_subdomains=true \
ttl=8760h \
max_ttl=26280h
如果是给公网VPS,可以创建一个“默认 1 年,但最长 3 年”,允许给IP签发的角色。
vault write ssh-host-signer-public/roles/host \
key_type=ca \
allow_host_certificates=true \
allow_user_certificates=false \
allow_bare_domains=true \
allow_subdomains=false \
allow_empty_principals=false \
ttl=8760h \
max_ttl=26280h
四、服务器端配置
4.1 信任 User CA
TrustedUserCAKeys /etc/ssh/user_ca.pub
4.2 principals 控制
mkdir -p /etc/ssh/auth_principals echo "truenas_admin" > /etc/ssh/auth_principals/truenas_admin
在ssh配置文件中添加:
AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u
4.3 禁用密码登录
PermitRootLogin no PasswordAuthentication no KbdInteractiveAuthentication no
五、证书签发
5.1 用户证书
vault write -field=signed_key ssh-client-signer/sign/user \ public_key=@~/.ssh/id_ed25519.pub \ valid_principals="truenas_admin" \ ttl=24h > ~/.ssh/id_ed25519-cert.pub
5.2 主机证书
vault write -field=signed_key ssh-host-signer/sign/host \ public_key=@/etc/ssh/ssh_host_ed25519_key.pub \ cert_type=host \ valid_principals="xxx.home.arpa,192.168.1.50" \ ttl=8760h > /etc/ssh/ssh_host_ed25519_key-cert.pub
vault write -field=signed_key ssh-host-signer-public/sign/host \ public_key=@/etc/ssh/ssh_host_ed25519_key.pub \ cert_type=host \ valid_principals="1.2.3.4" \ ttl=8760h > /etc/ssh/ssh_host_ed25519_key-cert.pub
5.3 启用主机证书
HostKey /etc/ssh/ssh_host_ed25519_key HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
六、客户端信任 Host CA
echo "@cert-authority * $(cat host_ca.pub)" >> ~/.ssh/known_hosts
七、证书续期(核心运维流程)
7.1 主机证书续期
第一步:读取已有公钥
cat /etc/ssh/ssh_host_ed25519_key.pub
第二步:重新签发
vault write -field=signed_key ssh-host-signer/sign/host \ public_key=@/etc/ssh/ssh_host_ed25519_key.pub \ cert_type=host \ valid_principals="xxx.home.arpa,192.168.1.50" \ ttl=8760h > /etc/ssh/ssh_host_ed25519_key-cert.pub
第三步:重启 SSH
systemctl restart sshd
第四步:验证
ssh-keygen -Lf /etc/ssh/ssh_host_ed25519_key-cert.pub
7.2 用户证书续期
vault write -field=signed_key ssh-client-signer/sign/user \ public_key=@~/.ssh/id_ed25519.pub \ valid_principals="truenas_admin" \ ttl=24h > ~/.ssh/id_ed25519-cert.pub
⚠️ 关键原则
SSH 证书无法“续期”
只能重新签发
八、自动化续期(推荐)
#!/bin/bash vault write -field=signed_key ssh-host-signer/sign/host \ public_key=@/etc/ssh/ssh_host_ed25519_key.pub \ cert_type=host \ valid_principals="xxx.home.arpa,192.168.1.50" \ ttl=8760h > /etc/ssh/ssh_host_ed25519_key-cert.pubsystemctl restart sshd
cron:
0 3 * * * /root/renew_ssh_host_cert.sh
九、安全最佳实践
- 禁用密码登录
- 用户证书 ≤ 24h
- 主机证书定期轮换
- 使用 principals 控制权限
- 内网 / 公网 CA 分离
- 审计 Vault 操作
十、常见误区
| 误区 | 实际 |
|---|---|
| SSH key 是双向认证 | ❌ |
| known_hosts 安全 | ❌ |
| 证书可撤销 | ❌(默认) |
| 修改 role 会影响旧证书 | ❌ |
十一、结论
SSH CA = 企业级 SSH 的唯一正确方向
适用于:
- 大规模主机
- 自动化运维
- 零信任架构
十二、扩展方向
- Just-In-Time Access
- Vault + AD 集成
- SSH Bastion
- 自动证书轮换
- 统一 SSH / RDP 证书体系
发表回复