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

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

好吧,考虑到凭证以不安全的方式存储在文件系统的某个地方(Ubuntu 上的默认选项)。有不少网站告诉你使用 SSH 更安全,应该这样使用-

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

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

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

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

答案1

我不清楚你是否被告知 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 权限的任何用户也可以将身份验证请求转发到我的笔记本电脑。)而且我不必每次都输入密码,因此拥有受密码保护的密钥文件麻烦少了很多。

相关内容