SSH 基础学习使用

news2024/12/26 21:33:15

什么是SSH

1.SSH

SSH(Secure Shell) 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
实际应用中,主要用于保证远程登录和远程通信的安全,任何网络服务都可以用这个协议来加密。

2.历史

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 有多种实现,既有免费的,也有收费的。

3.架构

SSH 的软件架构是服务器-客户端模式(Server - Client)。在这个架构中,SSH 软件分成两个部分:向服务器发出请求的部分,称为客户端(client),OpenSSH 的实现为 ssh;接收客户端发出的请求的部分,称为服务器(server),OpenSSH 的实现为 sshd。另外,OpenSSH 还提供一些辅助工具软件(比如 ssh-keygen 、ssh-agent)和专门的客户端工具(比如 scp 和 sftp)。

4.工作原理

在这里插入图片描述

  • 连接建立
    SSH依赖端口进行通信。在未建立SSH连接时,SSH服务器会在指定端口侦听连接请求,SSH客户端向SSH服务器该指定端口发起连接请求后,双方建立一个TCP连接,后续会通过该端口通信。
    默认情况下,SSH服务器使用端口号22。当SSH应用于NETCONF时,可以指定默认端口号是22或者830。SSH使用的端口号可以被更改为设备其他可用端口,更改后当前所有的连接都会断开,SSH服务器开始侦听新的端口。由于SSH默认端口号22为知名端口,在进行关键安全传输时,建议修改SSH端口号。

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

      1. SSH服务器通过建立好的连接向SSH客户端发送支持的SSH版本信息。
      1. SSH客户端收到版本信息后,根据自身支持的SSH版本决定使用的版本号,并将决定使用的版本号发送给SSH服务器。
      1. SSH服务器判断自己是否支持客户端决定使用的版本号,从而确定版本协商是否成功。
  • 算法协商
    SSH工作过程中需要使用多种类型的算法,包括用于产生会话密钥的密钥交换算法、用于数据信息加密的对称加密算法、用于进行数字签名和认证的公钥算法和用于数据完整性保护的HMAC算法。SSH服务器和客户端对每种类型中具体算法的支持情况不同,因此双方需要协商确定每种类型中最终使用的算法,过程如下:

      1. SSH服务器和客户端分别向对方发送自己支持的算法。
      1. SSH服务器和客户端依次协商每种类型中具体使用的算法。在每类算法的协商过程中,SSH服务器和客户端都会匹配出双方均支持的算法作为最终使用的算法。每类算法均匹配成功后,算法协商完成。如果某类算法全部匹配失败,则该类型的算法协商失败,这会导致SSH服务器和客户端之间算法协商失败并断开连接。
  • 密钥交换
    SSH服务器和客户端通过密钥交换算法,动态生成共享的会话密钥和会话ID,建立加密通道。会话密钥主要用于后续数据传输的加密,会话ID用于在认证过程中标识该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客户端生成的对称密钥相同。
    
  • 用户认证
    SSH客户端向SSH服务器发起认证请求,SSH服务器对SSH客户端进行认证。SSH支持以下几种认证方式:

    • 密码(password)认证:客户端通过用户名和密码的方式进行认证,将加密后的用户名和密码发送给服务器,服务器解密后与本地保存的用户名和密码进行对比,并向客户端返回认证成功或失败的消息。
    • 密钥(publickey)认证:客户端通过用户名,公钥以及公钥算法等信息来与服务器进行认证。
    • password-publickey认证:指用户需要同时满足密码认证和密钥认证才能登录。
    • all认证:只要满足密码认证和密钥认证其中一种即可。
      SSH用户认证最基本的两种方式是密码认证和密钥认证。密码认证方式比较简单,且每次登录都需要输入用户名和密码。而密钥认证可以实现安全性更高的免密登录,是一种广泛使用且推荐的登录方式。
  • 密码认证
    密码认证的基本原理是SSH客户端使用服务器公钥对密码进行加密,SSH服务器使用服务器私钥解密后验证密码的合法性,具体过程如下图所示。
    在这里插入图片描述
    SSH密码认证登录流程
    - 1. SSH客户端向SSH服务器发送登录请求。
    - 2. SSH服务器将服务器公钥发送给SSH客户端。
    - 3. SSH客户端输入密码,使用服务器公钥加密密码后发送给SSH服务器。
    - 4. SSH服务器收到密文,使用服务器私钥解密得到密码。验证密码是否正确,如果正确则认证通过。
    但是,这种认证方式存在中间人攻击的风险,如果有人截获了SSH客户端的登录请求后,冒充SSH服务器将伪造的公钥发送给SSH客户端,就可以获取到用户的登录密码。所以,在首次登录SSH服务器时,SSH客户端上会提示公钥指纹,并询问用户是否确认登录。用户确认后公钥将被保存并信任,下次访问时,SSH客户端将会核对SSH服务器发来的公钥和本地保存的是否相同。这种方式适用于公布了公钥指纹的SSH服务器以及已登录过正确SSH服务器的SSH客户端。

  • 密钥认证
    为避免中间人攻击,可以使用安全性更高的密钥认证。密钥认证的基本原理是SSH服务器使用客户端的公钥对随机内容加密,SSH客户端使用自己的私钥解密并发送给服务器以证实自己的身份,具体的过程如下图所示。
    在这里插入图片描述
    SSH密钥认证登录流程

      1. 在进行SSH连接之前,SSH客户端需要先生成自己的公钥私钥对,并将自己的公钥存放在SSH服务器上。
      1. SSH客户端向SSH服务器发送登录请求。
      1. SSH服务器根据请求中的用户名等信息在本地搜索客户端的公钥,并用这个公钥加密一个随机数发送给客户端。
      1. SSH客户端使用自己的私钥对返回信息进行解密,并发送给SSH服务器。
      1. SSH服务器验证SSH客户端解密的信息是否正确,如果正确则认证通过。
  • 会话请求
    认证通过后,SSH客户端向服务器发送会话请求,请求服务器提供某种类型的服务,即请求与服务器建立相应的会话。服务器根据客户端请求进行回应。

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

