RHCE【远程连接服务器】

news2024/10/19 21:53:42

目录

一、远程连接服务器简介

二、加密技术简介

SSH工作过程:

(1)版本协商阶段

(2)密钥和算法协商阶段

(3)认证阶段  

(4)会话请求阶段

(5)交互会话阶段

三、SSH服务配置

四、用户登录ssh服务器

实验1:修改ssh服务的端口号

实验2:拒绝root用户远程登陆

 实验3:允许特定用户ssh登陆,其他用户都无法登陆

 实验4:linux客户端通过秘钥登录linux服务端root用户


一、远程连接服务器简介

1 )远程连接服务器概念:
  远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录 linux 主机以取得可操
作主机接口( shell ),而登录后的操作感觉就像是坐在系统前面一样。
2 )远程连接服务器的功能:分享主机的运算能力
3 )远程连接服务器的类型(以登录的连接界面来分类)
           [1]文字接口:
                明文传输:Telnet、RSH等,目前非常少用
                加密传输:SSH为主,已经取代明文传输
           [2]图形接口:
                XDMCP、VNC、 XRDP
4 )文字接口连接服务器
  SSH Secure Shell Protocol ,安全的壳程序协议)它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh 协议本身提供两个服务器功能:一个是类似 telnet 的远程连接使用 shell 的服务器;另一个就是类似ftp 服务的 sftp-server ,提供更安全的 ftp 服务。

二、加密技术简介

目前常见的网络数据包加密技术通常是通过 非对称密钥系统 来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程 。
公钥( public key ):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密。
私钥( private key ):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有。

以下是对称密钥和非对称密钥的工作过程示例:

对称密钥加密:

  1. 发送方和接收方共享相同的密钥(K)。
  2. 发送方使用密钥 K 对消息 M 进行加密,得到密文 C。
  3. 发送方将密文 C 发送给接收方。
  4. 接收方使用相同的密钥 K 对密文 C 进行解密,得到原始消息 M。

非对称密钥加密:

  1. 发送方生成一对密钥:公钥 P 和私钥 S。
  2. 发送方将公钥 P 发送给接收方。
  3. 接收方使用公钥 P 对消息 M 进行加密,得到密文 C。
  4. 接收方将密文 C 发送给发送方。
  5. 发送方使用私钥 S 对密文 C 进行解密,得到原始消息 M。

SSH工作过程:

在整个通讯过程中,为实现SSH的安全连接,服务端与客户端要经历如下五个阶段: 

详细过程如下:

(1)版本协商阶段

[1] 服务器端打开端口22,等待客户端连接: 服务器端启动后,会打开TCP端口22(默认的SSH端口),并开始监听这个端口,等待来自客户端的连接请求。这是SSH服务的基础步骤,确保任何客户端都可以连接到服务器。

[2] 客户端向服务端发起TCP初始连接请求: 当客户端希望连接到服务器时,它会通过TCP协议向服务器的端口22发送一个初始连接请求。一旦TCP连接建立成功,服务器就会向客户端发送一个包含版本信息的报文。这个报文的格式为“SSH-<主协议版本号>.<次协议版本号>.<软件版本号>”,其中主协议版本号和次协议版本号共同组成协议版本号,而软件版本号主要用于调试目的。

[3] 客户端解析服务器的报文: 客户端接收到服务器发送的版本信息报文后,会解析该数据包。如果发现服务器的协议版本号低于自己的版本号,但客户端可以支持这种较低版本的协议,那么客户端将使用服务器端的低版本协议号。否则,客户端将使用自己的协议版本号。

[4] 客户端回应服务器: 在决定使用的协议版本号后,客户端会向服务器发送一个回应报文,包含其选择的协议版本号。服务器接收到这个报文后,会比较客户端发来的版本号,以确定是否可以与客户端一起工作。如果协议版本号协商成功,则双方进入密钥和算法协商阶段;否则,服务器将断开TCP连接。

