learn-tech/专栏/全解网络协议/26黑客的好帮手-SSH.md
2024-10-16 06:37:41 +08:00

9.8 KiB
Raw Blame History

                        因收到Google相关通知网站将会择期关闭。相关通知内容
                        
                        
                        26 黑客的好帮手 - SSH
                        通信协议

我们今天来谈论一下SSHSecure 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应用程序。

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

RSA rhost authentication。如果远程主机包含名为任一主机的文件则RSA rhost身份验证起作用。如果这些文件中的任何一个包含标识客户端计算机及其当前用户的条目并且主机服务器已经具有客户端主机密钥的兼容条目则将允许登录。如果这些文件都不存在并且很大程度上是由于Rhost系统本身内部的结构缺陷那么默认情况下通常会出现这种情况则客户端上运行的SSH程序将向服务器标识其想要的本地加密密钥对利用也就是第二种方式。

/etc/hosts.equiv /etc/ssh/shosts.equiv /home/username/.rhosts /home/username/.shosts

Private/pubic keypair authentication - 你首先需要一对密钥。如果还没有则可以生成一个密钥对。使用ssh-keygen程序在Linux客户端上用户主目录中的ssh目录.ssh- 目录名称前面的点告诉Linux这是一个隐藏文件只能使用带-a标志的ls才能看到。ssh目录可以存在于任何单独的用户目录层次结构中系统的etc目录下还有一个SSH目录其中包含密钥对和两个配置文件。sshconfig文件确定该计算机在默认情况下将如何充当其他远程计算机上的客户端而sshdconfig文件将其行为作为远程客户端访问的主机的主机进行控制。

SSH user keys location - /home/username/.ssh SSH system keys location - /etc/ssh SSH configuration files /etc/ssh/sshconfig 和 /etc/ssh/sshdconfig

Password authentication。如果前两个身份验证选项都不起作用则服务器将提示客户端输入密码。出于安全原因最好避免依赖密码。这对于SSH协议版本1和更现代的SSH协议版本2都是很常见的。此外版本2还支持RSADSA和OpenPGP公钥算法

Private/Publlic Key 详解

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

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

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

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

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

SSH Debugging Tool

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

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

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

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

基本调试

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

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

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

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

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