SSH 交互

1.服务器

首先安装SSH服务器:
在这里插入图片描述

这个时候还不能直接启动,直接启动会提示配置错误,因为公钥还没生成:
在这里插入图片描述

上面第一条 sshd 命令失败提示“sshd re-exec requires execution with an absolute path”,是为了防止有人出于各种目的,放置同名软件在$PATH变量指向的目录中,代替真正的 sshd,此时需要使用绝对路径来启动。也就是下一条的 /usr/sbin/sshd

此时启动仍然失败因为还没有公钥文件,执行命令:

ssh-keygen -A

然后对比ssh配置文件夹可以看到生成了密钥文件:
在这里插入图片描述

图上左侧执行命令的窗口,右侧是查看配置文件夹的窗口,右侧上是执行前的配置文件,下是执行后的配置文件,可以看到生成了 ssh_host_dsa_key 与 ssh_host_dsa_key.pub 这两个文件,其他的一些文件是:

  • /sshd_config:配置文件
  • /ssh_host_ecdsa_key:ECDSA 私钥。
  • /ssh_host_ecdsa_key.pub:ECDSA 公钥。
  • /ssh_host_key:用于 SSH 1 协议版本的 RSA 私钥。
  • /ssh_host_key.pub:用于 SSH 1 协议版本的 RSA 公钥。
  • /ssh_host_rsa_key:用于 SSH 2 协议版本的 RSA 私钥。
  • /ssh_host_rsa_key.pub:用于 SSH 2 协议版本的 RSA 公钥。
  • /etc/pam.d/sshd:PAM 配置文件。(在ssh文件夹的上一层)

sshd_config.d 是一个目录,用于存放 SSH 服务器(sshd)的配置文件。这些配置文件通常以 .conf 结尾,并使用不同的前缀命名,如 sshd_config、sshd_default_config 等。这些配置文件允许管理员对 SSH 服务器进行详细的设置,例如端口号、认证方式、日志记录等。

然后进入ssh_config 文件编辑参数,可以设置的参数如下:

参数默认值参数说明
Port22sshd服务默认的端口22,为了安全考虑建议修改成其它端口;配置文件可以使用多个Port命令,同时监听多个端口
AddressFamilyany设置协议簇,默认支持IPV4和IPV6
ListenAddress0.0.0.0默认监听网卡所有的IP地址
PermitRootLoginyes是否允许root登陆,默认是允许的,建议设置成no
StrictModesyes当使用者的host key改变之后,server就不接受其联机
MaxAuthTries6最多root尝试6次连接
MaxSessions10最大允许保持多少个未认证的连接。默认值是 10 到达限制后,将不再接受新连接,除非先前的连接认证成功或超出 LoginGraceTime 的限制。
PrintMotdyes登陆后是否显示一些默认信息
PrintLastLogyes显示上次登录的信息
TCPKeepAliveyesssh server会传keepalive信息给client以此确保两者的联机正常,任何一端死后,马上断开
PasswordAuthenticationyes是否允许使用基于密码的认证。默认为”yes”。
PermitEmptyPasswordsno是否允许密码为空的用户远程登录。默认为”no”。

还有很多参数就不全列出来了,有兴趣可以自己查询; https://man.openbsd.org/sshd_config

此时配置就完成了,再次使用 /usr/sbin/sshd 启动服务,然后查看一下服务是否存在:
在这里插入图片描述

2.客户端

我用的是win10系统,win10默认自带SSH客户端,因此不需要安装
在这里插入图片描述

打开shell,使用 ssh user@ip 连接:
在这里插入图片描述

看到图上我先是使用默认端口连接失败,然后指定端口在连接,会先问你是否确定XXX,输入yes就行,然后输入要登录的账号密码,就连接成功了;

3.VSCODE

实际开发一般都是办公提供一台windows机器,然后远程连到开发机器上编码,以VSCODE为例:
安装VSCODE ,然后安装 remote-SSH 插件;
在左下角选择“打开远程窗口”,然后新建ssh连接,然后输入刚刚的ssh指令,

在这里插入图片描述

在这里插入图片描述

然后后面还需要选连接机器平台(linux/windows/XXX)以及输入密码, 这些都输入后最后连接成功效果如:
在这里插入图片描述

左下角连接按钮显示了连接的IP, 打开终端后也是连接的机器了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字技术助力智慧公厕,让公厕变身为全新创新应用

在如今数字化的时代,数字技术的集成应用已经渗透到了生活的方方面面。其中一个令人瞩目的领域就是智慧公厕。以前只是简单的厕所,如今借助数字技术的力量,智慧公厕变得功能强大、智能高效。接下来,我们将以智慧公厕源头领航厂家广…

Retrieve Anything To Augment Large Language Models

简介 论文主要介绍了一套通过对比学习和蒸馏学习的方法,来增强学习了embedding向量,然后能够在知识增强,长上下文建模,ICL和工具学习等方面来增强大模型能力。

计算机网络第一章补充整理(计算机网络体系结构)

前言:以下整理内容,参考《计算机网络自顶向下》和哈工大的计网慕课 目录 计算机网络的体系结构的一些概念为什么采用分层结构?分层结构的优点分层结构的缺点 开放系统互连(OSI)参考模型物理层功能数据链路层功能网络层…

大数据flink篇之三-flink运行环境安装后续一yarn-session安装

前提: Hadoop 必須保证在 2.2 以上,且必須裝有 hdfs 服务。Hadoop安装后续会有相关说明。 具体的,在生产环境中,flink一般会交由yarn、k8s等资源管理平台来处理。本章主要讲解yarn模式下的session cluster模式。 flink Session-C…

FPC柔性电路板介绍及PCB设计经验规则总结

🏡《总目录》 目录 1,概述2,FPC的特点3,FPC设计十五条经验规则4,总结1,概述 FPC软板由于具有可弯曲折叠的特点,当前在消费电子,汽车电子和航空航天领域应用广泛。本文详细介绍FPC的特点并对FPC板设计中需要注意的经验原则进行总结。 2,FPC的特点 FPC的全称是Flexibl…

Python实现带图形界面的计算器

Python实现带图形界面的计算器 在本文中,我们将使用Python编写一个带有图形用户界面的计算器程序。这个程序将允许用户通过点击按钮或键盘输入数字和操作符,并在显示屏上显示计算结果。 开发环境准备 要运行这个计算器程序,您需要安装Pyth…

数据链路层—以太网协议

数据链路层—以太网协议 文章目录 数据链路层—以太网协议重新认识四层模型以太网局域网特点以太网帧格式碰撞领域和避免碰撞算法认识MAC地址令牌环网交换机认识MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网段传输的过程 重新认识四层模型 TCP/IP分层模型…

C# Convert和BitConverter类学习

前言: C# Convert是一个比较好用的强制转换,相比我们之前用的(int)或者是类型.Parse(),Convert给我们提供了很多的选项,特别是对于有字节要求的变量,Convert简直就是C#编程的福音,BitConvert对于byte数组转…

数据结构的奥秘:算法与实际应用的完美融合

文章目录 第一部分:数据结构的精髓1. 数组(Array)2. 链表(Linked List)3. 栈(Stack)和队列(Queue)4. 树(Tree)5. 图(Graph&#xff09…

fastjson 1.2.47 远程命令执行漏洞

fastjson 1.2.47 远程命令执行漏洞 文章目录 fastjson 1.2.47 远程命令执行漏洞1 在线漏洞解读:2 环境搭建3 影响版本:4 漏洞复现4.1 访问页面4.2 bp抓包,修改参数 5 使用插件检测漏洞【FastjsonScan】5.1使用説明5.2 使用方法5.2.1 右键菜单中&#xff…

车载电子电器架构 —— 国产基础软件生态简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

python二次开发CATIA:测量曲线长度

以下代码是使用Python语言通过win32com库来控制CATIA应用程序的一个示例。主要步骤包括创建一个新的Part文件,然后在其中创建一个新的几何图形集,并在这个集合中创建一个样条线。这个样条线是通过一组给定的坐标点来创建的,这些点被添加到集合…

利用深度学习进行组水平大脑解码

摘要 脑成像数据解码越来越受欢迎,可用于脑机接口和神经表征等方面的研究。解码通常是特定于个体的,由于不同被试之间的差异较大,因而不能很好地泛化。克服这一问题的技术不仅需要能够提供更丰富的神经科学见解,而且还能使组水平…

Docker Compose命令讲解+文件编写

docker compose的用处是对 Docker 容器集群的快速编排。(源码) 一个 Dockerfile 可以定义一个单独的应用容器。但我们经常碰到需要多个容器相互配合来完成某项任务的情况(如实现一个 Web 项目,需要服务器、数据库、redis等&#…

【Windows日志】记录系统事件的日志

文章目录 一、概要二、Windows日志介绍 2.1 应用程序日志2.2 系统日志2.3 安全日志 三、查看与分析日志四、常见事件ID 4.1 登录事件 4.1.1 4624登陆成功4.1.2 4625登陆失败 4.2 特权使用4.3 账户管理事件4.4 账户登录事件5.2 事件ID汇总 一、概要 Windows主要有以下三类日…

Nginx:反向代理(示意图+配置)

示意图: 反向代理 反向代理(Reverse Proxy)是代理服务器的一种,它代表服务器接收客户端的请求,并将这些请求转发到适当的服务器。当请求在后端服务器完成之后,反向代理搜集请求的响应并将其传输给客户端。…

NewStarCTF2023week2-游戏高手

js代码审计,定位到输出flag的地方 首先进行了一个条件判断,如果游戏分数大于100000,就会执行下面的代码块; 然后创建了一个 XMLHttpRequest 对象,用于向服务器下的/api.php发送 POST 请求; 后面代码用于处…

List 模拟实现

前言 本文将会向你介绍如何模拟实现list、iterator迭代器 模拟实现 引入 迭代器是一种用于访问容器中元素的对象,它封装了对容器中元素的访问方式。迭代器提供了一组操作接口,可以让我们通过迭代器对象来遍历容器中的元素。(iterator迭代器…

机器学习-无监督算法之降维

降维:将训练数据中的样本从高维空间转换到低维空间,降维是对原始数据线性变换实现的。为什么要降维?高维计算难,泛化能力差,防止维数灾难优点:减少冗余特征,方便数据可视化,减少内存…

《动手学深度学习 Pytorch版》 8.6 循环神经网络的简洁实现

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, vocab d2l.load_data_time_machine(batch_size, num_steps)8.6.1 定义模型 num_hiddens 256 rnn_layer nn.RNN(len(voca…