RHCE【远程连接服务器】

news/2024/10/20 11:21:24/

目录

一、远程连接服务器简介

二、加密技术简介

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 daemonLoaded: 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.ppmy.cn/news/1540504.html

相关文章

Spring Boot里的响应式和Vue里的响应式

Spring Boot 3中的响应式和Vue 3的响应式虽然都涉及到了“响应式”这一概念&#xff0c;但它们在实现和应用场景上存在显著的差异。 Spring Boot 3的响应式 定义与实现&#xff1a; 在Spring Boot 3中&#xff0c;响应式编程主要通过Spring WebFlux和Spring Data R2DBC等组件来…

NSSCTF-WEB-easy_eval

目录 前言 正文 思路 序列化构造 后渗透 思路点1:Redis 思路2:蚁剑插件绕过disable_functinons 结尾 作者的其他文章 前言 说是easy,实际很difficult 正文 思路 <?php class A{public $code "";function __call($method,$args){//最后执行命令eval($th…

系统托盘图标+快捷启动(Python)

QkStart 我把这个程序命名为QkStart 代码 # -*- coding: utf-8 -*- # Environment PyCharm # File_name QkStart |User Pfolg # 2024/10/19 22:06 import threading import time import pystray from PIL import Image from pystray import MenuItem, Menu import o…

fread和imread不同(imread读取的是图像的像素矩阵,fread会有别的信息)

clear;clc; fid fopen(草原HH极化图像.png,rb); B fread(fid,uint8); % % unit8是0——255&#xff0c;所以要保存图像&#xff0c;要先把矩阵归一化&#xff0c;然后再乘255 % height 1600; % width 2000; % img_matrix reshape(B(1:width*height), [height, width]); i…

C#中委托的应用与示例

委托 委托是指把事情托付给别人或别的机构办理。在C#语言中委托是一种特殊类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托是具有特定参数列表和返回类型的方法的引用的类型(不是引用对象,而是引用方法)。 可以委托将看作一个包含有序方法列表…

Redis 高可用:从主从到集群的全面解析

目录 一、主从复制 (基础)1. 同步复制a. 全量数据同步b. 增量数据同步c. 可能带来的数据不一致 2. 环形缓冲区a. 动态调整槽位 3. runid4. 主从复制解决单点故障a. 单点故障b. 可用性问题 5. 注意事项a. Replica 主动向 Master 建立连接b. Replica 主动向 Master 拉取数据 二、…

香港举办AIHCIR 2024国际学术会议,领先人工智能、人机交互和机器人技术

第三届人工智能、人机交互和机器人国际学术会议 &#xff08;AIHCIR 2024&#xff09;将于2024年11月在中国香港举行&#xff0c;聚焦AI、人机交互与机器人领域&#xff0c;邀请知名学者演讲&#xff0c;促进学术交流。论文经评审后提交EI检索&#xff0c;投稿需全英文&#xf…

wifi、热点密码破解 - python

乐子脚本&#xff0c;有点小慢&#xff0c;试过多线程&#xff0c;系统 wifi 连接太慢了&#xff0c;需要时间确认&#xff0c;多线程的话系统根本反应不过来。 也就可以试试破解别人的热点&#xff0c;一般都是 123456 这样的傻鸟口令 # coding:utf-8 import pywifi from pyw…