LV02-ubuntu-SSH的使用

本文主要是说明在ubuntu中安装使用SSH的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
PC端开发环境 Windows Windows11
Ubuntu Ubuntu20.04.6的64位版本(一开始使用的是16.04版本,后来进行了升级)
VMware® Workstation 17 Pro 17.0.0 build-20800274
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Win32DiskImager Win32DiskImager v1.0
Linux开发板环境 Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03)
linux内核 linux-4.15(NXP官方提供)
点击查看本文参考资料
参考资料 相关说明
------
点击查看相关文件下载
--- ---

一、SSH简介

1. 简介

SSH,全称为Secure Shell,是一种网络协议,用于在不安全的网络中进行安全的数据传输和远程控制。通过加密和认证机制实现安全的访问和文件传输等业务。

传统远程登录和文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多的安全隐患。随着人们对网络安全的重视,这些方式已经慢慢不被接受。SSH协议通过对网络数据进行加密和验证,在不安全的网络环境中提供了安全的网络服务。作为Telnet和其他不安全远程shell协议的安全替代方案,目前SSH协议已经被全世界广泛使用,大多数设备都支持SSH功能。默认情况下,SSH服务器使用端口号22。

2. 为什么需要SSH?

SSH代表什么?SSH 代表 Secure Shell,也称为 Secure Socket Shell。传统的互联网通信使用明文传输数据,内容一旦被截获就会完全暴露,存在很多安全隐患。SSH协议通过对网络数据进行加密和验证,建立SSH客户端和SSH服务器之间的安全隧道,在不安全的网络环境中为网络服务提供了安全的传输通道。

在SSH协议出现之前,Telnet广泛应用于远程登录场景,为远程管理网络设备提供了极大便利,而FTP作为常用的文件传输协议,兼具操作简单和传输效率高的优点,但它们都存在相同的问题,即明文传输数据带来的安全隐患。SSH采用加密传输数据、提升认证强度等手段,克服了Telnet和FTP应用中的安全性问题,实现了安全的远程登录和文件传输业务。

SSH常用场景

3. SSH是如何工作的?

SSH由服务器和客户端组成,为建立安全的SSH通道,双方需要先建立TCP连接,然后协商使用的版本号和各类算法,并生成相同的会话密钥用于后续的对称加密。在完成用户认证后,双方即可建立会话进行数据交互。SSH的工作流程包括如下几个阶段。

SSH工作流程

3.1 连接建立

SSH依赖端口进行通信。在未建立SSH连接时,SSH服务器会在指定端口侦听连接请求,SSH客户端向SSH服务器该指定端口发起连接请求后,双方建立一个TCP连接,后续会通过该端口通信。

3.2 版本协商

SSH协议目前存在SSH1.X(SSH2.0之前的版本)和SSH2.0版本。SSH2.0协议相比SSH1.X协议来说,在结构上做了扩展,可以支持更多的认证方法和密钥交换方法,同时提高了服务能力。SSH服务器和客户端通过协商确定最终使用的SSH版本号,过程如下:

(1)SSH服务器通过建立好的连接向SSH客户端发送支持的SSH版本信息。

(2)SSH客户端收到版本信息后,根据自身支持的SSH版本决定使用的版本号,并将决定使用的版本号发送给SSH服务器。

(3)SSH服务器判断自己是否支持客户端决定使用的版本号,从而确定版本协商是否成功。

3.3 算法协商

SSH工作过程中需要使用多种类型的算法,包括用于产生会话密钥的密钥交换算法、用于数据信息加密的对称加密算法、用于进行数字签名和认证的公钥算法和用于数据完整性保护的HMAC算法。SSH服务器和客户端对每种类型中具体算法的支持情况不同,因此双方需要协商确定每种类型中最终使用的算法,过程如下:

(1)SSH服务器和客户端分别向对方发送自己支持的算法。

(2)SSH服务器和客户端依次协商每种类型中具体使用的算法。在每类算法的协商过程中,SSH服务器和客户端都会匹配出双方均支持的算法作为最终使用的算法。每类算法均匹配成功后,算法协商完成。如果某类算法全部匹配失败,则该类型的算法协商失败,这会导致SSH服务器和客户端之间算法协商失败并断开连接。

