【翻译】为什么我要用 SSH 来完成各种工作?
原文地址:Why aren’t we using SSH for everything?
译文地址:为什么我要用 SSH 来完成各种工作?
为什么我要用 SSH 来完成各种工作?
几个星期前,我写了小项目 ssh-chat:
想法很简单:打开终端并输入
$ ssh chat.shazow.net
与其他许多应用不同,你可能会在输入“ls“之前停下来,并注意到这不是一个shell,这是一个聊天室!
当你慢慢深入细节,你才会发现这里有一些特殊的地方。
SSH 知道你的用户名
当你用ssh连接到一台服务器时,你的客户端程序会将一些环境变量共享到服务器端,而$USER变量正在其中。当然,你可以重写这一点,通过指定的用户进行连接,例如:
$ ssh neo@chat.shazow.net
看,你是唯一的用户。如此的特别。除此之外我们还能获取到其他什么信息?在默认情况下,服务器同样会获得你的 $TERM变量。
$ TERM=inator ssh chat.shazow.net
如果ssh-chat很聪明的话, 它将识别出你的定制终端可能不支持颜色的显示,并且它会忽略发送这些额外的格式化字符。
你甚至可以用一个SendEnv选项标识来推送你自己的环境变量,但我们就不详细说这个问题了。
SSH 验证你的密钥对
这里有几种SSH支持的身份验证方法:空,密码,键盘交互和公钥。他们各自都拥有着有趣的属性,但最后一个方法最为便捷。
当你的SSH客户端连接上服务器时,它会处理那些可接受的身份验证方法(通常是上诉方法的相反顺序)。如果你已指定身份标识或你的~/.ssh/目录中存在一些密钥,那么你的客户端会提供一些公共密钥来进行身份验证。如果服务器端识别出其中的一个密钥,例如那些列入authorized_keys(被授权的密钥)名单的密钥,然后会有一个安全握手行为开始验证你所持有的私有密钥跟公共密钥,这其中并不会暴露哪一个是私有密钥。在这个过程中,客户端和服务器端安全地达成了一项由临时的对称会话密钥进行加密的沟通。
这是什么意思呢?这意味着SSH有内置的身份验证协议。当你加入ssh-chat时,我不仅可以知道你是谁,还可以永久地、安全地附加一个身份到你的连接中,并且不需要任何用户干预。没有要注册的表单,没有电子邮件中的要点击的链接,没有花哨的移动应用程序。
未来版本的ssh-chat将允许你创建一个永久性的账户,这会验证你的密钥对,并且这些永久性账户可能会拥有各种特殊功能,例如:用户名所有权、永远在线的功能以及通过电子邮件或Pushover推送通知的功能。
SSH 的连接是加过密的
服务器端会使用同一类型的密钥对作用于一个客户端。当你连接到一个新的SSH主机时,你会得到一个显示为“密钥指纹”的信息用于身份验证。这里说的指纹是指以十六进制哈希值表示的服务器端的公共密钥。
如果当你尝试连接到chat.shazow.net时,并且看到了一个不同的指纹哈希值? 这意味着,你遭到了中间人攻击。
你本地范围的秘密安全机构常常能够让一个SSH服务器作为另一个前端代理的SSH服务器(类似于sshmitm) ,并且记录通过它所发生的一切行为。幸运的是,只要这个代理服务器没有原始服务器的私有密钥,那么这个密钥指纹就会不同。
一旦你接受了一个指纹信息,它将被添加到你的~/.ssh/known_hosts中,然后被固定在这台主机上。这意味着只要这个密钥在这台主机上发生改变,你就会收到这些可怕的消息:
一个你曾经连接过的主机公布的是一个与之前不同的公共密钥。如果你不能解释这个变化 (也许是你在和以前相同的IP地址上启动了一个新的VPS,并且它生成了一个全新的SSH密钥对?)那就值得注意了。尝试从另一个网络连接到这台主机,看看这个问题是否仍然存在——如果不存在了,那就说明有人劫持了你的本地连接,而非服务器连接。
SSH 支持多路复用
当你的客户端连接到服务器时,它可以打开一个通道并去请求一个特殊功能。这里有很多有趣的事情可以从你的客户端发出请求,例如:pty-req(伪终端),exec(执行命令),甚至是tcpip-forward(端口转发),点击这里可以查看更多信息。没有什么可以阻止你去发明属于你的类型的自定义客户端/服务器实现。也许有一天我们会看到一个聊天通道?
最棒的地方在于你可以在做上诉所有事情的同时:还可以打开一个shell程序,并当发现有一些命令运行在后台时启动端口转发功能。
一旦你的管道被打开,你可以在它里面发送更多的命令。当你的客户端打开了一个伪终端时,它会发送事件的更新,例如:每当你的终端尺寸发生变化时,它都会发送窗口改变事件。
SSH 无处不在
“它是移动端友好的吗?” 你可能会开玩笑的问,但结果是肯定的!在你可以想到的每个平台,都有一个可用的SSH客户端,包括IOS平台,安卓平台,甚至是Windows平台!OSX和每一个Linux发行版都附带了一个客户端。 这里甚至还有一些浏览器扩展的SSH客户端。
SSH是一种最易访问的安全协议,当然,它仅次于HTTPS协议。
SSH 听起来很棒,很熟悉…
来看看到目前为止我们所拥有的功能:二进制协议,强制性加密,密钥的固定,多路复用,压缩(是的,它同样可以进行压缩)。
难道是因为这些密钥特性,我们才发明的HTTP/2?
不可否认,SSH缺少了一些功能块,它缺少虚拟主机的概念,或是能够在一个单一的IP地址上用不同的主机名来服务不同的端点的功能。
另外,SSH在HTTP/2之上还有一些很酷的特性,例如:内置的客户端身份验证, 这可以消除注册的必要性以及需要额外记住的密码。
更多的科学事实来丰富你的理解
- SSH服务器和客户端的规范非常对称。按照协议,大部分客户端能够要求服务器做的事,服务器也可以要求客户端来做。这包括诸如运行命令的操作,但是主流客户端并没有实现这个功能(如在规范中所建议的)。
- 每一次按键都是通过TCP连接发送的。这就是为什么当你输入时你可能会发现有些延迟。
- 查看你的OpenSSH客户端在做什么,使用 -v 命令来启用详细的调试输出信息。用另一个 -v 命令查看每一次按键的调试信息,再用另一个 -v 命令增加进一步的调试。
- 有一个叫做MOSH的协议,它采用SSH来引导但用客户端做预测呈现,以及用于去除UDP状态同步协议的延迟影响。我希望会有更多的第三方实现。
- 由于SSH支持端口转发功能和SOCKS代理接口,你可以使用类似于sshuttle 的方式在它上面构建VPN。
- SSH可以用授权证书的方案进行身份验证,类似于x.509证书被用于TLS。而且,有很多客户端可以验证服务器指纹和SSHFP DNS条目。
一些刺激的SSH想法
虽然通过SSH聊天很有趣,但这仅是“我们能想到(用SSH做什么)”的一个提示。
多人联机地牢游戏 (MUD)
总有一天,你可以通过ssh连接到mud.shazow.net,并可获得一个小型的ASCII码的RPG世界去探索。虽然现在还没有,但它可能就会发生。
分布式哈希表 (DHT)
获得这个技术的可能性是惊人的……https://twitter.com/shazow/status/549348566972370944
编程式数据流
或许更好的是,通过合适的安全与加密方式实现的ZeroMQ风格的socket通信?可以看下这篇文章:Jeff Lindsay’s Duplex 。虽然仍是相关概念的证明,但却有很多很酷的演示demo。
RPC API
SSH的内置身份验证技术以及加密技术,使其在某些事情上真心很方便,例如:APIs。没有复杂的OAuth2握手或HMACs和签名。
ssh api.example.com multiply a=4 b=5
总有一天我们会有很好的类库,使连接SSH就像连接HTTP一样容易。在这点上,你的代码看起来就会像今天的普通REST API一样,但其下使用的却是SSH。
无论用哪种方式,那些在API文档中出现繁复实例的日子将会渐渐离我们远去。
文件服务器
如果我们拥有RPC API,为什么我们不能在它之上提供静态文件服务呢?
ssh static.example.com get /images/header.png
请记住,SSH对于可持续化连接同样有很好的支持,所以你的浏览器可以通过以SSH通道命名的get请求连接到主机,并且同时能够发送get请求来获取资源。我们甚至能够实现ETAGs以及更多。
最后一点,HTTP
在这一点上,我们没有理由不建立一个在HTTP/1或HTTP/2版本上的SSH。来让我们添加一个头部通道去做一些特定的事情,例如:对虚拟主机的支持, 也可以在其中插入一些Cookie头信息。 想添加一些方法动词吗?为什么不呢?来让我们做一个通道群,就像post一样,或许更合理的说就http-post一样。
为什么我要用 SSH 来完成各种工作?
很棒地问题。
此文只为记录编程过程中积攒的思想与经验,若您有更好的思路希望您能给我留言,谢谢啦!~
posted on 2016-08-10 09:35 ExDevilLee 阅读(1037) 评论(0) 编辑 收藏 举报