定期轮换SSH密钥是生产环境强制要求,需区分用户密钥与主机密钥并分别管理,通过Ansible等工具实现生成、分发、重启、验证、客户端信任同步的自动化闭环,并配套元数据记录、周期策略、告警及访问控制机制。
定期轮换 SSH 密钥是保障远程访问安全的核心实践,不是“可选项”,而是生产环境的强制要求。关键不在于是否轮换,而在于轮换是否可控、可追溯、不影响服务连续性。
两类密钥必须分开管理,混淆会导致策略失效:
id_ed25519):用于人或自动化脚本登录服务器。每个用户、每类用途(如部署、监控、备份)应有独立密钥,禁止复用;口令不可共用。/etc/ssh/ssh_host_*.key):代表服务器自身身份,客户端靠它验证“没连错机器”。更换后所有已知主机指纹失效,需同步更新客户端信任列表。手动逐台操作不可持续,自动化需覆盖生成、分发、生效、验证闭环:
ssh-keygen -t ed25519 -f files/new_host_key -N "",存入 playbook 的 files/ 目录。copy 模块推送私钥(mode: '0600')和公钥(mode: '0644'),确保属主为 root:root。sshd 前加 systemd: state=restarted ignore_errors=no,失败立即中断,避免半生效状态。serial: 3 + delay: 10,防止集群级连接中断;验证环节可用 command: ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no localhost 快速自检。仅换服务端密钥而不更新客户端,会导致 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 错误,自动化任务可能卡住:
ssh-keygen -lf files/new_host_key.pub,获取类似 256 SHA256:AbC... user@host 的结果。known_hosts 模块批量更新所有管理终端的 ~/.ssh/known_hosts,精准替换对应主机条目。-o StrictHostKeyChecking=accept-new 自动接受(仅限可信内网)。轮换本身只是动作,支撑它长期有效的是配套机制:
PermitRootLogin、限制 AllowUsers,让密钥成为唯一可信入口。