我不小心发布了我的 SSH 密钥密码,该怎么办?

信息安全 SSH 密钥管理
2021-08-22 20:25:29

所以我弄错了输入字段,现在我的 SSH 密钥密码对全世界都是可见的,我什至无法删除它。

现在据我了解,这不是一个直接的安全问题,因为密码短语只能防止我的私钥本身被泄露。由于这还没有发生(它们的密钥只存在于我拥有的硬件上),我最多必须更改密码以防万一将来发生,我不必在我使用过的任何地方都更改为不同的 SSH 密钥它。

那是对的吗?请记住,所有这些都是针对私人项目的,假设的违规行为最多可能会令人讨厌和尴尬。

2个回答

从技术上讲,如果您不相信您的(受密码保护的)私钥也已泄露,那么更改您的密码就足够了。

实际上,您可能只想用一个新密钥替换您的 SSH 密钥。它们非常便宜,甚至可以免费使用,它使您不必担心是否有人拥有、现在或将能够获得带有受损密码的私钥副本。请记住,如果有人在您泄露(并更改)密码之前几个月备份了您的密钥副本,该密码仍然允许他们访问该密钥 - 这与您今天在新密码下使用的相同。

因此,只需更改您的密钥。这是很好的做法和最佳做法。

编辑:

@David-Z 建议更换密钥所涉及的时间是需要考虑的成本。我坚持认为,因为我们正在谈论密钥,所以这也可以忽略不计,因为您可以自动化该过程。以下脚本花了我大约 15 分钟的时间来编写和测试:

#!/bin/bash

for i in $*
do
    cat newkey.pub | ssh -i oldkey username@$i "cat >> ~/.ssh/authorized_keys"
    ssh -i newkey username@$i "sed -n '/my_old_key/!p' < ~/.ssh/authorized_keys > ~/.ssh/authorized_keys_tmp && mv ~/.ssh/authorized_keys_tmp ~/.ssh/authorized_keys"
    if [ $? -eq 0 ]; then
       echo "Successful key replacement for $i"
    else
       echo "Key replacement failed for $i"
    fi
done

该脚本将:

  1. 使用旧密钥将新密钥附加到远程授权密钥
  2. 使用新密钥从远程授权密钥中删除旧密钥

美妙之处在于,如果将新钥匙推出时出现任何问题,旧钥匙的移除将失败,因为它使用了新钥匙,因此您不太可能在脚上开枪。

您需要使用 ssh-agent 缓存您的密码,这样它就不会提示您使用 ssh;然后只需在命令行上使用要更新的服务器运行它:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-GWE6uxZxn9IS/agent.2016; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2017; export SSH_AGENT_PID;
echo Agent pid 2017;
$ ssh-add oldkey
Enter passphrase for oldkey: 
Identity added: oldkey (oldkey)
$ ssh-add newkey
Enter passphrase for newkey: 
Identity added: newkey (newkey)
$ ./chssh.sh server1 server2 server3
Successful key replacement for server1
Successful key replacement for server2
Successful key replacement for server3
$ 

更改现有密钥的密码可以通过以下方式完成:

ssh-keygen -p

...但是,您现在还没有完成。您还必须考虑旧密钥的副本,这些需要被删除,否则应该被视为已泄露。想想备份,还有文件系统上的数据(写时复制文件系统,如 ZFS 和 btrfs 可以在存储后端的某个地方保留一份副本)。

如果您认为您的密钥文件可能被泄露,那么更改您的密码是一个短期的解决方案。如果您不能确定旧私钥的所有副本都已消失,那么您应该考虑更改您的私钥文件。

不要忘记所有附加了您的公钥的服务。泄漏您的密钥是一个问题,破坏其他系统将是一个不好的副作用。