RHCE8.0-ssh远程连接服务

远程连接服务器的介绍

什么是远程连接服务器

远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样。

远程连接服务器的功能

分享主机的运算能力
服务器类型:有限度开放连接
工作站类型:只对内网开放

远程连接服务器的类型(以登录的连接界面来分类)

文字接口
明文传输:Telnet、RSH等,目前非常少用
加密传输:SSH为主,已经取代明文传输
图形接口:XDMCP、VNC、XRDP等

文字接口连接服务器

SSH(Secure Shell Protocol,安全的壳程序协议),它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh协议本身提供两个服务器功能:一个是类似telnet的远程连接使用shell的服务器;另一个就是类似ftp服务的sftp-server,提供更安全的ftp服务。

连接加密技术简介

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

ssh两种验证级别

从客户端来看,SSH提供两种级别的安全验证。openssh openssl
第一种级别(基于口令的安全验证)

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。

第二种级别(基于密匙的安全验证)

需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

SSH工作过程

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

1.版本号协商阶段 		SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本
2.密钥和算法协商阶段 	SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法
3.认证阶段 			SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证
4.会话请求阶段 		认证通过后,客户端向服务器端发送会话请求
5.交互会话阶段 		会话请求通过后,服务器端和客户端进行信息的交互

一、版本协商阶段

1、服务器端打开端口22,等待客户端连接;

2、客户端向服务器端发起TCP初始连接请求,TCP连接建立后,服务器向客户端发送第一个报文,包括版本标志字符串,格式为“SSH-<主协议版本号>.<次协议版本号>.<软件版本号>”,协议版本号由主版本号和次版本号组成,软件版本号主要是为调试使用。

3、客户端收到报文后,解析该数据包,如果服务器的协议版本号比自己的低,且客户端能支持服务器端的低版本,就使用服务器端的低版本协议号,否则使用自己的协议版本号。

4、客户端回应服务器一个报文,包含了客户端决定使用的协议版本号。服务器比较客户端发来的版本号,决定是否能同客户端一起工作。如果协商成功,则进入密钥和算法协商阶段,否则服务器断开TCP连接。

说明:上述报文都是采用明文方式传输。

二、密钥和算法协商阶段

1、服务器端和客户端分别发送算法协商报文给对端,报文中包含自己支持的公钥算法列表、加密算法列表、MAC(Message Authentication Code,消息验证码)算法列表、压缩算法列表等等。

2、服务器端和客户端根据对端和本端支持的算法列表得出最终使用的算法。

3、服务器端和客户端利用DH交换(Diffie-Hellman Exchange)算法、主机密钥对等参数,生成会话密钥和会话ID
由此,服务器端和客户端就取得了相同的会话密钥和会话ID。对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全。在认证阶段,两端会使用会话用于认证过程。

会话密钥的生成:

1、客户端需要使用适当的客户端程序来请求连接服务器,服务器将服务器的公钥发送给客户端。(服务器的公钥产生过程:服务器每次启动sshd服务时,该服务会主动去找 /etc/ssh/ssh_host* 文件,若系统刚装完,由于没有这些公钥文件,因此sshd会主动去计算出这些需要的公钥文件,同时也会计算出服务器自己所需要的私钥文件。)

2、服务器生成会话ID,并将会话ID发给客户端。

3、若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记录是否有差异。客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。

4、服务器用自己的私钥将收到的数据解密,获得会话密钥。

5、服务器和客户端都知道了会话密钥,以后的传输都将被会话密钥加密。

三、认证阶段

SSH提供两种认证方法:

基于口令的认证(password认证):客户端向服务器发出password认证请求,将用户名和密码加密后发送给服务器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败消息。

基于密钥的认证(publickey认证):客户端产生一对公共密钥,将公钥保存到将要登录的服务器上的那个账号的家目录的 .ssh/authorized_keys 文件中。
认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized_keys中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。

注:服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。客户端从认证方法列表中选取一种认证方法再次进行认证,该过程反复进行。直到认证成功或者认证次数达到上限,服务器关闭连接为止。
RHCE8.0-ssh远程连接服务_第1张图片

配置文件

部分参数说明
环境:redhat8.1版本

#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_ecdsa_key        # ecdsa私钥认证
HostKey /etc/ssh/ssh_host_ed25519_key      #ed25519私钥认证

#ServerKeyBits 1024        
主机秘钥长度

# Logging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV             #当有人使用ssh登录系统的时候,SSH会记录信息,信息保存在/var/log/secure里面

#LogLevel INFO                                  
日志的等级

