paul23 Asked: 2020-02-20 08:50:57 +0800 CST2020-02-20 08:50:57 +0800 CST 2020-02-20 08:50:57 +0800 CST 为什么在使用凭证直接连接到 Git 存储库时 SSH 比 HTTPS 更安全 772 好吧,考虑到凭据以不安全的方式存储在文件系统的某处(Ubuntu 上的默认选项)。有很多网站告诉您使用 SSH 更安全,应该用作- “使用 HTTPS,凭据存储在未加密的文件中” 然而,这对我来说意义不大:使用 SSH,您还有一个存储(私有)密钥的简单文件,因此任何获取该文件的人都可以轻松连接到 git 存储库。 而且这两个文件都不是更难访问:它们都只是存储在本地文件系统上,大部分是未加密的(在 Linux 上)。 那么是什么让 SSH 比 HTTPS 更安全呢? ssh git 1 个回答 Voted Best Answer cjs 2020-02-20T17:26:07+08:002020-02-20T17:26:07+08:00 我不清楚您是否被告知在您的特定情况下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 权限的用户都可以将身份验证请求转发到我的笔记本电脑。)而且我不必每次都输入密码,因此拥有受密码保护的密钥文件就不会那么麻烦了。
我不清楚您是否被告知在您的特定情况下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 权限的用户都可以将身份验证请求转发到我的笔记本电脑。)而且我不必每次都输入密码,因此拥有受密码保护的密钥文件就不会那么麻烦了。