ssh-agent 和/或使用 authorised_keys 来保护 git 存储库的远程连接

ssh-agent 和/或使用 authorised_keys 来保护 git 存储库的远程连接

我正在尝试使用 git 在一些远程虚拟机上设置一套备份服务器。远程虚拟机将与我本地机器上的一些目录链接,本地机器目录中有各种分支。

我已经使用在本地机器上生成的 rsa 密钥设置了一个 git 存储库,然后将其粘贴到 vm 的 git 用户 .ssh/authorized_keys 中,这似乎有效,我可以从我的机器推送/拉取到存储库,而不必每次都输入 git 用户的密码。

然后,我的老板将他的 rsa 密钥放入 authorized_keys 文件中,这样他也可以处理存储库,但他每次都必须输入 git 的密码,并且他通过使用 ssh-agent 来缓存他的 rsa 凭据来解决这个问题。

它们是否都是实现相同目标的不同方法,或者它们适用于不同的场景;即,将密钥添加到authorized_keys文件的方法是否适用于多个会话或仅适用于一个会话,或者ssh-agent是否适用于多个会话?

我只是对每种方法的使用场景有点困惑,所以如果有人可以尝试向我解释,那将非常有帮助,谢谢。

答案1

它们都是实现同一目标的不同方法吗?

我认为“它们两者”的意思是“将密钥添加到authorized_keys”和“使用 ssh-agent”;而“相同的目标”的意思是“无需每次都输入 git 用户的密码”。

不,他们实现的目标并不相同。


添加到authorized_keys

当客户端连接到 SSH 服务器时,客户端需要进行身份验证。服务器会告知它允许使用哪些身份验证方法,客户端可以配置为决定以何种顺序尝试这些方法。客户端会尝试这些方法(并可能重试,例如,如果您输入了错误的密码,您将获得另一次机会),直到身份验证成功,否则将不再需要尝试或服务器断开连接。

(服务器可能配置为需要多种方法才能成功;但这里情况并非如此。)

常见的设置是:服务器允许publickeypassword方法(可能还有其他方法);客户端先尝试前者,再尝试后者。如果客户端没有密钥,则跳过该publickey方法。

在您将公钥添加到authorized_keys相关服务器上的文件并且您的 SSH 客户端开始使用相应的私钥之后,您将永远不会使用该password方法,因为publickey它会首先尝试并且足以对您进行身份验证。

同一个授权密钥可以验证多个 SSH 会话。如果文件中有多个授权密钥,则其中任何一个都可以独立使用任意次。

(连接数或登录会话数可能受其他因素限制,资源是最终因素;但不受公钥机制的限制,这不是它的工作。)

添加密钥authorized_keys是一种“无需每次都输入 git 用户的密码”的登录方法。现在你知道它是如何工作的了。虽然不太明显,但这对你的老板也有效


你老板的情况

你说你的老板每次都要输入 git 密码。好吧,SSH 服务器可以配置为需要密钥密码来自具体的用户,但这肯定不是默认行为;而 ssh-agent 帮助的事实告诉我这种可能性是不可能的(代理持有密钥,而不是密码)。真正发生的事情是你的老板创建了一个加密的私钥,它需要密码进行解密,并且他使用了与密码相同的字符串;当他尝试使用密钥进行身份验证时,不是服务器要求输入密码,而是客户端(本地ssh程序)要求输入密码以便在本地解密密钥,然后仅使用它进行身份验证。

如果您的老板想使用密钥而不输入任何内容,那么他​​应该删除密码。我的这个答案解释并解决确切地我认为你的老板发生了什么事。正确的命令是ssh-keygen -p,查看链接的答案了解详细信息,我不会在这里重复。


ssh 代理

使用 ssh-agent 并不是一种“无需每次都输入 git 用户密码”的登录方法。Ssh-agent 用于保存私钥并处理其他程序(主要是ssh)转发给它的身份验证请求。

向 ssh-agent 添加加密密钥会使代理询问密码。然后,代理可以在向其ssh转发来自 SSH 服务器的身份验证请求时使用该密钥而无需再次询问。SSH 客户端在可以访问代理时默认执行此操作。

(要明确:ssh无论是否有可用的代理,都可以单独使用默认或指定的密钥。)

虽然 ssh-agent 不是一种无需每次都输入密码的登录方法,但它是一种使用加密密钥而无需每次都使用密码的方法。

一个代理可以为多个客户端提供服务:ssh客户端或其他知道如何与代理通信的程序。想要使用代理的客户端会检查SSH_AUTH_SOCK环境变量以找到代理提供的 Unix 域套接字。可以运行多个代理,如果代理的变量不同,客户端会找到不同的代理SSH_AUTH_SOCK

请注意,你可以不使用任何代理(你很可能这样做)或使用代理(你的老板这样做)来使用密钥,但使用代理而不在某个authorized_keys文件中指定某个密钥则没有意义。如果你的老板从authorized_keys服务器上的文件中删除了他的公钥,那么无论有没有代理,他都无法使用该密钥登录。

与单独使用密钥的情况相比,使用 ssh-agent 有优势ssh

  • 在提供一次密码后(你老板的情况),加密密钥可以在多个进程的请求下多次使用。
  • 无需改变 的配置ssh且无需使用即可加载一组特定的密钥ssh -i
  • 根用户可以使代理对其他用户的进程可用,但不必向他们提供密钥。
  • 可以请求ssh转发身份验证代理连接。当您在 ssh 连接到服务器时执行此操作时,ssh您在服务器上调用的进程(以到达另一台服务器)将能够访问您的本地代理。这样,您就可以使用本地可用的私钥(由本地代理持有)进行身份验证,而无需将它们复制到中间服务器。

相关内容