#Authentication:
#LoginGraceTime 2m                    登录的宽限时间,默认2分钟没有输入密码,则自动断开连接
PermitRootLogin yes                   是否允许管理员远程登录,'yes'表示允许
#StrictModes yes                      是否让sshd去检查用户主目录或相关文件的权限数据
#MaxAuthTries 6                       最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才能再次输入密码
#MaxSessions 10                       允许的最大会话数

#PubkeyAuthentication yes			  是否基于秘钥认证,默认允许

AuthorizedKeysFile .ssh/authorized_keys    #选择基于密钥验证时,客户端生成一对公私钥之后,会将公钥放到.ssh/authorizd_keys里面

#PermitEmptyPasswords no				    是否允许空密码登录
PasswordAuthentication yes                 #是否允许密码验证
ChallengeResponseAuthentication no         #是否允许使用键盘输入身份验证,也就是xshell的第三个登录方式

#UseDNS no                                 是否反解DNS,验证IP地址与DNS是否匹配,8版本默认关闭,7版本及之前默认开启

Subsystem sftp /usr/libexec/openssh/sftp-server  #支持SFTP ,如果注释掉,则不支持sftp连接
AllowUsers user1 user2               #登录白名单(默认没有这个配置,需要自己手动添加),允许远程登录的用户。如果名单中没有的用户,则提示拒绝登录

SFTP

SFTP (Secure File Transfer Protocol)的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。
SFTP与ftp 有着几乎一样的语法和功能。
SFTP为SSH的其中一部分,是一种传输档案至 Blogger伺服器的安全方式。
SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。
SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多。

windows中可以使用Core FTP,FileZilla, WinSCP,Xftp来连接SFTP进行上传,下载文件,建立,删除目录等操作。
sftp下可用的指令

ls、mkdir、rmdirpwd、chgrp、chown、chmod、ln、rmexit、bye、quit

对于客户端可用的指令

lcd(切换目录)、lls、lpwd

上传/下载文件的格式

将文件由本机上传到远程主机:put [本机文件] ,文件会存储到当前远程主机的目录下。
将文件由远程主机下载下来:get  [远程主机文件],文件会存储在当前本机所在的目录当中。

客户端scp跨机远程拷贝

scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。两台主机之间复制文件必需得同时有两台主机的复制执行帐号和操作权限。
scp一般用法

scp(secure copy)是一个基于SSH协议在网络之间进行安全传输的命令,其格式:
	scp [参数] 本地文件 远程帐户@远程IP地址:远程目录

scp命令中可用的参数及作用:
		-v: 显示详细的连接进度
		-P: 指定远程主机的sshd端口号
		-r: 用于传送文件夹

实验

实验一:修改ssh服务端口号

前提条件:
关闭防火墙与Selinux

临时关闭:
[root@redhat ~]# systemctl stop firewalld.service 
[root@redhat ~]# setenforce 0
1、修改配置文件
[root@redhat ~]# vim /etc/ssh/sshd_config 
Port 4444

2、重启服务
[root@redhat ~]# systemctl restart sshd

3、测试
[C:\~]$ ssh 192.168.16.100:4444


Connecting to 192.168.16.100:4444...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Activate the web console with: systemctl enable --now cockpit.socket

This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client --register

Last login: Sun Feb 14 21:03:35 2021 from 192.168.16.1
[root@redhat ~]# 

不关闭防火墙与Selinux

1、修改ssh服务的端口号
[root@redhat ~]#  vim /etc/ssh/sshd_config
Port 2222
 
2、保存退出后,添加防火墙允许策略
[root@redhat ~]# firewall-cmd --permanent --add-port=2222/tcp
success
[root@redhat ~]# firewall-cmd --reload
success

3、添加自定义端口到服务
[root@redhat ~]# semanage port -a -t ssh_port_t -p tcp 2222
[root@redhat ~]# systemctl restart sshd
注意:如果执行该命令时出现以下提示,请换个端口再试:
ValueError: Port tcp/4444 already defined

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

1、修改配置文件
[root@redhat ~]# vim /etc/ssh/sshd_config 
PermitRootLogin no

2、重启服务
[root@redhat ~]# systemctl restart sshd

3、测试root登录
[C:\~]$ ssh root@192.168.16.100:2222

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

1、编辑配置文件
[root@redhat ~]# vim /etc/ssh/sshd_config 
AllowUsers xx  #如果是多个用户,中间用空格隔开

2、重启ssh服务后生效
[root@redhat ~]# systemctl restart sshd

3、测试
[C:\~]$ ssh xx@192.168.16.100:2222


Connecting to 192.168.16.100:2222...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Activate the web console with: systemctl enable --now cockpit.socket

This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client --register

Last login: Sun Nov  1 12:11:55 2020
/usr/bin/xauth:  file /home/xx/.Xauthority does not exist