需要注意的是,上述所有报文都是通过明文方式传输的,这意味着这些信息在网络中是未加密的,可能会受到中间人攻击等安全威胁。因此,在实际的SSH通信中,一旦协议版本号协商完成,后续的密钥和算法协商将会采用加密的方式进行,以确保通信的安全性。

(2)密钥和算法协商阶段

[1] 服务器端和客户端在建立连接时,会交换包含各自支持的算法列表的报文。这些算法列表包括公钥算法、加密算法、消息验证码(MAC)算法和压缩算法等。

[2] 服务器端和客户端根据对方和自己支持的算法列表,协商确定最终使用的算法。

[3] 通过Diffie-Hellman Exchange(DH交换)算法和主机密钥对等参数,服务器端和客户端生成相同的会话密钥和会话ID。

会话密钥的生成过程:

[1] 客户端请求连接:客户端使用适当的客户端程序请求连接服务器。

[2] 服务器发送密钥:服务器将服务器的公钥发送给客户端。

[3] 密钥生成过程:服务器每次启动sshd服务时,该服务会主动去/etc/ssh/ssh_host*文件找公钥文件。若系统刚装完,没有这些公钥文件,sshd会计算出所需的公钥文件和服务器的私钥文件。

[4] 服务器生成会话ID:服务器生成会话ID,并将其发送给客户端。

[5 客户端记录公钥数据 :若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的~/.ssh/known_hosts。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。

[6] 客户端生成会话密钥:客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。

[7]服务器解密获得会话密钥:服务器用自己的私钥将收到的数据解密,获得会话密钥。

[8] 加密传输开始:服务器和客户端都知道了会话密钥后,以后的传输都将被会话密钥加密。

由此,服务器端和客户端就取得了相同的会话密钥和会话 ID 。对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全。在认证阶段,两端会使用会话用于认证过程

3)认证阶段  

SSH提供两种认证方法:
[1] 基于口令的认证( password 认证):
  客户端向服务器发出 password 认证请求,将用户名和密码加密后发送给服务器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较, 并返回认证成功或失败消息。
[2] 基于密钥的认证( publickey 认证):
  客户端产生一对公共密钥,将公钥保存到将要登录的服务器上的那个账号的家目录的.ssh/authorized_keys 文件中。认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized_keys 中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。
注意:服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。客户端从认证方法列表中选取一种认证方法再次进行认证,该过程反复进行。直到认证成功或者认证次数达到上限,服务器关闭连接为止。

(4)会话请求阶段

认证通过后,SSH客户端向服务器端发送会话请求,请求服务器提供某种类型的服务(目前支持Stelnet、SFTP、SCP、NETCONF),即请求与服务器建立相应的会话

(5)交互会话阶段

会话建立后,SSH服务器端和客户端在该会话上进行数据信息的交互,该阶段,用户在客户端可以通过粘贴文本内容的方式执行命令,但文本会话不能超过2000字节,且粘贴的命令最好是同一视图下的命令,否则服务器可能无法正确执行该命令。如果粘贴的文本会话超过2000字节,可以采用将配置文件通过SFTP方式上传到服务器,利用新的配置文件重新启动的方式执行这些命令

三、SSH服务配置

#ssh服务安装包openssh-server

#编辑SSH服务器的配置信息
[root@server ~]# vim /etc/ssh/sshd_config

以下常用的一些配置信息:
#Port 22 #监听端口,默认监听22端口 【默认可修改】
#AddressFamily any #IPV4和IPV6协议家族用哪个,any表示二者均有
#ListenAddress 0.0.0.0 #指明监控的地址,0.0.0.0表示本机的所有地址 【默认可修改】
#ListenAddress :: #指明监听的IPV6的所有地址格式
#HostKey /etc/ssh/ssh_host_rsa_key # rsa私钥认证 【默认】
#HostKey /etc/ssh/ssh_host_dsa_key # dsa私钥认证
#HostKey /etc/ssh/ssh_host_ecdsa_key # ecdsa私钥认证
#HostKey /etc/ssh/ssh_host_ed25519_key # ed25519私钥认证
#SyslogFacility AUTHPRIV #当有人使用ssh登录系统的时候,SSH会记录信息,信息保存
在/var/log/secure里面
#LoginGraceTime 2m #登录的宽限时间,默认2分钟没有输入密码,则自动断开连接
#PermitRootLogin yes #是否允许管理员远程登录,'yes'表示允许
#MaxAuthTries 6 #最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才
能再次输入密码
#MaxSessions 10 #允许的最大会话数
#AuthorizedKeysFile .ssh/authorized_keys #选择基于密钥验证时,客户端生成一对公私
钥之后,会将公钥放到.ssh/authorizd_keys里面
#PasswordAuthentication yes #是否允许支持基于口令的认证
#ChallengeResponseAuthentication no #是否允许使用键盘输入身份验证,也就是xshell
的第三个登录方式
#UseDNS yes #是否反解DNS,如果想让客户端连接服务器端快一些,这个可以改为no
#Subsystem sftp /usr/libexec/openssh/sftp-server #支持 SFTP ,如果注释掉,则
不支持sftp连接
#AllowUsers user1 user2 #登录白名单(默认没有这个配置,需要自己手动添加),允许远程
登录的用户。如果名单中没有的用户,则提示拒绝登录

四、用户登录ssh服务器

【在实验之前我们可以拍摄一个快照,避免试验后有些配置文件没有修改过来】

实验1:修改ssh服务的端口号

#编辑SSH服务配置文件:
[root@server ~]# vim /etc/ssh/sshd_config

#查看我们修改的ssh服务的端口号:
[root@server ~]# grep port  /etc/ssh/sshd_config
port 666

#关闭防火墙并且立即生效:
[root@server ~]# systemctl disable --now firewalld

#检查firewalld的服务状态(可以看到已经是关闭状态)
[root@server ~]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enable>
     Active: inactive (dead)
       Docs: man:firewalld(1)

#将 SELinux(Security-Enhanced Linux)的运行模式设置为 Permissive:
[root@server ~]# setenforce 0

#查看当前 SELinux 的运行模式:
[root@server ~]# getenforce
Permissive

#重启ssh进程:
[root@server ~]# systemctl restart sshd

测试一下:

测试成功!!!

实验2:拒绝root用户远程登陆

#说明:注意rhel9中的/etc/ssh/sshd_config和/etc/ssh/sshd_config.d/*.conf中的
配置,因为我们安装rhel9时设置密码时默认是开启root远程登录的,即使SSH服务配置文件中是默认不允许root远程登录的,但是我们依旧可以远程登录。我们允许root远程登录的配置是在/etc/ssh/sshd_config或/etc/ssh/sshd_config.d/*.conf


[root@server ~]# ll /etc/ssh/sshd_config
-rw-------. 1 root root 3676 Oct 19 18:55 /etc/ssh/sshd_config
[root@server ~]# ll /etc/ssh/sshd_config.d
total 8
-rw-r--r--. 1 root root 141 Oct 15 23:34 01-permitrootlogin.conf
-rw-------. 1 root root 719 Jul 20  2023 50-redhat.conf

#我的关于root用户可以远程登录的配置文件在/etc/ssh/sshd_config.d/01-permitrootlogin.conf中,并修改其参数为no:
[root@server ~]# vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf
[root@server ~]# grep -i permitrootlogin /etc/ssh/sshd_config.d/01-permitrootlogin.conf
PermitRootLogin no

#重启ssh进程:
[root@server ~]# systemctl restart sshd

测试一下:

测试成功!!!

 实验3:允许特定用户ssh登陆,其他用户都无法登陆

#我的关于root用户可以远程登录的配置文件在/etc/ssh/sshd_config.d/01-permitrootlogin.conf中,并修改其参数恢复为为yes,不影响下面的实验操作:
[root@server ~]# vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf
[root@server ~]# grep -i permitrootlogin /etc/ssh/sshd_config.d/01-permitrootlogin.conf
PermitRootLogin yes

#添加一个用户并设置密码:
[root@server ~]# useradd gxc
[root@server ~]# passwd gxc

#编辑SSH服务配置文件,在文件的末尾添加允许特定用户ssh登录的特定命令:
[root@server ~]# vim /etc/ssh/sshd_config
[root@server ~]# grep -i allowusers /etc/ssh/sshd_config
AllowUsers gxc

#重启ssh进程:
[root@server ~]# systemctl restart sshd

测试一下:

测试成功!!! 

 实验4linux客户端通过秘钥登录linux服务端root用户

 

#在做此实验之前要将之前修改ssh服务的端口号、拒绝root用户远程登陆、允许特定用户ssh登陆,其他用户都无法登陆的配置都恢复如初,直接转到之前的快照或者自行修改

#创建密钥对:
[root@server ~]# ssh-keygen -t rsa
ssh-keygen 生成、管理和转换认证密钥 -t制定类型 RSA
/root/.ssh/id_rsa私钥文件
/root/.ssh/id_rsa.pub公钥文件

#复制该公钥文件到服务端的该目录下:
[root@server ~]# ssh-copy-id root@192.168.88.5

#在本地服务器上登陆对端服务器:
[root@server ~]# ssh root@192.168.8.5

测试一下:

测试成功!!! 

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

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

相关文章

KUKA外部自动配置(上)

通过外部PLC对机器人自动运行进程进行控制&#xff0c;其控制原理是&#xff1a;外部PLC通过外部自动运行接口向机器人控制系统发出机器人进程的相关信号&#xff08;如&#xff1a;运行许可、故障确认、程序启动等&#xff09;&#xff0c;机器人控制系统向外部PLC系统发送有关…

STM32 I2C通信协议详解

文章目录 STM32 I2C通信协议详解一、I2C协议概述二、物理层特性总线结构&#xff1a;引脚定义&#xff1a;电平特性&#xff1a;地址机制&#xff1a; 三、协议层机制起始信号&#xff1a;停止信号&#xff1a;数据有效性&#xff1a;应答信号&#xff08;ACK&#xff09;&…

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#x…

【Python】selenium遇到“InvalidArgumentException”的解决方法

在使用try……except 的时候捕获到这个错误&#xff1a; InvalidArgumentException: invalid argument (Session info: chrome112.0.5614.0) 这个错误代表的是&#xff0c;当传入的参数不符合期望时&#xff0c;就会抛出这个异常&#xff1a; InvalidArgumentException: invali…

常见TCP/IP协议基础——计算机网络

目录 前言常见协议基础常见协议-基于TCP的应用层协议常见协议-基于UDP的应用层协议常见协议-网络层协议习题自测1.邮件发送协议2.接收邮件协议端口3.建立连接4.层次对应关系5.FTP服务器端口 前言 本笔记为备考软件设计师时的重点知识点笔记&#xff0c;关于常见TCP/IP协议基础…

Java【多线程】wait和notify

目录 wait / notify 由于线程之间是抢占式执⾏的, 因此线程之间执⾏的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执⾏先后顺序. wait / notify 等待/通知 协调线程之间的执行逻辑的顺序的 可以让后执行的逻辑等待先执行的逻辑 虽然无法直接…

缓存框架JetCache源码解析-缓存定时刷新

作为一个缓存框架&#xff0c;JetCache支持多级缓存&#xff0c;也就是本地缓存和远程缓存&#xff0c;但是不管是使用着两者中的哪一个或者两者都进行使用&#xff0c;缓存的实时性一直都是我们需要考虑的问题&#xff0c;通常我们为了尽可能地保证缓存的实时性&#xff0c;都…

word取消自动单词首字母大写

情况说明&#xff1a;在word输入单词后首字母会自动变成大写 &#xff08;1&#xff09;点击菜单栏文件 &#xff08;2&#xff09;点击“更多”——>“选项” &#xff08;3&#xff09;点击“校对”——>“自动更正选项” &#xff08;4&#xff09;取消“句首字母大写…

WPF样式详解:行内样式、模板样式和页面样式的全方位分析

Windows Presentation Foundation (WPF) 是微软推出的一种用于构建桌面应用程序的UI框架。WPF 提供了强大的样式和模板机制&#xff0c;允许开发人员以声明的方式定义和复用UI元素的视觉外观。本文将深入探讨WPF的行内样式、模板样式和页面样式&#xff0c;帮助您在实际开发中更…

大数据linux操作系统

第一关&#xff1a;Linux的初体验 答案&#xff1a; cd / ls -a / &#xff08;里面有空格要注意&#xff09; 第二关&#xff1a;Linux的常用命令 答案&#xff1a; touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关&#xff1a;Linux查询命令帮助语句…

我在自动化测试方面犯过的3个大错误

每个人都会犯错误&#xff0c;但不管错误看起来有多糟糕&#xff0c;你都可以恢复过来&#xff0c;更重要的是&#xff0c;从错误中学习。 在软件开发过程的任何领域&#xff0c;从编码到测试&#xff0c;我们都会时不时地犯一些错误。通常&#xff0c;这些错误都很小&#xf…

Linux kernel 堆溢出利用方法

前言 本文还是用一道例题来讲解几种内核堆利用方法&#xff0c;内核堆利用手段比较多&#xff0c;可能会分三期左右写。进行内核堆利用前&#xff0c;可以先了解一下内核堆的基本概念&#xff0c;当然更好去找一些详细的内核堆的基础知识。 概述 Linux kernel 将内存分为 页…

Leetcode 字符串解码

该代码的算法思想可以分为以下几个步骤&#xff1a; 1. 使用栈来处理嵌套结构&#xff1a; 我们需要处理像 k[encoded_string] 这种格式&#xff0c;其中的 encoded_string 可能是嵌套的&#xff0c;即像 3[a2[c]] 这样的输入。因此&#xff0c;我们可以借助 栈&#xff08;S…

音视频基础知识分享

音视频基础知识分享 RKMedia的各个组件及其交互 首先上图&#xff1a; 考虑到公司业务主要是相机&#xff0c;所以&#xff0c;主要去关注图像数据流&#xff0c;对于音频数据流直接忽略。 图像数据流向&#xff1a; Camera Sensor将光信号转换成电信号&#xff08;Raw数据&…

【大模型】AI视频课程制作工具开发

1. 需求信息 1.1 需求背景 讲师们在制作视频的过程中&#xff0c;发现录制课程比较麻烦&#xff0c;要保证环境安静&#xff0c;保证录制过程不出错&#xff0c;很容易反复重复录制&#xff0c;为了解决重复录制的工作量&#xff0c;想通过 ai 课程制作工具&#xff0c;来解决…

Rust引用与C++取地址、引用的区别(C++引用、Rust解引用、C++指针)

文章目录 Rust引用与C取地址和引用的比较一、内存安全与管理Rust的内存安全机制C的内存管理 二、引用和取地址Rust的引用C的引用和取地址 三、代码示例比较修改数据的安全性Rust示例C示例 四、结论 Rust引用与C取地址和引用的比较 在程序设计语言的世界里&#xff0c;Rust和C都…

【C++】string类(接口使用详解 下)

我们接着【C】string类&#xff08;接口使用详解 上&#xff09;-CSDN博客 继续介绍string的使用。 1.string类对象的修改操作 我们就说一下用的比较多的接口。 1.1 operator 这个接口可以尾插一个字符&#xff0c;或者一个字符串&#xff0c;或者一个对象。 string s1(&qu…

Java—类和对象习题讲解

如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 目录 习题一&#xff1a; 习题二&#xff1a; 习题三&#xff1a;.import static 能够导入一些静态方法 习题四&#xff1a; 习题五&#xff1a; 习题六&#xff1…

[LeetCode] 415.字符串相加

给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a; 输入&#xff…

SHELL脚本之数组介绍

shell数组 一.数组介绍 一段连续的内存空间&#xff0c;根据需要可以存多个数据。 变量定义&#xff1a;从内存中申请一段空间&#xff0c;用来存储数据。 如果同一种类型的数据&#xff0c;每一个数据都定义一个变量&#xff0c;当机器对这些变量进行寻址的时候&#xff0…