【Linux】远程连接服务器(ssh)

远程连接服务器的介绍

1、什么是远程连接服务器
远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样。只在远程连接过程中进行加密,在操作过程中并不是加密传输

2、远程连接服务器的功能

 ①分享主机的运算能力

 ②服务器类型:有限度开放连接

 ③工作站类型:只对内网开放

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

 ①文字接口

 ②明文传输:Telnet、RSH等,目前非常少用

 ③加密传输:SSH为主,已经取代明文传输

 ④图形接口:XDMCP、VNC、XRDP等

4、文字接口连接服务器

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

5、连接加密技术简介

目前常见的网络数据包加密技术通常是通过“非对称**系统”来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程。

公钥(public key):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密。

私钥(private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有。

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

过程

说明

版本号协商阶段

SSH目前包括SSH1和SSH2两个版本,双方通过版本协商确定使用的版本

**和算法协商阶段

SSH支持多种加密算法,双方根据本端和对端支持的算法,协商出最终使用的算法

认证阶段

SSH客户端向服务器端发起认证请求,服务器端对客户端进行认证

会话请求阶段

认证通过后,客户端向服务器端发送会话请求

交互会话阶段

会话请求通过后,服务器端和客户端进行信息的交互

   一、版本协商阶段

     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提供两种认证方法:

1、基于口令的认证(password认证):

    ssh客户端向服务端发起password认证请求。客户端将用户名和密码加密发给服务端,服务端接收到进行解密,将受到的用户名和密码与本地设备上保存的用户名和密码进行对比,若存在并一致,则验证成功。

2、基于**的认证(publickey认证):

  ①ssh客户端生成秘钥对 提前将ssh公钥储存在远程ssh服务器上,然后ssh客户端携带公钥向远程ssh服务器(known_hosts)发起登录请求。

  ②远程ssh服务器收到该请求之后,先在该服务器上的authorized_keys寻找你上传授权过的公钥,然后把它和你发送过来的公钥进行比较。

  ③如果两个公钥一致(Key Exchange Success),远程ssh服务器会向用户发送一段使用公钥加密过的随机字符串进行身份质询(Challenge)。

  ④ssh客户端用自己的私钥解密后再发回给远程ssh服务器,远程ssh服务器对比回包中解密出来的随机字符串和自己之前生成的随机字符串是否一致。如果一致,则证明用户(公钥或身份)是可信的,直接允许登录shell,不再要求密码。

远程连接服务器实验

      实验要求:开启两台主机能够实现两台主机互相远程连接实现免密登陆(基于**验证) 

    1、 情况一:rhel7--服务端,rhel8--客户端

         ①服务端(rhel7)安装openssh-server包。

        ②客户端(rhel8)创建秘钥对,并查看是否成功创建。 

     ③将客户端(rhel8)产生的公钥传给要登录服务端(rhel7)的root用户家目录下.ssh/目录下,文件名为authorized.key。

    ④在服务端(rhel7)要被登录的root用户家目录下.ssh/目录下查看公钥文件是否成功。

    ⑤服务端(rhel7)关闭防火墙和selinux。

   ⑥在服务端(rhel7)重启sshd服务。

   ⑦客户端(rhel8)远程连接服务端(rhel7)

        登录成功!

 

    2、情况二:rhel8--服务端,rhel7客户端

       ①服务端(rhel8)安装openssh-server包。

     ②客户端创建秘钥对,并查看是否成功创建。

     ③客户端(rhel7)将自己产生的公钥文件传给服务端(rhel8)要登录的用户家目录下.ssh/下,文件名authorized.key。

    ④查看服务端(rhel8)即将被登陆的用户家目录下.ssh/查看是否传输成功。

    ⑤关闭服务端(rhel8)防火墙和selinux。

    ⑥重新启动sshd服务。

     ⑦客户端(rhel7)远程连接服务端(rhel8)。

        登录成功!