ssh工具,开发者必须有所了解
在我写《深入浅出HTTPS:从原理到实战》这本书的时候,想着密码学应用的重要性,很想讲一讲 SSH 协议,简单了解了下,感觉知识真的太多了,就废弃了这个想法,最近想弄一个东西,就简单看了下,从而形成本文,而且对程序员来说,理解 SSH 协议真的很有必要。
SSH是一个加密的网络协议,众所周知,TCP/IP协议族是不安全的,而SSH协议一定程度上弥补了这一缺失,让网络服务能够构建在相对安全的通道上,这就是它最大的作用。
SSH协议是一个B/S协议,有了SSH,就可以远程登录你的机器了,当然 Telnet 协议也能连接远程主机,只不过 Telnet 无法加密数据;另外 SSH 还能执行远程命令,类似于一个终端(可以替代 rlogin,rsh, rexec 协议),让它有了更大的发挥空间。
很多人意识不到 SSH 服务端的存在,原因就是大部分 Linux 发行版原生支持它,不用安装,紧密的和操作系统联系在一起,SSH 服务器一般绑定 22 端口。
SSH 协议有两个版本,分别是 SSH1 和 SSH2,不过主流是 SSH2 版本。SSH 协议在数据通信过程中,能够确保数据是加密的和完整的(请注意,安全的数据传输不能光是加密的,还要确保是完整的,加密是确保数据密文不会被破解,而完整是确保数据没有被篡改)。
SSH协议和HTTP协议都是B/S模型,但二者在应用架构上有很大的区别,HTTP协议是任何客户端都能连接服务器端,而SSH协议的客户端一般都具备SSH服务器端的操作权限,所以在连接之前必须进行验证,以便证明客户端拥有远程主机的权限。从密码学的角度看,是通过公开密钥协议进行验证的(public-key cryptography)。
验证方式主要有两种,一种是密码校验方式(虽然不安全,但对初学者来说,上手更快),另外一种就是使用密钥对的方式进行验证,关于这两种验证方式的原理和使用,我会专门写文章介绍。
那SSH主要运用在哪儿呢?上面已经说了一些,比如可以远程连接,远程运行命令,构建加密通道(一个 tunneling 协议)。尤其加密通道的功能让它有了很多的发挥空间,比如说通过 SSH 协议,你能构建一个私有网络(比如 VPN 协议,从原理上是可行的),另外很多网络服务(比如 FTP,CP,rsync)都可以使用 SSH 协议,比如 FTPS 协议,比如 SCP 协议,而 rsync 有了SSH模块后,功能也更强大了,能够更安全的备份数据了。
SSH协议还支持端口转发(forwarding TCP ports),可以弄出很多好玩的应用,比如我为了上网科学,浏览器代理 SOCKS 端口,然后 SOCKS 端口转发数据走 SSH 加密通道。
SSH协议通过一些方法(主要是 OpenSSH 工具)还能自动登录远程主机,主机管理非常方便。
那SSH协议和OpenSSL工具之间有什么联系呢?OpenSSH是SSH协议的一种实现,而且是最流行的一种实现,目前属于 OpenBSD 工程的一部分。可以认为SSH协议就是OpenSSH工具,现在大部分Linux发行版默认就安装了OpenSSH服务器端(sshd,一种 daemon 服务),当然 OpenSSH 有很多工具集,比如:
- 远端操作工具,包括 ssh(客户端程序),scp,sftp
- 密钥管理工具(客户端身份校验需要,讲ssh身份验证的时候会说),包括 ssh-add, ssh-keysign, ssh-keyscan, ssh-keygen。
- 服务器端工具,包括 sshd,sftp-server,ssh-agent。
以前我常常搞混 OpenSSL 和 OpenSSH,因为它们都以 Open 开头,还以为是一回事。它们都是协议的一种实现,都和数据传输安全有关,也是互联网流行后出现的两种工具,都是密码学算法的组合应用,尤其 OpenSSL,除了是 TLS 协议的实现,还提供了很多密码学算法库,所以很多其他软件都会引用它,包括 OpenSSH 最初也使用了 OpenSSL 库(从 2014年开始后,逐步减少对OpenSSL库的依赖)。
另外二者使用的场景不一样,OpenSSL协议主要作用于 HTTPS 协议,而HTTPS(HTTP)协议节点之间都是互相不认识的,所以更加通用,只要你使用浏览器,多多少少就会知道。
而OpenSSH客户端一般都是远程主机的管理者,使用频率较少,除了程序员,大部分人会接触不到,但从功能上看,OpenSSH协议发挥空间更大,紧密和Linux联系在一起。
OpenSSH服务器端主要就是运行 sshd 程序,客户端的原生命令就是 ssh,在 Linux 上直接通过 ssh 就能连接远程主机了,Windows 10 也原生支持 OpenSSH 了,打开 cmd 命令行窗口直接能够运行 ssh 客户端命令了。
当然还有很多工具引入 OpenSSH 成为一个 ssh 客户端,但必须注意的是,这些工具还有其他附加的功能,不只是一个 ssh 客户端。
这些工具有 SecureCRT,Putty 等等,除了具备 ssh 核心功能,它们还是非常优秀的一个终端工具。
本文简单介绍了 SSH 协议的功能,对 SSH 有了基本的了解;还解释了 SSH 和 OpenSSH 工具之间的关系,同时简单理解 OpenSSH 和 OpenSSL 是不同的工具;当然 ssh 的通道和端口转发功能博大精深,后面还想继续学习学习,对于理解网络应用和解决实际的问题有很大的好处;如果能从原理上理解 SSH 协议的工作原理,那么对于掌握密码学算法会更有帮助;从使用的角度看,掌握 ssh 客户端验证方法会更加的实用,下一篇我会介绍下