SSH 密钥口令保护的是文件,而不是线路
口令加密私钥文件;它既不能吊销身份,也不能保障线路安全。存储分离、代理生命周期与无人值守使用是三个不同问题。
一台旧笔记本的备份硬盘里还留着一把 SSH 私钥,有人问 VPN 是否保护它。并不保护,从来也不保护。VPN 保护的是两个网络之间的路径;口令保护的是文件;代理保护的是运行中的会话。三种不同机制、三种不同失效方式,而被窃取的副本只关心前两者。
口令属于文件
SSH 密钥口令在静态存储时加密私钥材料。它不是发送给服务器的账户密码,也不是加入 VPN 所用的凭据。把两者混为一谈,会导致改动根本没有触及真正的暴露面。
OpenSSH 的 ssh-keygen 手册 介绍了口令处理,包括用 -p 开关为已存在的密钥设置新口令。
对于已有密钥,命令形式很简单,它会重写该文件:
ssh-keygen -p -f ~/.ssh/id_ed25519
这属于写入而非检查,因此应遵循密钥所有者批准的维护与恢复流程。不要公开私钥文件,也不要把真实口令写进共享命令行。改口令不会重新加密此前被取走的副本。把旧副本的位置记录在工单里,由所有者决定是否销毁。
副本比笔记本和隧道活得更久
密钥文件一旦被复制,笔记本上正在运行的 VPN 连接就对它不再说明任何问题。真正重要的是 文件本身被保护得有多好,以及哪些服务器仍然信任与之匹配的公钥。
改动当前文件的口令既不会影响副本,也不会把同一把公钥从服务器的 authorized_keys 里删除。吊销与重新加密是两个独立动作。
所以要把泄露的私钥当作身份事件,而不是网络事件。通过拥有它的服务器和注册流程来移除或更换已获接受的密钥。停掉 VPN 只是在一瞬间限制了一条路径,那不是吊销。
解锁会把秘密移进代理
代理持有已解密的身份以供后续认证,用户不必在每次连接时重新输入口令。这属于便利功能,但它有自己的安全边界。
ssh-agent 可以用 -t 选项限制身份保持加载的时长,而针对单个身份的设置可能覆盖该上限。与其假设断开 VPN 就会忘记所有已加载的密钥,不如为实际运行的代理选定策略。
密钥解锁之后被攻陷的进程,与被窃取的加密文件是不同的问题。把代理转发到另一台主机会在不复制密钥文件的情况下委派认证能力,因此只应在获得批准的场合启用。
在变更前后分别列出代理当前持有的内容:
ssh-add -l
无人值守的任务需要自己的方案
计划任务无法回答提示。它需要经过批准的机器凭据安排,而把解锁秘密放在与密钥相同的目录、由同一账户读取,并不能构成第二道边界。
与服务所有者一起确定受支持的秘密投递方式或基于硬件的运行方式,并覆盖续期、故障与恢复。希望有人在键盘前,会让故障的样子与无人看护时启动的主机完全不同。
同时保留服务器的主机身份校验及其账户限制。VPN 线路只提供一条私有路径;它不能证明你能到达的每个 SSH 监听方都是你预期的那个主机。把监听方和主机密钥指纹与密钥本身记在同一份清单里。
分别验证各道边界
用各自的问题测试每道边界。没有口令,文件能打开吗?断开连接后,代理还持有身份吗?服务器还接受那把公钥吗?
有两条命令可以回答第一个和第三个问题:
ssh-keygen -y -f ~/.ssh/id_ed25519
ssh -v [email protected]
把文件保护、密钥的允许用途、服务器侧移除分别记成三条独立条目。隧道、口令和代理各自守着关系中的不同部分,其中只有一项与网络有关。