根据我的经验,用户会在基础设施中撒上公钥和私钥。虽然 openssh 允许将公钥限制在特定目录(这会阻止它们生成大量密钥),但它没有为私钥提供类似的机制(您可以定义默认值,但不能强制使用它)。
在理想的情况下,我希望能够在不输入密码或密码短语的情况下访问主机(除了 ssh 代理的初始密码短语)。
尽管我的 $WORK 的用户在 MS-Windows 上使用 putty 开始他们的 ssh 之旅,但我只关心防止他们将可用的私钥复制到充当 ssh 服务器的计算机。
这些目标主机需要能够在其他地方建立 ssh 连接,因此我不能简单地阻止传出 ssh 连接。
如果没有实现完整的特权访问解决方案,有没有一种方法可以让我的用户使用密钥对进行身份验证,但阻止他们复制其私钥(或生成自己的密钥并部署私钥/公钥)?
答案1
你不能。任何可以读取系统上文件的用户都可以复制它,这就是文件系统的工作方式。读取文件的文件复制程序与读取文件的任何其他程序没有区别。
但是,如果您告诉用户,他们可以通过简单地转发代理来实现登录其他服务器的目标,并在建立连接时向他们提供有关如何执行此操作的指示,那么他们会意识到这样做比这样做更简单和容易复制密钥。这就是我们在工作中所做的:我们向用户提供指示(对于 OpenSSH)来设置对 shell 主机的访问,并指示他们设置转发其代理的指令(因为这是访问其他计算机所必需的),然后他们就这样做那。因为他们不需要将 SSH 私钥复制到 shell 主机,所以他们不需要。
正如评论中提到的,如果用户使用由硬件安全密钥支持的 SSH 密钥,那么这将有效地解决这个问题。它不会阻止他们复制私钥,但如果没有将硬件安全密钥插入远程计算机,私钥将无法工作,因此它会抑制这种行为。但是,这需要相对较新版本的 OpenSSH 才能工作,并且我不确定 Windows 版本的 OpenSSH 是否支持此功能。但除此之外,就没有办法阻止这种情况的发生。
答案2
我有一种感觉,ssh-agent
一种名为“代理转发”的技术可能是一种阻止用户将私钥放在 ssh(堡垒?)主机上的方法。我自己没有使用过这个,但这是我对其工作原理的理解:
- 当用户打开 ssh 会话时,ssh 代理会在用户的家庭计算机上运行,并且代理会缓存用户的私钥。当他们通过 ssh 连接到您的服务器时,他们的 ssh 客户端会要求代理回答密钥质询,然后他们登录到您的服务器。
- 服务器上的本地 ssh 配置告诉 ssh 客户端通过 ssh 连接将关键挑战从其家庭计算机传输回其 ssh 客户端(然后再传输至其代理)。
- 当他们从您的 ssh 主机 ssh 到其他服务器时,关键挑战将返回到他们的家庭计算机并由他们的代理回答。您的服务器上不需要私钥。
我在这个 URL 上看到了一份指南的参考:https://docs.github.com/en/developers/overview/using-ssh-agent-forwarding,但我只是快速浏览了一下。那里有一个由 Steve Friedl 编写的指南的链接,其中包含详细信息。
这可能不足以阻止您的人员调用ssh -i symcbean_hates_this_key_file
,但如果他们有自动方式在您的 ssh 服务器上使用其密钥,也许大多数人都会停止。