跳转至

26 黑客的好帮手 - SSH

通信协议

我们今天来谈论一下 SSH,Secure Shell 和 Telnet,这是两种广泛使用且非常有用的基于 UNIX 和 Linux 的远程通信协议。

首先来看一下基本的概念,通信协议是一组公认的规则,用于建立同步方法和通信会话的各方将使用它们来管理其交换。广泛采用的协议允许硬件制造商设计能够与其他网络设备和软件开发人员进行可靠通信的产品,以满足他们的软件可能面临的连接需求。开放系统互连模型 OSI 是网络连接的通用且有用的概念,它将整个过程分为七个不同的层,这是我们最开始就讲过的。例如,如果我在访问 Internet 某个站点时将 JPEG 图像加载到浏览器中,则该图像实际上是由浏览器加载,并且使用户(在应用层上)可理解,即第 7 层。在表示层(第 6 层)上,图像已转换为浏览器的可读格式,在该层进行了诸如加密和媒体文件处理之类的数据转换。通过 HTTP 协议,在第 5 层(会话层)上管理我的计算机与远程 Web 服务器进行通信的正在进行的连接本身。 SSH 和 Telnet 也在第 5 层上运行。虽然会话本身由第 5 层维护,但实际上并没有执行任何操作。你可以将其视为没有人说任何东西的电话。因此,将 JPEG 文件获取到我的计算机时,将需要使用 TCP 协议在传输层的会话之上进行数据传输。第三层,即网络层,是由诸如路由器或 IPv4 和 ICMP 协议之类的设备组成的基础结构,可实现地址分配,网络节点之间的路由以及对移动网络流量的控制。当我在浏览器的导航栏中键入网站 URL 时,将请求实际路由到 Web 服务器主机的过程是在第 3 层上完成的。一旦知道了数据包的目的地,则数据链接层将负责数据帧和数据包的实际传输。处理接收确认。这些帧的流在通过以太网或 PPP 等媒体传输时,可以在它们的目的地重组为单个资源,例如我耐心等待的 JPEG。最后,数据传输本身以某种电,光或无线电信号的形式通过物理层上的网络介质(如电缆或 Wi-Fi)进行传输。然后,每个数据包将以某种方式通过我的客户端计算机上的各个层进行定向或转换,但顺序相反。正如我前面说过,OSI 模型是一种工具,用于可视化和阐明参与网络通信的每个组件的作用。当然这个不是本节课的重点。我们还是来把焦点放在 SSH 和 Telnet 上。

OpenSSH

Secure Shell 程序是一种协议,可让你在任何基于 UNIX 的服务器上打开远程终端会话,在该服务器上,你可以根据登录帐户可用的权限执行命令。与其他远程连接工具(包括 Telnet)相比,SSH 的主要优势在于,你在此会话期间所做的所有操作都将被加密,因此,可能在你与远程主机之间的任何时间观看的任何人都只会看到不可读的文本。使用相同的基本过程,你还可以使用 SCP 在节点之间安全地传输文件,并且在服务器和客户端计算机上适当地编辑了配置文件后,也可以在远程主机上安全地启动 GUI 应用程序。

img

SSH 使用起来可以说非常的简单实用,SSH 可以在 Windows 10 计算机上本地使用。 SSH 的验证方式有以下三种

  1. RSA rhost authentication。如果远程主机包含名为任一主机的文件,则 RSA rhost 身份验证起作用。如果这些文件中的任何一个包含标识客户端计算机及其当前用户的条目,并且主机服务器已经具有客户端主机密钥的兼容条目,则将允许登录。如果这些文件都不存在,并且很大程度上是由于 Rhost 系统本身内部的结构缺陷,那么默认情况下通常会出现这种情况,则客户端上运行的 SSH 程序将向服务器标识其想要的本地加密密钥对利用也就是第二种方式。
  2. /etc/hosts.equiv
  3. /etc/ssh/shosts.equiv
  4. /home/username/.rhosts
  5. /home/username/.shosts
  6. Private/pubic keypair authentication - 你首先需要一对密钥。如果还没有,则可以生成一个密钥对。使用 ssh-keygen 程序在 Linux 客户端上用户主目录中的 ssh 目录(.ssh)- 目录名称前面的点告诉 Linux,这是一个隐藏文件,只能使用带-a 标志的 ls 才能看到。ssh 目录可以存在于任何单独的用户目录层次结构中,系统的 etc 目录下还有一个 SSH 目录,其中包含密钥对和两个配置文件。ssh_config 文件确定该计算机在默认情况下将如何充当其他远程计算机上的客户端,而 sshd_config 文件将其行为作为远程客户端访问的主机的主机进行控制。
  7. SSH user keys location - /home/username/.ssh
  8. SSH system keys location - /etc/ssh
  9. SSH configuration files /etc/ssh/ssh_config 和 /etc/ssh/sshd_config
  10. Password authentication。如果前两个身份验证选项都不起作用,则服务器将提示客户端输入密码。出于安全原因,最好避免依赖密码。这对于 SSH 协议版本 1 和更现代的 SSH 协议版本 2 都是很常见的。此外,版本 2 还支持 RSA,DSA 和 OpenPGP 公钥算法

