【发布时间】:2021-03-02 12:19:08
【问题描述】:
服务器的authorized_keys包含上万个密钥,服务器如何知道哪个公钥与当前用户的私钥匹配?
例如,通常用户名总是git,服务器如何知道当前用户的身份?
详细问题:
-
当我使用ssh通过
git pull拉取代码时,服务器如何知道git pull来自哪个用户? -
那么服务器如何获取与用户关联的公钥呢?
【问题讨论】:
服务器的authorized_keys包含上万个密钥,服务器如何知道哪个公钥与当前用户的私钥匹配?
例如,通常用户名总是git,服务器如何知道当前用户的身份?
当我使用ssh通过git pull拉取代码时,服务器如何知道git pull来自哪个用户?
那么服务器如何获取与用户关联的公钥呢?
【问题讨论】:
因为公钥注册到GitHub user account settings
通常,这种存储库托管服务将使用 SSH forced command 填充其~git/.ssh/authorized_keys:
command="/path/to/script userID",\
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty \
ssh-rsa <yourPublicKey>
代替:
ssh-rsa <yourPublicKey>
它使用与您的公钥相关联的用户 ID 调用脚本。
这就是 GitHub 将 git@github.com 与您的帐户相关联的方式。
在您的帐户中注册公钥会使用命令和用户 ID 修改 ~git/.ssh/authorized_keys,而不仅仅是公钥。
- 当我使用ssh拉取
git pull的代码时,服务器如何知道git pull来自哪个用户?- 那么服务器如何获取与用户关联的公钥?
实际上,GitHub 将您的公钥作为您与 GitHub 之间的 SSH 交易的一部分:然后从其~git/.ssh/authorized_keys 获取您的用户 ID
最后,它检查该用户是否被授权从远程存储库克隆/获取/拉取(例如,这可能是私有的,在这种情况下,用户最好是该存储库的所有者或声明的协作者)。
【讨论】:
git pull时,它怎么知道git pull来自哪个用户?
GIT_SSH_COMMAND="ssh -v"来查看发生了什么。然后做你的git pull(假设origin是一个SSH URL)
简短的回答是它没有。不过,这个答案并不是很有帮助。
假设您是一个 ssh 服务器,并且刚刚获得了一个用户名(此时始终为 git)和一个公钥。
您现在查看~git/.ssh/authorized_keys,这是一个大文件,其中包含四个空格分隔的字段:
(虽然选项部分可以省略)。这里的第一个重要部分是 base64 编码密钥:它由公钥和其他一些内容组成。
现在让我们再看看你的问题:
服务器的authorized_keys包含上万个密钥,服务器如何知道哪个公钥与当前用户的私钥匹配?
它没有。它不需要。它现在有两个公钥;它只需要匹配两个公钥,这很容易,因为它们要么逐位匹配,要么不匹配。所以此时它所要做的就是逐行扫描整个authorized_keys 文件,检查:这一行是否有相同的公钥?
当然,它必须进一步验证:仅仅拥有公钥并不意味着你就是你声称的那个人。但这对于第一次通过就足够了。在 authorized_keys 文件中找到(或“a”)右行后,sshd 现在可以使用 options 来决定您是谁,如果您通过了其余的身份验证过程。
【讨论】:
逻辑上:
当您向 GitHub 注册您的公钥时,GitHub 将关联 您帐户的公钥。
当你尝试登录 GitHub 时,你告诉 GitHub 哪个公钥 使用in some way。
GitHub 然后使用公钥对你进行身份验证,你需要 使用私钥完成认证过程。
如果您通过了身份验证,GitHub 会根据您的帐户知道您的帐户 第 1 步。
SSH 密钥身份验证只是使整个过程隐含,仅在第一次显式设置密钥时。
用户名/密码身份验证每次都是明确的。
相关:How does SSH public key authentication work (picking up right keys)
【讨论】: