用户 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