SSH 私钥丢失时的安全性

SSH 私钥丢失时的安全性

用户 A 有两个 SSH 私钥,并且随着时间的推移在多个服务器上使用了这个公钥。他丢失了其中一个,并创建了一对新的。

用户 A 如何通知我(系统管理员)他丢失了密钥,我如何管理他有权访问的所有服务器(我没有用户 A 有权访问的所有服务器的列表)。换句话说,我如何回忆与此私钥关联的公钥。

在基于 LDAP 的身份验证中,所有服务器都会与单个服务器存储库进行通信以进行身份​​验证,并且如果我删除访问权限或修改服务器上的密码,当用户 A 丢失密码时,所有使用此 LDAP 进行身份验证的系统都是安全的。

答案1

您使用的是哪个版本的 sshd?OpenSSH 5.4 显然有一个密钥撤销选项:

* Add the ability to revoke keys in sshd(8) and ssh(1). User keys may
be revoked using a new sshd_config(5) option "RevokedKeys". Host keys 
are revoked through known_hosts (details in the sshd(8) man page).   
Revoked keys cannot be used for user or host authentication and will  
trigger a warning if used.

如果您使用的是早期版本,则可能必须遍历所有服务器上所有可能的 authorized_keys 文件,以查找并删除可疑公钥。这将包括用户 A 可以 ssh 进入的任何帐户,包括 root。这假设您没有使用集中式 authoried_key 管理。

答案2

解决此问题的一个可能的短期方法是使用一些配置管理工具(ansible可能是个不错的选择)。

您可以使用authorized_key模块(https://docs.ansible.com/ansible/authorized_key_module.html)从给定用户的authorized_key文件中删除一个(或多个)特定的公钥指纹。

缺少一个可以满足您需求的示例,但是类似这样的操作可能会有效:

- name: Set authorized key took from url
  authorized_key:
    user: charlie
    state: absent
    key: https://github.com/charlie.keys

您还可以(至少在 ansible 中)通过查询 /etc/passwd 运行命令来创建系统上所有用户的列表。

您也可以创建一个新的密钥白名单并删除其他所有内容,但这在您的情况下可能并不实用。

ansible 文档给出了其工作原理的粗略示例:

- name: Set authorized key, removing all the authorized key already set
  authorized_key:
    user: root
    key: '{{ item }}'
    state: present
    exclusive: True
  with_file:
    - public_keys/doe-jane

从长远来看,你可能要考虑拥有跳伞者——我发现传送相当好。

答案3

在 OpenSSH 和 Putty 中,您都可以根据私钥重新生成公钥,但反之则不行。

使用 ssh-keygen -y -f 文件名

在 PuttyGen 中,导入密钥,它将向您显示公钥。

答案4

我如何记住与该​​私钥相关联的公钥。

虽然撤销 SSH 密钥当然不是一个坏主意,但更好的(或更具可扩展性的)解决方案是实施 MFA(多因素身份验证器,又称双因素身份验证)。这会导致密钥贬值,因为用户必须满足 (1) 个额外因素才能登录。

存在一些开源解决方案,例如 Google Authenticator 和 Oath。然后是混合开源/商业解决方案,例如 Duo。使用 Duo,您甚至可以地理围栏登录和推送通知。

对于 100% 正常运行的示例实现,请查看作为 Docker 容器实现的这个堡垒:https://github.com/cloudposse/bastion

相关内容