Loading...

SSH

标签:

Secure Shell - Wikipedia

安全外壳协议 (SSH) 是一种加密网络协议,用于在不安全的网络上安全地操作网络服务。它最著名的应用程序是远程登录和命令行执行。

SSH 专为类 Unix 操作系统而设计,可替代 Telnet 和不安全的远程 Unix shell 协议,例如 Berkeley Remote Shell (rsh) 和相关的 rlogin 和 rexec 协议,这些协议都使用不安全的纯文本身份验证方法,例如密码。

由于 Telnet 和 Remote Shell 等机制旨在访问和操作远程计算机,因此以不安全的方式通过公共网络向这些计算机发送用于此访问的身份验证令牌(例如用户名和密码)会带来很大的风险,即第三方获取密码并实现与 Telnet 用户相同的远程系统访问级别。Secure Shell 通过使用加密机制来降低这种风险,这些机制旨在向观察者隐藏传输内容,即使观察者可以访问整个数据流。

SSH 由芬兰计算机科学家 Tatu Ylönen 于 1995 年首次设计(以取代 Telnet 网络协议)。协议套件的后续开发在几个开发人员组中进行,产生了多种实现变体。协议规范区分了两个主要版本,称为 SSH-1 和 SSH-2。最常实现的软件堆栈是 OpenSSH,它由 OpenBSD 开发人员于 1999 年作为开源软件发布。实现是针对所有常用的操作系统(包括嵌入式系统)分发的。

SSH 应用程序基于客户端-服务器架构,将 SSH 客户端实例与 SSH 服务器连接起来。SSH 作为分层协议套件运行,包括三个主要的分层组件:传输层提供服务器身份验证、机密性和完整性;用户身份验证协议对服务器验证用户;连接协议将加密隧道多路复用为多个逻辑通信通道。

SSH 使用公钥加密对远程计算机进行身份验证,并允许它在必要时对用户进行身份验证。

SSH 可用于多种方法。以最简单的方式,通信通道的两端都使用自动生成的公钥-私钥对来加密网络连接,然后使用密码对用户进行身份验证。

当用户手动生成公钥-私钥对时,身份验证基本上是在创建密钥对时执行的,然后可以在没有密码提示的情况下自动打开会话。在此方案中,公钥放置在必须允许访问匹配私钥的所有者的所有计算机上,所有者将该私钥保持为私有。虽然身份验证基于私钥,但在身份验证期间,密钥永远不会通过网络传输。SSH 仅验证提供公钥的同一人是否也拥有匹配的私钥。

在所有版本的 SSH 中,在接受未知公钥为有效之前,验证未知公钥(即将公钥与身份相关联)非常重要。未经验证就接受攻击者的公钥将授权未经授权的攻击者为有效用户。

SSH 基本知识

SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。

实务中,它主要用于保证远程登录和远程通信的安全,任何网络服务都可以用这个协议来加密。

SSH 是什么

历史上,网络主机之间的通信是不加密的,属于明文通信。这使得通信很不安全,一个典型的例子就是服务器登录。登录远程服务器的时候,需要将用户输入的密码传给服务器,如果这个过程是明文通信,就意味着传递过程中,线路经过的中间计算机都能看到密码,这是很可怕的。

SSH 就是为了解决这个问题而诞生的,它能够加密计算机之间的通信,保证不被窃听或篡改。它还能对操作者进行认证(authentication)和授权(authorization)。明文的网络协议可以套用在它里面,从而实现加密。

历史

1995 年,芬兰赫尔辛基工业大学的研究员 Tatu Ylönen 设计了 SSH 协议的第一个版本(现称为 SSH 1),同时写出了第一个实现(称为 SSH1)。

当时,他所在的大学网络一直发生密码嗅探攻击,他不得不为服务器设计一个更安全的登录方式。写完以后,他就把这个工具公开了,允许其他人免费使用。

SSH 可以替换 rlogin、TELNET、FTP 和 rsh 这些不安全的协议,所以大受欢迎,用户快速增长,1995 年底已经发展到五十个国家的 20,000 个用户。SSH 1 协议也变成 IETF 的标准文档。

1995 年 12 月,由于客服需求越来越大,Tatu Ylönen 就成立了一家公司 SCS,专门销售和开发 SSH。这个软件的后续版本,逐渐从免费软件变成了专有的商业软件。

SSH 1 协议存在一些安全漏洞,所以 1996 年又提出了 SSH 2 协议(或者称为 SSH 2.0)。这个协议与 1.0 版不兼容,在 1997 年进行了标准化,1998 年推出了软件实现 SSH2。但是,官方的 SSH2 软件是一个专有软件,不能免费使用,而且 SSH1 的有些功能也没有提供。

1999 年,OpenBSD 的开发人员决定写一个 SSH 2 协议的开源实现,这就是 OpenSSH 项目。该项目最初是基于 SSH 1.2.12 版本,那是当时 SSH1 最后一个开源版本。但是,OpenSSH 很快就完全摆脱了原始的官方代码,在许多开发者的参与下,按照自己的路线发展。OpenSSH 随 OpenBSD 2.6 版本一起提供,以后又移植到其他操作系统,成为最流行的 SSH 实现。目前,Linux 的所有发行版几乎都自带 OpenSSH。

现在,SSH-2 有多种实现,既有免费的,也有收费的。本书的内容主要是针对 OpenSSH。

SSH 架构

SSH 的软件架构是服务器-客户端模式(Server - Client)。在这个架构中,SSH 软件分成两个部分:向服务器发出请求的部分,称为客户端(client),OpenSSH 的实现为 ssh;接收客户端发出的请求的部分,称为服务器(server),OpenSSH 的实现为 sshd。

本教程约定,大写的 SSH 表示协议,小写的 ssh 表示客户端软件。

另外,OpenSSH 还提供一些辅助工具软件(比如 ssh-keygen 、ssh-agent)和专门的客户端工具(比如 scp 和 sftp),这个教程也会予以介绍。

SSH 如何工作?

TCP/IP

SSH 在 TCP/IP 协议套件的基础上运行,而互联网的大部分功能都依赖于 TCP/IP 协议套件。TCP 代表 Transmission Control Protocol(传输控制协议),IP 代表 Internet Protocol(Internet 协议)。TCP/IP 将这两个协议配合使用,以便格式化、路由和传送数据包。除其他信息外,IP 表示数据包应发送到哪个 IP 地址(看成邮寄地址),而 TCP 则表示数据包应发送到每个 IP 地址的哪个端口(看成大楼的楼层或公寓号码)。

TCP 是一种传输层协议:它与数据包的传输和交付有关。通常,在 TCP/IP 的基础上还会使用其他协议,以便将传输的数据转换成应用程序可以使用的形式。SSH 就是这样一种协议。(其他例子包括 HTTP、FTP 和 SMTP)。