ssh密钥在生产环境中需按生命周期管理:生成时绑定身份用途、隔离存储、加访问限制;吊销依赖服务端策略与集中式authorizedkeyscommand;轮换通过iac自动化,审计全程留痕可追溯。

在生产环境中,SSH密钥不是“一次生成、永久有效”的凭证,而是需要像员工工牌一样定期轮换、即时吊销的访问令牌。自动化吊销与更新的核心不在于写个脚本删文件,而在于把密钥生命周期嵌入运维流程——从生成、分发、审计到失效,全程可追踪、不可绕过、无需人工干预。
密钥必须绑定身份与用途,不能裸放
每个密钥生成时就要明确归属和场景:
- 用
ssh-keygen -t ed25519 -C "dev-alex@prod-db-202604"生成带清晰标识的密钥,避免出现id_rsa这种无上下文命名 - 私钥不存于
~/.ssh/默认路径,而是按角色隔离:如/etc/ssh/keys/prod-ops/(root-only读)、/etc/ssh/keys/ci-deploy/ - 公钥写入
authorized_keys时,必须加前缀限制:command="/usr/local/bin/restricted-shell",no-port-forwarding,no-X11-forwarding,from="10.10.0.0/16" ssh-ed25519 AAAA...
吊销靠服务端策略,不是删客户端文件
客户端私钥丢失或员工离职,关键动作在服务器端:
- 禁用
PermitRootLogin yes,所有操作走普通用户+sudoers白名单,吊销只需从sudoers移除对应用户 - 用
Match User alex块在/etc/ssh/sshd_config中强制限制其登录源、可用命令、是否允许ssh-agent转发 - 部署集中式
AuthorizedKeysCommand:让sshd每次登录都调用脚本(如Python)实时查询数据库或Git仓库中的密钥状态,自动过滤已标记revoked的条目
更新靠配置即代码(IaC)驱动
密钥轮换不是手动ssh-keygen再scp,而是纳入基础设施版本控制:
- 用Ansible管理
authorized_keys:模板中引用变量{{ user.ssh_keys | selectattr('valid_until', 'ge', '2026-04-30') }},自动剔除过期密钥 - CI流水线中加入密钥有效期检查:Jenkins Job每晚扫描所有
authorized_keys行,对valid_after=2025-01-01这类注释字段做校验,超期未更新则触发告警并冻结账号 - 新密钥发布时,配合
systemd服务重载:Ansible执行完密钥更新后,自动运行systemctl reload sshd,不中断已有连接
审计与回滚必须留痕
每一次密钥变更都要留下机器可读、人可追溯的证据:
- 所有
authorized_keys文件启用auditd监控:-w /home/*/\.ssh/authorized_keys -p wa -k ssh_keys - 密钥生成、分发、吊销操作全部走Git提交,commit message含
[KEY-REVOKE] alex@prod-db: security offboarding格式 - 保留最近3次密钥轮换的备份快照(如
/etc/ssh/keys/archive/20260420/),配合rpm -Va或dpkg --verify校验完整性











