ssh私钥必须设置口令并严格控制文件权限,配合ssh-agent内存管理实现安全防护:生成时用ssh-keygen -a 100加4–6词随机口令,私钥文件chmod 600、~/.ssh目录chmod 700,通过ssh-add加载至agent缓存解密句柄。

SSH私钥本身不支持“磁盘级加密存储”,但可通过口令(passphrase)加密私钥内容,配合严格文件权限与内存代理管理,实现等效的强制保护效果。核心不是加密存储,而是让私钥文件即使被复制也无法直接使用。
给私钥加口令是必须的第一步
生成密钥时务必输入口令,不能留空:
- 用 ssh-keygen -t ed25519 -a 100 -C "desc" 生成,过程中会提示 Enter passphrase,输入 4–6 个随机英文单词组合(如 drift-kiwi-pulse-weld),比复杂符号密码更抗爆破且易记
- 口令在生成时设定,之后无法追加;若漏填,只能重生成密钥对并轮换服务器端公钥
- 空口令 = 私钥裸奔,文件一旦被拷走,攻击者可立即用于登录或签名
权限控制是硬性拦截机制
OpenSSH 会主动拒绝加载权限过松的私钥文件,这不是建议,而是强制校验:
- 私钥文件(如 id_ed25519)必须为 600 或 400:
chmod 600 ~/.ssh/id_ed25519 -
~/.ssh 目录 必须为 700:
chmod 700 ~/.ssh - authorized_keys 文件设为 600,防止他人篡改可登录公钥列表
- 切勿用 sudo chmod,否则可能把文件所有者变成 root,导致你自己的用户无法读取
用 ssh-agent 管理解密句柄,避免反复输口令
agent 不是存储加密私钥,而是缓存已解密的密钥句柄,只驻留内存、不写磁盘、退出终端即失效:
- 启动 agent:
eval $(ssh-agent -s) - 添加私钥(会提示输入一次口令):
ssh-add ~/.ssh/id_ed25519 - 查看已加载:
ssh-add -l;清空:
ssh-add -D - 脚本或 CI/CD 场景若需免交互,应禁用口令,但必须将私钥严格限定在受控环境(如 Kubernetes Secret 或 Jenkins 凭据库),不可落地到普通磁盘路径
不推荐第三方“加密存储”工具
GNOME Keyring、KeePassXC 插件等额外引入依赖和兼容风险:
- 桌面环境外(如 SSH 连接的远程终端、tmux、CI 流水线)常无法调用 Keyring
- 配置错误可能导致私钥以明文形式被缓存、记录日志或暴露在进程参数中
- 原生方案(口令 + 权限 + agent)已足够安全,且审计清晰、行为可预测











