为什么在使用凭证直接连接到 Git 存储库时 SSH 比 HTTPS 更安全

pau*_*l23 29 ssh git https

好吧,考虑到凭据以非安全方式存储在文件系统的某处(Ubuntu 上的默认选项)。有很多网站告诉您使用 SSH 更安全,应该用作-

“使用 HTTPS,凭据存储在未加密的文件中”

然而,这对我来说意义不大:使用 SSH,您还有一个存储(私有)密钥的简单文件,因此任何获取该文件的人都可以轻松连接到 git 存储库。

而且这并不是说这两个文件都更难访问:两者都只是存储在本地文件系统中,大部分都是未加密的(在 Linux 上)。

那么是什么让 SSH 比 HTTPS 更安全呢?

cjs*_*cjs 23

我不清楚您是否被告知在您的特定情况下SSH 比 HTTPS 更安全(我们没有所有详细信息),这可能是绝对正确的,或者您是否已被视为一般建议。对于那些不精通安全系统分析的人来说,SSH 与 HTTPS 的分析可能出奇地复杂,这就是为什么我们倾向于做出广泛的陈述,例如“SSH 比 HTTPS 更安全”:它通常会是真的,即使它是并非在所有情况下都是如此。无论如何,这里有一些关于这个问题的想法。

由于您提到将凭据存储在文件中,因此此答案假定您对 HTTPS 和 SSH 都使用公钥/私钥身份验证。在这两种情况下,密码身份验证的安全性都大大降低。

本地凭证存储

首先,您假设存储在磁盘上的用户凭据不受密码保护。这可能是也可能不是,但如果它受到密码保护,这将大大提高安全性。

在 SSH 的情况下,凭证更有可能受到密码保护,因为密钥代理更易于使用,并且更频繁地与 SSH 一起使用。使用 SSH 时,密钥代理几乎总是可用的,因为ssh-agent几乎所有标准的 SSH 客户端工具集都包含类似的工具。这也使得使用代理的培训变得容易,因为以一种特定方式使用一种工具的培训几乎适用于任何地方。

HTTPS 系统的关键代理要多样化得多,安装可能不太常见,即使在特定系统中可用,也不太可能有人知道某个特定的可用并知道如何使用它。

远程代理

其次,SSH 支持远程代理连接,允许从您正在执行的系统中删除密钥材料,git fetch 这在许多情况下可以大大提高安全性。这最好通过我最常见的工作流程示例来描述。

我的笔记本电脑是一台“个人”机器,因为我是唯一可以使用它的人。(它具有全盘加密和仅适用于我的用户帐户。)当我登录时,我启动本地ssh-agent并将我的密钥(也受密码保护)加载到其中,并ssh-askpass 通过ssh-add -c.

当我通过 SSH 连接到我正在进行开发的主机时,通常与其他人共享,我ssh -A用来启用代理转发。然后git fetch,它会启动从开发主机到 Git 远程服务器的 SSH 会话。

当远程请求进行身份验证时,该 SSH 会接收请求并将其转发回我笔记本电脑上的代理。我在屏幕上收到一条警报,说我的本地代理已收到身份验证请求,这是我期望的,因为我刚刚启动了会导致该请求的操作,因此我批准了身份验证。开发主机上的 SSH 进程接收回它需要进行身份验证的信息(仅对特定会话有效),成功通过远程服务器git fetch进行身份验证,然后我继续。

请注意,这要安全得多,因为 a)密钥从未在开发服务器上,因此攻击者很难访问(他们需要使用我的私人笔记本电脑),并且 b) 我收到有关我的请求的通知要使用的密钥,允许我检测使用密钥的意外尝试。(任何在开发服务器上拥有 root 权限的用户也可以将身份验证请求转发到我的笔记本电脑。)而且我不必每次都输入密码,因此拥有密码保护的密钥文件就少了很多麻烦。