我需要运行一个 SSH 服务器,并记录任何客户端的 IP 和公钥尝试进行连接(但实际上并未授予访问权限)。
用例如下:我将这个 Web 应用部署到远程主机,在构建过程中,该主机从 github/bitbucket 获取一些依赖项(git 使用 ssh,而 ssh 使用密钥)。现在,如果我希望此托管服务器能够访问一些私有存储库,我需要将其公钥列入白名单,但主机不提供直接从文件系统读取密钥的权限。但我可以将其指向任何 SSH 主机,它将建立连接,大概会分发它的公钥。我想记录下来。
欢迎提出任何建议。
答案1
如果您需要公钥来列入白名单,则无法从失败的尝试中挑选它。这与 sshd 或其配置无关,而是与协议本身有关,因为公钥身份验证是这样的:
- 客户端发送密钥对的 ID。
- 服务器将该 ID 与
authorized_keys
文件进行比较。 - 服务器生成一个随机数,并使用匹配的公钥对其进行加密。
- 服务器将其发送给客户端。
- 客户端对其进行解密,并将其与共享会话密钥相结合,然后发回其 MD5。
- 服务器自行计算相同的校验和并进行比较。
如果尝试失败,这将停止在第 2 步,从而防止一切进一步发生。不过,整个公钥永远不会发送到服务器,只有 ID。
一个人不能简单地记录一些他甚至不知道的事情。
答案2
sshd
实际上不会记录登录尝试中使用的公钥,无论成功与否。最接近的做法是记录公钥的指纹LogLevel VERBOSE
。
- 通过失败的登录尝试以外的其他方法推送公钥。例如,上传到 cgi/php 脚本,该脚本根据服务器看到的客户端连接的 ip 地址将密钥记录(速率控制附加或覆盖)到文件中。
- 让安装程序向您的 Web 服务器上的特定 URL 发出 GET 请求并以此方式获取它。(我觉得这是 1 的劣质版本。)
- 让应用程序在公共场所发布其公钥,然后获取它。这是一个 Web 应用程序,公钥的优点之一在于它们不是共享的秘密。
此外,由于这是 ServerFault,我不得不指出您的部署过程不正确。您应该按照包管理器、、.rpm
等的使用方式分发(已签名的)包.deb
。如果需要,您可以在这些包中包含配置脚本。