Private/Publlic Key 详解

如果你接受 ssh-keygen 的默认值,它将创建两个文件分别称为 id_rsa 和 id_rsa.pub。第一个文件是该对文件中的私有文件,应谨慎对待,并且永远不要暴露于不安全的网络中,例如将其作为电子邮件附件发送。通常,你将私钥保留在计算机上。系统将提示你创建一个密码短语,每次尝试基于密钥的远程登录时,本地计算机都希望你输入该密码短语。我将创建一个密码短语

img

我将公共密钥打印到屏幕上。就是长这个样子的。

img

我将内容(仅内容)复制到剪贴板。登录到我要为其设置基于密钥的登录的计算机。转到.ssh 目录,打开文本编辑器的 authorized_keys 文件,然后将我们之前复制的公钥粘贴到新行上。现在,回到我们的客户端计算机中,我再次输入 ssh 地址。这次无需输入密码即可直接进入远程计算机。除了使我不必每次登录时都记住和输入密码外,它的一个显着优点是,我们可以避免通过尚未得到保护的连接来传输密码本身。

我相信你应该会有疑问,那这整个密钥交换实际上是如何工作的呢?

img

当你的客户端计算机发送其打开新会话的请求时,服务器的 SSH 程序将发送一个随机数字,该随机数字已使用客户端的公共密钥进行了加密。如果客户端可以使用自己的私钥解密该号码,则服务器将允许你启动会话。

SSH Debugging Tool

如果你希望看到 SSH 过程的每个步骤,你可以继续的看下去。主要目的还是可以在出现问题时进行调试,请尝试在命令中添加详细的-v 命令。

img

上图只是一部分的详情,不是全部信息。第二行我们可以看到 SSH 如何读取系统范围的 ssh_config 文件以应用其配置,然后与远程主机建立连接。

img

接着,SSH 会在客户端的主目录中清点可用密钥对,并且由于没有其他指示,因此在本地和远程计算机上均启用 SSH 协议 2。然后,SSH 会接收服务器主机密钥,并对照与客户端的 known_hosts 文件中的主机 IP 地址相关的任何密钥检查它。

img

接下来,由于我们已经将客户的公共 RSA 密钥添加到主机中,因此我们被告知我们的 RSA 密钥已被接受并且会话已启动。最后,建立了会话环境设置,“欢迎我们参加新的会“。你也可以使用 Wireshark 协议分析器工具从网络上的任何位置查看相同的过程。在 Linux 上,你可以按名称从存储库中简单地提取 Wireshark,但是对于任何操作系统而言,它都是易于下载的。通常,由于大多数与 Internet 连接的计算机都会发送和接收大量网络流量,因此 Wireshark 显示的流量是一种非常有用的方法,可以帮助你了解所看到的内容。我们的专栏就不讲 wireshark 了。

基本调试

我们来探讨一些常见的 SSH 意外以及修复它们的方法。

  1. 首先,客户端和服务器上是否都正确安装了 SSH?

img

如果从客户端计算机运行 SSH 返回“拒绝连接”错误,则可能值得检查服务器上的 SSHD 状态。以我的经验,当你使用一种或多种虚拟机时,这是一个特别常见的问题。只需几个命令就可以立即配置和启动容器或群集节点,因此很容易因疏忽而错过了您需要的基本工具(例如 SSH 服务器)的安装。

  1. 出现“无主机路由”错误可能表明服务器本身甚至没有运行。

img

这通常是一个相对简单的问题。"没有主机路由”消息也可能表示你的网络连接有问题。所有明显的连接故障排除步骤都可以试一下,包括对远程服务器执行 ping 操作;如果失败,则对你知道的服务器进行 ping 操作,例如 8.8.8.8。这是 Google 的 DNS 服务器。当然你可以试着去 ping 百度的。你还应该检查自己的网络硬件,包括电缆连接,交换机和路由器,当然,也包括为远程服务器提供服务的硬件。如果所有检查都成功了,但仍然无法连接,请确保没有任何服务器或客户端防火墙规则阻止流量。记住默认的 SSH 端口是 22,请尝试对本地网络接口和远程主机地址之间的端口 22 流量运行 tcpdump。在这里,-n 告诉 tcpdump 以其原始格式显示 IP 地址,以便我们可以在输出中更轻松地识别它们,-i 指向我的本地网络接口。你可以在服务器上运行 netstat-rn,以确保 U 根和 G(使用网关)标志都已启动。如果有什么阻止你,则需要查看当前的防火墙设置。