比方说,我有一台服务器在端口1234上侦听。我有一些客户端软件需要能够连接到此端口。但我想阻止恶意用户绕过客户端软件并通过其他方式(例如在控制台或其他软件中)连接到端口。如何以安全的方式验证客户端连接?
如果需要,受信任的客户端软件和服务器可能共享一个密钥。我不希望以明文形式发送这样的密钥,但认证后的数据可以采用明文形式。具体而言,我试图找出如何打败恶意用户使用可信客户端软件来计算服务器挑战的正确响应的中间人攻击。
我可以从这里到达吗?
我可以让服务器的侦听端口只绑定到本地主机,并要求客户端首先通过ssh获得对机器的访问权限。然后,客户端软件可以使用ssh库在连接到本地端口的服务器上运行命令(在这种情况下,恶意用户将无法使用ssh访问机器,因为他没有密码)。但后来我的所有流量都被加密了,这是额外的开销。也许有一个类似于ssh的程序只能进行身份验证,然后在那之后以纯文本的形式离开该通道?
更新:
我跑了测试,以确定与加密所有交通相关的开销。
spew.rb输出1000万个100字符的行。
CONTROL:
[email protected]> time /home/fantius/spew.rb > /dev/null
real 0m35.015s
user 0m34.934s
sys 0m0.084s
顶部示出了25%的CPU使用率(一个完整的芯,4个内核)
TEST:
[email protected]> time ssh localhost /home/fantius/spew.rb > /dev/null
real 0m40.704s
user 0m19.981s
sys 0m1.400s
顶部示出了45%的CPU使用率(近两全核心)
所以我无法购买加密所有东西的成本是最小的。当然,这是一个数据量非常大的测试。
如果您可以从二进制文件中提取密钥,您将获得完全访问权限 - 对此我可以。据我的理解,ssh对中间人攻击有抵抗力,至少比一个简单的系统要求客户解决服务器发出的挑战更有效。但我不知道这种额外阻力的性质。 – Fantius 2011-01-13 19:00:44