3.4 密钥交换

SSH服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话ID用于在认证过程中标识该SSH连接。在该阶段也会完成客户端对服务器的身份认证,服务器先使用服务器私钥对消息进行签名,客户端再使用服务器公钥验证签名,从而完成客户端对服务器的身份认证。

由于SSH服务器和客户端需要持有相同的会话密钥用于后续的对称加密,为保证密钥交换的安全性,SSH使用一种安全的方式生成会话密钥,由SSH服务器和客户端共同生成会话密钥,利用数学理论巧妙地实现不直接传递密钥的密钥交换,无需通过不安全通道传送该密钥,具体过程如下图所示。

SSH密钥交换
  1. SSH服务器生成素数G、P、服务器私钥b,并计算得到服务器公钥$y=(G^b)%P$。
  2. SSH服务器将素数G、P、服务器公钥y发送给SSH客户端。
  3. SSH客户端生成客户端私钥a,计算得到客户端公钥$x=(G^a)%P$。
  4. SSH客户端将客户端公钥x发送给SSH服务器。
  5. SSH服务器计算得到对称密钥$K=(x^b) % P$,SSH客户端计算得到对称密钥$K=(y^a)%P$,数学定律可以保证SSH服务器和SSH客户端生成的对称密钥相同。

3.5 用户认证

SSH客户端向SSH服务器发起认证请求,SSH服务器对SSH客户端进行认证。SSH支持以下几种认证方式:

  • 密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
  • 密钥(publickey)认证:客户端通过用户名、公钥以及公钥算法等信息来与服务器进行认证。
  • password-publickey认证:指用户需要同时满足密码认证和密钥认证才能登录。
  • all认证:只要满足密码认证和密钥认证其中一种即可。

SSH用户认证最基本的两种方式是密码认证和密钥认证。密码认证的基本原理是SSH客户端使用对称密钥对密码进行加密,SSH服务器使用对称密钥解密后验证密码的合法性,这种认证方式比较简单,且每次登录都需要输入用户名和密码。而密钥认证可以实现安全性更高的免密登录,基本原理是SSH客户端使用客户端私钥对消息进行签名,服务器再使用客户端公钥验证签名,这是一种广泛使用且推荐的登录方式。

3.6 会话请求

认证通过后,SSH客户端向服务器发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。服务器根据客户端请求进行回应。

3.7 会话交互

会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互,双方发送的数据均使用会话密钥进行加解密。

4. SSH端口号是什么?

默认情况下,SSH服务器使用端口号22。当SSH应用于NETCONF时,可以指定默认端口号是22或者830。SSH使用的端口号可以被更改为设备其他可用端口,更改后当前所有的连接都会断开,SSH服务器开始侦听新的端口。由于SSH默认端口号22为知名端口,在进行关键安全传输时,建议修改SSH端口号。

5. ssh工具

由于SSH是一套协议标准,需要依赖基于SSH实现的工具完成SSH客户端和SSH服务器之间的连接,PuTTY和OpenSSH应运而生。

PuTTY是Windows上经典的免费SSH连接工具,通常用于使用SSH协议远程登录设备,最新版本可以在PuTTY官网下载。

OpenSSH是SSH协议的开源实现,支持在Unix操作系统上运行,最新版本可以在OpenSSH官网下载。目前Windows10已经包含OpenSSH客户端和服务器软件,可在“设置—应用—应用与功能—可选功能”中搜索安装。

我自己常用的就是MobaXterm、SecureCRT和VScode的ssh remote插件等。

6. SSH和SSL的区别

SSH和SSL都是网络安全协议,通过加密和认证提升两台设备间传输数据的安全性。但SSH和SSL的生效方式和服务目标存在差异。

SSH在两台设备间创建安全隧道,使这两台设备间可以安全地发送命令、传输数据等。例如,客户端通过SSH远程登录到一台服务器上,就可以安全地远程管理这台服务器,在服务器上执行想要的命令。

