目录
前言
什么是远程连接服务器? 远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux 主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样。
远程连接服务器的类型可分为文字接口(明文传输)、图形接口和加密传输。
明文传输:非加密,Telnet、RSH等,目前非常少用
图形接口:非加密,XDMCP、VNC、XRDP等
加密传输:SSH为主,已经取代明文传输
本文着重论述加密传输方式:SSH
理论
加密技术原理
加密技术可以分为三类,分别是单向加密算法、对称加密算法和非对称加密算法。目前常见的网络数据包加密技术通常是通过“非对称密钥系统”来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程 。
公钥(public key):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密。 私钥(private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有。
单向加密算法:也称为哈希算法,用于提取文件特征码防止文件被篡改。优点是保证数据的完整性,缺点是不可逆。
对称加密算法:加密和解密使用同一个密钥。优点是加密速度快,缺点是需要妥善保管密钥,安全性欠佳。DES(Data Encryption Standard)、3DES、AES(Advanced Encryption Standard)、Blowfish、 IDEA等。
非对称加密算法:公钥可以公开,私钥进行保密,无需安全通道传输密钥。缺点是速度慢。RSA、ECC(Elliptic Curve Cryptography)、Diffie-Hellman密钥交换、ElGamal等。
非对称加密算法图解:
客户端向服务端发起连接。先在客户端和服务端分别生成公私钥,公钥G1是公开的大家都可以知道,而私钥只有本端知道。服务端将自己的公钥提供给客户端,客户端将需要传输的数据用服务端的公钥进行加密传输给服务端,服务端接收到数据使用本端公钥对应的私钥进行解密从而拿到客户端传输的数据
总结
•单向加密算法适用于需要快速验证数据完整性的场景,如密码存储、文件完整性检直等。
•对称加密算法适用于加密大量数据,如文件加密、数据库加密等,但需要安全地管理密钥。
•非对称加密算法适用于密钥分发、数字签名等场景,但速度较慢,不适合大量数据的加密。
在实际应用中,通常会将这三种加密算法结合在一起使用(详看下文“密钥和算法协商阶段”图解),以发挥各自的优势并弥补不足。例如,使用非对称加密来安全地交换对称加密的密钥,然后使用对称加密来加密实际的数据传输。
连接远程服务器的过程
过程(5个阶段) | 说明 |
版本号协商阶段 | 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。对于后续传输的数据,两端都会使用会话密钥进行加密和 解密,保证了数据传送的安全。在认证阶段,两端会使用会话用于认证过程。
说明:会话密钥的生成:
① 客户端需要使用适当的客户端程序来请求连接服务器,服务器将服务器的公钥发送给客户端。(服务器的 公钥产生过程:服务器每次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*文件, 若系统刚装 完,由于没有这些公钥文件,因此sshd会主动去计算出这些需要的公钥文件,同时也会计算出服务器自己 所需要的私钥文件。)
② 服务器生成会话ID,并将会话ID发给客户端。
③ 若客户端第一次连接到此服务器,则会将服务器的公钥数据记录到客户端的用户主目录内的 ~/.ssh/known_hosts。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之前的记 录是否有差异。客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。
④ 服务器用自己的私钥将收到的数据解密,获得会话密钥。
⑤ 服务器和客户端都知道了会话密钥,以后的传输都将被会话密钥加密。
认证阶段
SSH提供两种认证方法:
1、基于口令的认证(password认证):客户端向服务器发出password认证请求,将用户名和密码加密后发送给服务 器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败 消息。
2、基于密钥的认证(publickey认证):的服务器上的那个客户端产生一对公共密钥,将公钥保存到将要登录账号的家目录的.ssh/authorized_keys文件中。认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地 该账号家目录下的authorized_keys中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符 串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给 服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。
注:服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。 客户端从认证方法列表中选取一种认证方法再次进行认证,该过程反复进行。直到认证成功或者认证次数达到上限,服务器关闭连接为止。
连接远程服务器图解过程如下图:
图1从里到外分别对应单向加密算法、对称加密和非对称加密。图2,图3分别是对非对称加密和对称加密进行解密的过程。最后使用md5算法压缩并提取特征码2,判断特征码2和特征码1是否相同,如若相同则表示数据未被篡改(防止黑客从中作祟),连接通过;如若不相同则拒绝建立连接。
实操
需要使用到的软件是Openssh。软件默认安装在系统内部可以直接使用
查找ssh服务配置文件
[root@server-side ~]# rpm -ql openssh
/etc/ssh
/etc/ssh/moduli
/usr/bin/ssh-keygen
/usr/lib/.build-id
/usr/lib/.build-id/4b
/usr/lib/.build-id/4b/cafc4bf1b910ff2542f8d5cb611fde7851ca08
/usr/lib/.build-id/64
...................[root@server-side ~]# tree /etc/ssh
/etc/ssh
├── moduli
├── ssh_config
├── ssh_config.d
│ └── 50-redhat.conf
├── sshd_config #主配置文件
├── sshd_config.d #辅助配置文件目录
│ ├── 01-permitrootlogin.conf
│ └── 50-redhat.conf
├── ssh_host_ecdsa_key
├── ssh_host_ecdsa_key.pub
实验一 修改ssh服务端口号
打开配置文件,添加或修改其中的端口行,添加后输入`wq`保存退出,关闭防火墙重启服务
vim /etc/ssh/sshd_config
systemctl --now disable firewalld
systemctl restart sshd
实验二 拒绝root用户登录
将配置文件中PermitRootLogin yes更改为`no`
vim /etc/ssh/sshd_config.d/01-permitrootlogin.conf
实验三 允许指定用户登录
以本人虚拟机中已有的三个普通用户test1、test2、test3为例
[root@server-side ~]# tail -n 3 /etc/passwd
test1:x:1001:1001::/home/test1:/bin/bash
test2:x:1002:1002::/home/test2:/bin/bash
test3:x:1003:1003::/home/test3:/bin/bash
需要将允许登录的用户加入主配置文件的白名单中,保存退出后重启服务生效。
vim /etc/ssh/sshd_config
进入配置文件在最后添加如下内容:
AllowUsers test1 test2 test3 #不同用户名用空格间隔
注意!在主配置文件中创建白名单后只能允许白名单中的用户进行远程登录,其他所有用户(包括root用户)登录都会被拒绝
实验四 windows通过密钥远程连接Linux
使用cmd在windows上生成公私钥,打开cmd,在命令行输入以下指令:
ssh-keygen -t rsa
显示:
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa): #密钥的存储路径Enter passphrase (empty for no passphrase): #免密登录不输密码直接回车
Enter same passphrase again:
Your identification has been saved in C:\Users\Administrator/.ssh/id_rsa. #私钥路径
Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub. #公钥路径
The key fingerprint is:
SHA256:xA3t9cv4WjIuL5kjurQZUGNLKvlrE5sYSmWhSg4qL44 administrator@DESKTOP-4KRF42B
The key's randomart image is:
+---[RSA 3072]----+
| .. |
| . . o. . |
| . . = o... . |
|.o + = + . . |
|* = o . S o . |
|+o.o.. . o |
|oo o.+o oo.. |
|+ o =o +. *. +. |
|Eo ...=o . =+. |
+----[SHA256]-----+
生成如下两个文件
将windows生成的公钥保存到linux的 /root/.ssh/authorized_keys 文件中(要登陆哪个用户就保存到那个用户的路径下),注意文件名要与主配置文件中的文件名保持一致
在linux中找到这个文件,并将windows系统生成的公钥拷贝到这个文件中,保存退出。就可以使用cmd命令行免密登录linux
vim /root/.ssh/authorized_keys
实验五 Linux客户端通过秘钥免密登录Linux服务端
这个实验需要准备两台linux系统一台作为客户端,一台作为服务端。首先将上一个实验中拷贝的公钥删除,然后使用客户端生成公私钥文件,并查看路径。
ssh-keygen -t rsa -f /root/.ssh/rsa_key -P '' -q
ll /root/.ssh/
显示如下:
[root@redhat-9 ~]# ll /root/.ssh/
total 16
-rw-------. 1 root root 840 Jan 16 20:34 known_hosts
-rw-r--r--. 1 root root 96 Jan 16 20:13 known_hosts.old
-rw-------. 1 root root 2602 Jan 16 20:10 rsa_key
-rw-r--r--. 1 root root 567 Jan 16 20:10 rsa_key.pub
将客户端的公钥拷贝给服务端,输入服务端连接密码。
ssh-copy-id -i /root/.ssh/rsa_key.pub root@192.168.128.90
完成传送后使用客户端的私钥去进行服务端免密连接
ssh -i /root/.ssh/rsa_key root@192.168.128.90
接下来不需要输入密码,将自动转换到服务端的界面。显示如下: