场景:我想使用 SSH/SFTP 从客户端 A 连接到客户端 B。我无法在任一客户端上打开端口。为了解决这个问题,我得到了一个便宜的 VPS 用作中继服务器。
在客户端 BI 上,使用远程端口转发连接到 VPS,如下所示:
ssh -4 -N -f -R 18822:localhost:22 <user>@<vps-ip>
在 VPS 上,我使用-g
(全局)设置了本地端口转发,如下所示:
ssh -g -f -N -L 0.0.0.0:18888:localhost:18822 <user>@localhost
这样我就可以从客户端 A 直接连接到客户端<vps-ip>:18888
B。效果很好。
现在我的问题是,这有多安全?据我所知,SSH/SFTP 连接是完全加密的,但是否有可能通过在中间使用 VPS 来降低安全性?
让我们假设这两种情况:
案例A:VPS本身没有改动,但流量和文件被完全监控。
案例 B:VPS 完全受损,文件系统内容可以更改。
如果我现在通过 SFTP 从客户端 A 向客户端 B 发送文件,托管 VPS 的公司是否可以“拦截”它并读取文件的(未加密)内容?
你做了什么
您使用了三个ssh 命令:
在B控制台中,您执行了以下操作:
命令 sshd(服务器)打开 port
18822
,一个连接到 localhost (B) 端口 22的远程端口。vps:18822
在vps控制台中,您执行了以下操作:
命令 ssh(客户端)打开
18888
可用作外部(0.0.0.0
) 端口的() 端口,vps
该端口连接到内部端口 18822。这将打开一个 Internet 可见端口
vps:18888
,该端口将流量重定向到18822
该端口,进而重定向到B:22
.在A控制台上(也是A 参与的唯一连接):
在.从客户端A直接连接到客户端B。
vps:18888
重要的是最后的连接。整个 SSH 安全性
取决于A到B的身份验证。
这是什么意思
SSH协议
通过使用端到端加密
端到端加密是一个概念。SSH 是一种协议。SSH 实现端到端加密。https 或任何其他数量的加密协议也可以。
如果协议很强大,并且实现是正确的,那么知道加密密钥的唯一方是两个经过身份验证的(结束)方。
不知道密钥并且不能破坏协议的安全性,任何其他方都被排除在通信内容之外。
如果,如您所描述的:从客户端 A 直接到客户端 B,您直接向系统 B 进行身份验证,那么只有客户端 A 和客户端 B 拥有密钥。没有别的。
第一季度
案例A:VPS本身没有改动,但流量和文件被完全监控。
只有通信(日期、时间、最终 IP 等)正在发生并且可以监控一定数量的流量(kbytes、MBytes)这一事实,但不能监控所通信内容的实际内容。
第二季度
案例 B:VPS 完全受损,文件系统内容可以更改。
没关系,即使通信通过其他一些站点/地点重新路由,知道密钥的只有两方是 A 和 B。也就是说:如果通信开始时的身份验证是在 A 和B.
或者,检查 A 连接的 IP 的有效性,然后: 使用公钥认证(仅使用一次只有 A 和 B 知道的私钥-公钥对),完成。
了解您必须确保使用的公钥安全地传送到系统 B。您不能信任相同的通道来携带密钥然后进行加密。存在可能破坏协议的中间人攻击。
第三季度
不,如果公钥被安全地放置在两端,那么发生这种情况的可能性微乎其微。
带着带公钥的盘到对方去安装,再也不用担心了。
评论
从您的评论中:
第一季度
有点儿。是的,VPS不应该参与身份验证。但它是“In-The-Middle”,即它从一侧接收数据包并将它们(如果工作正常)传递到另一侧。但是还有另一种选择,VPS(或任何中间人)可以选择撒谎并执行“中间人攻击”。它可能对假装客户 B 的客户 A 说谎,对假装客户 A 的客户 B 说谎。这将揭示与“中间人”通信中的所有内容。这就是为什么我在上面强调应该这个词。
我还应该说:
基于密码的身份验证不是公钥方法。
如果您使用密码进行身份验证,您可能会受到中间人攻击。还有其他几种选择,但不在本文的范围内。
基本上,使用 ssh-keygen 生成一对密钥(假设在 A 面),并且(为了正确的安全性)将磁盘内的公共部分带到 B 面并将其安装在 Authorized-keys 文件中。不要使用网络安装公钥,即:不要在网络上使用 ssh-copy-id,除非你确实知道自己在做什么,并且能够验证 B 方的身份。您需要成为专家才能安全地执行此操作。
第二季度
是的,它是公开的。
嗯,是的,生成公私对的实体可以将公共部分发布给任何人(每个人),并且不会丢失任何秘密。如果任何人只用它的公钥加密,它就可以用匹配的(和秘密的)私钥解密任何消息。
SSH 加密。
顺便说一下,SSH 加密是对称的而不是非对称的(公共的)。身份验证是非对称的(DH(Diffie-Hellman)(用于密码)或RSA、DSA、Ed25519 密钥强度或其他(用于公钥)),然后从该身份验证生成对称密钥并用作通信加密密钥。
用于身份验证。
但是对于 SSH,公钥(使用 ssh-keygen 生成)带有一个额外的秘密:它验证公钥的所有者。
如果您从 Internet 收到公钥:您如何知道它属于谁?你相信那个公钥声称它是什么吗?你不应该 !!
这就是为什么您应该将公钥文件携带到远程服务器(以安全的方式)并将其安装在那里。之后,您可以信任该(已验证的)公钥作为验证您登录该服务器的方法。
第三季度
它交换一组用于加密的公钥(一组 DH 生成的公钥)。不是使用 ssh-keygen 生成的身份验证公钥。一旦通信关闭,用于该通信的密钥将被删除和遗忘。
好吧,您还接受(并使用)了一个密钥来验证远程服务器的 IP。确保 IP 的安全性比简单的 ( ?? ) 公钥身份验证更加复杂。
而且您的(一般)印象是正确的,但魔鬼在细节中...
生成密钥对的人可以发布他的公钥,而不会降低他的安全性。
接收公钥的人必须 独立确认公钥属于他认为属于谁的人。
否则,公钥的接收者可能正在与邪恶的伙伴进行通信。
生成您的密钥
如果你用 ssh 把 A 连接到 C,然后 C 连接到 B,那么它不是端到端的。它是 C 的一端,而 C 是另一端。C 可以看到正在传输的内容。
对于端到端加密,您需要 ssh 来连接两端。你经历了什么并不重要。
如果两端看不到对方,但可以看到 C,那么您可以建立(安全与否)连接 A-C 和 B-C。然后使用 ssh 建立安全连接 A—B。