ssh公钥管理应避免手动编辑authorized_keys,须采用authorizedkeyscommand、vault等工具或git声明式管理,配合严格权限控制(chmod 600)、定期审计清理及操作留痕。

在多用户环境中,SSH公钥管理不能只靠手动追加或覆盖 ~/.ssh/authorized_keys,否则容易引发权限混乱、密钥残留、审计缺失等问题。核心思路是:**分离密钥生命周期管理与用户主目录权限,强制集中控制、自动同步、操作留痕**。
用专用密钥管理服务或工具替代手工编辑
直接编辑 authorized_keys 文件极易出错,且无法追溯谁在何时添加了哪把密钥。推荐使用以下方式之一:
-
sshd 的
AuthorizedKeysCommand:配置 SSH daemon 调用外部脚本(如 Python 或 Go 程序)动态返回该用户的合法公钥列表。脚本可从数据库、Git 仓库或 LDAP 查询,天然支持审计日志和权限校验。 - 开源密钥管理工具:例如 HashiCorp Vault 的 SSH secrets engine,或轻量级方案如 greenbone/ssh-key-manager,提供 Web 界面、审批流、过期策略和操作日志。
-
基于 Git 的声明式管理:将每个用户的公钥存为独立文件(如
keys/alice.pub),用 CI/CD 流水线校验格式、签名后自动合并生成全局authorized_keys并推送到目标服务器。每次变更都对应 Git commit,天然可追溯。
严格限制 authorized_keys 文件的属主与权限
即使密钥来源可靠,若文件权限宽松,仍可能被普通用户篡改。必须确保:
- 文件属主为对应用户,组和其他用户无写权限:
chown alice:alice ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys - 整个
~/.ssh目录权限不高于700,禁止 world/group-writable;否则 OpenSSH 会拒绝读取该文件。 - 若使用
AuthorizedKeysCommand,该命令本身需以非 root 用户运行(如sshd配置中的AuthorizedKeysCommandUser),避免提权风险。
定期审计与自动清理过期/无效密钥
长期运行的系统中,离职员工、测试密钥、临时调试密钥常被遗忘。应建立自动化清理机制:
- 为每条密钥添加注释行(如
# user=alice,env=prod,expires=2025-06-30,added_by=jenkins-job-123),并解析注释做时效性检查。 - 结合企业身份系统(如 Active Directory、Okta)定时比对:用户状态为禁用时,自动移除其所有 SSH 密钥。
- 部署 cron 任务或 Ansible Playbook,每周扫描所有
authorized_keys,报告无对应用户账户的密钥、超过 90 天未登录的密钥、无注释的密钥,并生成待审核清单。
记录每一次密钥变更并关联责任人
审计不是事后翻日志,而是让每次变更“自带凭证”:
- 所有密钥增删操作必须走工单系统或 Git MR,禁止直接登录服务器修改。MR 描述中明确说明用途、有效期、申请人和审批人。
- 若用脚本批量同步,脚本执行时应记录:操作时间、执行者(如服务账号)、目标主机、变更前后的密钥指纹列表、Git commit SHA 或工单编号。
- 将这些日志统一接入 SIEM(如 ELK、Splunk),设置告警规则:例如“1 小时内同一用户密钥被修改超 3 次”或“root 用户直接写入
authorized_keys”。