SSL则是使用SSL证书保证两台设备间安全地传输数据,而不是像SSH那样可以执行命令。例如,用户通过浏览器访问某安装了SSL证书且启用了HTTPS的服务器,浏览器和服务器之间可以安全地传输数据。

SSH就像一辆汽车,我们看不到这辆封闭的汽车里装载的是什么。而SSL就像一个封闭的集装箱,我们可以用不同的交通工具运输它,但看不到集装箱里装的是什么。

参考资料

什么是SSH?SSH是如何工作的? - 华为 (huawei.com)

二、ubuntu中ssh的安装

1. 检查ssh是否已经安装

查询是否安装,使用以下命令:

1
sudo ps -e |grep ssh

查询结果如下:

image-20240901072651457

端返回结果中没有 sshd,则说明系统还没有安装 ssh-server 服务,后续对ssh进行安装

2. 安装ssh服务

(1)安装命令

1
sudo apt-get install openssh-server

安装完毕如下图:

image-20240901072817928

(2)检查安装情况

1
sudo ps -e |grep ssh

安装完毕后如下图所示:

image-20240901072906728

出现了sshd,说明ssh服务已经正常启动了,若安装完毕后,还是没有sshd出现,那么就进行下一步,手动启动ssh服务。

(3)启动 ssh服务

1
sudo /etc/init.d/ssh start 
image-20240901073005177

运行完毕之后,重新查询ssh服务即可。

3. SSH相关命令

1
2
3
4
5

sudo /etc/init.d/ssh stop # //停止服务
sudo /etc/init.d/ssh start # //启动服务
sudo /etc/init.d/sshresart # //重启服务
exit # //断开连接

三、SSH服务的应用

1. VScode远程连接ubuntu服务器

这个可以查看《02开发工具/01VScode/LV02-03-连接远程服务器》

2. Windows登录ubuntu服务器

2.1 ubuntu配置

这里有两种模式,一种是桥接模式,一种是NAT模式。

2.1.1 NAT模式

ubuntu可以通过NAT模式借助主机上网,这就意味着我们不需要任何配置,虚拟网卡会自动为ubuntu分配IP地址:

image-20240901074519334

这个IP是可以联网的,可以和windows主机ping通:

image-20240901074537879

2.1.2 桥接模式

(1)VMware中虚拟网络编辑器设置如下

虚拟网络编辑器

(2)虚拟机的网络适配器也需改为桥接模式

image-20240901074701252

2.2 Windows配置

2.2.1 windows启动ssh服务

  • 【设置】→【应用】→【可选功能】
image-20240901073543765
  • 查看一下是否安装SSH相关服务,没有任何显示表示什么都没装,显示卸载表示已安装
image-20240901073706572

这里一般来说服务器和客户端都需要安装。

  • 【添加可选功能】→【搜索SSH服务器】→【勾选】→【下一步】→【安装】
image-20240901073934709

安装界面如下:

image-20240901074121752

等待安装完成即可。

image-20240901075230710

2.2.2  与ubuntu的ip互ping

要保证windows可以ping通ubuntu:

1
ping ip-address
image-20240901074537879

2.2.3 登录Ubuntu

  • (1)登录命令
1
ssh user-name@ip-address

如:

1
ssh sumu@192.168.19.137
  • (2)首次登录会出现如下提示,输入用户密码即可。
image-20240901075434084
  • (3)登录成功如下图
image-20240901075346249

2.3 MobaXterm登录ubuntu服务器

这里需要注意,运行MobaXterm的主机要可以和ubuntu服务器ping通。

2.3.1 查看ubuntu的IP

image-20240901074519334

2.3.2 连接ubuntu

  • 【Session】→【SSH】
image-20240901075812169
  • 输入主机IP即可,端口选择22,然后确认
image-20240901080006762
  • 点击完Accept,显示让输入用户名和密码,输入ubuntu的用户名和登录密码即可。
image-20240901080113043

输入完成后会提示是否需要保存密码,这个可以保存也可以不保存,保存的哈下次只需要敲回车,就会自动填充用户名和密码并登录。

  • 登录成功如下图
image-20240901080336783