SSH 认证模型对比与配置流程

·

摘要

本文系统性对比三种主流 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 证书体系

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注