实验四:虚拟机和虚拟机之间使用密钥进行登录

[xx@redhat ~]$  ssh-keygen --help
 常用参数:
	 -b 	bits  密钥长度
	 -t 	dsa | ecdsa | ed25519 | rsa | rsa1 类型,不使用-t,默认是rsa
	 -f 	output_keyfile 密钥(私钥)文件,不指定默认存放在当前用户家目录下面的.ssh目录下
	 -q 	静默模式
	 -P 	old_passphrase 旧保护密码
	 -N 	new_passphrase 新保护密码
1、在客户端生成秘钥
[xx@redhat ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/xx/.ssh/id_rsa):    秘钥的存放目录
Created directory '/home/xx/.ssh'.
Enter passphrase (empty for no passphrase):           密码
Enter same passphrase again: 						  密码确认
Your identification has been saved in /home/xx/.ssh/id_rsa.
Your public key has been saved in /home/xx/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a56Et64pKamjTa8oTBITP8OFPjpa94KjovKOJiBvwjE xx@redhat
The key's randomart image is:
+---[RSA 3072]----+
|   .             |
|. . .            |
| = .             |
|o B              |
| + +    S        |
|*E. .  . .       |
|O+++ o. =        |
|OOB.+ .* o       |
|/O=+.ooo=        |
+----[SHA256]-----+

2、查看生成的秘钥文件
[xx@redhat ~]$ ll /home/xx/.ssh/
总用量 8
-rw-------. 1 xx xx 2590 2月  15 15:47 id_rsa      私钥文件
-rw-r--r--. 1 xx xx  563 2月  15 15:47 id_rsa.pub  公钥文件

3、复制该公钥文件到服务端的该目录下:
方法一:
[xx@redhat ~]# scp /home/xx/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
方法二:
[xx@redhat ~]$ ssh-copy-id -i .ssh/id_rsa.pub root@192.168.16.100 

4、登录服务端测试
[xx@redhat ~]$ ssh -i /home/xx/.ssh/id_rsa root@192.168.16.100
Activate the web console with: systemctl enable --now cockpit.socket

This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client --register

Last login: Mon Feb 15 15:51:15 2021 from 192.168.16.100
[root@redhat ~]# 

实验五:通过xshell使用密钥验证进行登陆

方法1:xshell生成一对密钥对,将公钥上传追加到服务器用户家目录下的.ssh/authorized_keys
【工具】-【新建用户密钥生成向导】	
[root@redhat ~]# cat id_rsa.pub >> /home/xx/.ssh/authorized_keys 
[root@redhat ~]# rm -f id_rsa.pub 	
测试登录

方法2:服务器私钥传给xshell,不推荐,不安全
服务器生成一对密钥对:
[root@redhat ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -q
服务的私钥传给xshell:
[root@redhat ~]# sz ~/.ssh/id_rsa
服务器公钥追加到~/.ssh/authorized_keys:
[root@redhat ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
测试登录

实验六:远程管理方式图形化

Linux:vnc

 服务器开启vnc:
 1、安装软件
[root@redhat ~]# yum install tigervnc-server -y
		
 2、为VNC设置密码
[root@redhat ~]#vncpasswd 
 密码长度大于等于6
		
 3、启动服务
[root@redhat ~]#vncserver :3
 查看端口:
[root@redhat ~]#netstat -lntpu | grep 59
 tcp        0      0 0.0.0.0:5903            0.0.0.0:*               LISTEN      17913/Xvnc 

 4、防火墙放行端口
[root@redhat ~]# firewall-cmd --permanent --add-port=5903/tcp
 success
[root@redhat ~]#firewall-cmd --reload 
 success
 
 5、vnc客户端连接测试

实验七:telnet明文传输

 1、telent服务器
 安装软件:[root@redhat ~]# yum install telnet-server.x86_64  -y
 启动服务:[root@redhat ~]# systemctl start telnet.socket 

 2、准备一个测试账户
[root@redhat ~]# useradd xuexi
[root@redhat ~]# echo "xuexi:123456" | chpasswd 
	
 3、防火墙配置
[root@redhat ~]# firewall-cmd --permanent --add-service=telnet 
success
[root@redhat ~]# firewall-cmd --reload 
success
		
 4、使用tcpdump抓包
[root@redhat ~]# yum install tcpdump.x86_64 -y
[root@redhat ~]# tcpdump -i ens160 -nnX port 23
		
 5、使用xshell telnet登录
[C:\~]$ telnet 192.168.16.100


Connecting to 192.168.16.100:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Kernel 4.18.0-147.el8.x86_64 on an x86_64
redhat login: xuexi
Password: 
[xuexi@redhat ~]$ 

你可能感兴趣的:(RHCE)