SSH密钥管理往往是安全体系中最薄弱的环节------过度依赖长期密钥、缺乏中心化审计、权限泛滥,这些现象在大多数组织中都普遍存在。
CA认证 和密钥轮换,实际上是从"分散式信任"向"集中化、临时化信任"转型的两个关键支点。
SSH密钥管理的核心原则
先明确底线原则:
- 最小权限原则:用户仅获得完成任务所需的最小访问权限
- 临时性原则:信任关系应该是短暂的,而非永久的
- 可审计原则:所有访问行为必须可追溯、可证明
- 零信任原则:默认不信任任何用户/设备,持续验证
传统模式(用户生成长期私钥,直接部署到目标服务器)在上述原则面前几乎全面失效。
SSH CA(证书认证)架构
核心思想
用数字证书替代公钥分发。CA(Certificate Authority)作为可信第三方,对用户公钥签名生成证书,服务器端只需配置信任CA即可验证所有用户身份。
架构对比
| 维度 | 传统公钥模式 | SSH CA模式 |
|---|---|---|
| 密钥分发 | 手动将公钥添加到每个目标服务器 | 部署一次CA公钥到所有服务器 |
| 用户认证 | 服务器存储大量用户公钥 | 服务器仅存储CA公钥 |
| 权限管理 | 通过authorized_keys逐条管理 | 通过证书中的principal/扩展字段控制 |
| 撤销 | 需登录每台服务器删除公钥 | CA维护撤销列表或设置短有效期 |
| 审计 | 难以追踪具体操作来源 | 证书包含用户ID、有效期、权限等元数据 |
CA实施要点
1. CA私钥保护
- CA私钥是皇冠上的宝石,必须离线存储
- 建议使用HSM(硬件安全模块)或专业的密钥管理服务(KMS)
- 考虑设置多个CA:根CA离线、中间CA日常使用
2. 证书设计
# 典型证书签发命令示例
ssh-keygen -s ca_key -I user123 -n username -V +1d -O source-address=192.168.1.0/24 user_pubkey
关键字段:
-I(身份标识):唯一标识用户-n(principals):允许登录的用户名-V(有效期):强制短有效期(如1小时、24小时)-O source-address:限制来源IP-O force-command:强制执行特定命令
3. 服务器端配置
# /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ca.pub
# 可选:撤销文件
RevokedKeys /etc/ssh/revoked_keys
4. 证书撤销策略
- 时间到期:最可靠的撤销方式,设置短有效期
- 撤销列表:维护已吊销的证书序列号
- 紧急响应:CA私钥泄露时需立即轮换所有服务器上的CA公钥
密钥轮换策略
轮换层级
1. 用户密钥轮换
- 频率:建议每30-90天轮换一次
- 机制:结合证书有效期自然轮换,或主动重新签发
- 自动化:通过CI/CD流程或密钥管理工具自动触发
2. CA密钥轮换
- 频率:每年或每2年轮换根CA
- 策略:采用密钥交叉认证,新CA先签发旧CA的证书,平滑过渡
- 紧急轮换:CA泄露时,必须在所有服务器上同时更新CA公钥
轮换实施框架

完整的最佳实践清单
架构层面
-
部署SSH CA基础设施
- 建立分级CA体系(根CA + 中间CA)
- CA私钥使用HSM或KMS保护
- 所有服务器统一配置信任CA
-
实施短有效期证书
- 交互式会话:1-24小时有效期
- 自动化任务:15分钟-1小时有效期
- 结合Just-in-Time(JIT)签发机制
密钥管理层面
-
禁止用户自生成长期密钥
- 所有证书由CA统一签发
- 用户仅持有私钥,不接触证书签发流程
-
实施最小权限
- 通过证书principals限制可登录用户
- 使用force-command限制可执行命令
- 按需授予权限,定期审查
-
密钥轮换自动化
- 建立密钥生命周期管理系统
- 设置自动轮换策略
- 轮换前后进行权限审计
运维层面
-
集中化审计与监控
- 记录所有证书签发、撤销事件
- SSH日志集成SIEM系统
- 异常行为实时告警(如异地登录、权限提升)
-
应急响应预案
- CA私钥泄露的标准操作流程
- 批量更新服务器CA公钥的自动化方案
- 证书撤销的快速通道
工具链建议
- CA管理:HashiCorp Vault、AWS KMS、Azure Key Vault
- 证书签发:ssh-keygen、step-ca、小型自研服务
- 密钥轮换:Ansible、SaltStack、专用密钥管理平台
- 审计监控:ELK Stack、Splunk、Graylog
常见误区
❌ 误区1:设置长有效期(如1年)省事
- 实际上牺牲了安全性,泄露风险窗口过大
❌ 误区2:CA私钥保存在普通服务器上
- 这相当于把所有服务器的钥匙串放在一个普通抽屉里
❌ 误区3:只在边界部署CA
- 应该覆盖所有服务器(包括跳板机、开发环境)
❌ 误区4:撤销机制不完善
- 依赖时间到期是最可靠的,撤销列表往往更新不及时
这套方案的核心价值在于:将分散的、静态的信任关系 ,转化为集中的、动态的信任关系。从"我有这个公钥所以我能登录"转变为"CA在当前时刻授权我登录"。