好吧,考虑到凭证以不安全的方式存储在文件系统的某个地方(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 权限的任何用户也可以将身份验证请求转发到我的笔记本电脑。)而且我不必每次都输入密码,因此拥有受密码保护的密钥文件麻烦少了很多。