远程连接服务器简介
1、什么是远程连接服务器
远程连接服务器通过文字或图形接口方式来远程登录系统,让你在远程终端前登录linux主机以取得可操作主机接口(shell),而登录后的操作感觉就像是坐在系统前面一样。
2、远程连接服务器的功能
分享主机的运算能力
服务器类型:有限度开放连接
工作站类型:只对内网开放
3、远程连接服务器的类型(以登录的连接界面来分类)
文字接口
明文传输:Telnet、RSH等,目前非常少用
加密传输:SSH为主,已经取代明文传输
图形接口:XDMCP、VNC、XRDP等
4、文字接口连接服务器
SSH(Secure Shell Protocol,安全的壳程序协议)它可以通过数据包加密技术将等待传输的数据包加密后再传输到网络上。ssh协议本身提供两个服务器功能:一个是类似telnet的远程连接使用shell的服务器;另一个就是类似ftp服务的sftp-server,提供更安全的ftp服务。
连接加密技术简介
目前常见的网络数据包加密技术通常是通过“非对称密钥系统”来处理的。主要通过两把不一样的公钥与私钥来进行加密与解密的过程。
公钥(public key):提供给远程主机进行数据加密的行为,所有人都可获得你的公钥来将数据加密。
私钥(private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。私钥只有自己拥有。
由于在使用非对称密钥链接的特性,使用公钥加密的数据只能用私钥解密,私钥加密的数据只能公钥解密。在使用过程中会导致数据过多,使用麻烦,所以就有了“对称密钥”的出现。在使用对称密钥之前,交互双方中的一方先产生一堆公私钥方,随后将公钥发给另一方,而另一方会使用获得的公钥加密自己的对称密钥,随后原路返回,在收到公钥加密的信息后,会使用私钥解密,随后双方会使用公钥加密的对称密钥联系。生成公私钥的一方一般被成为服务器,接受公私钥的一端被称为客户端,客户端会记录服务器的公私钥。
查看SSH的密钥
[root@server ~]# cd /etc/ssh
[root@server ssh]# ll
total 600
-rw-r--r--. 1 root root 577388 Jul 12 2021 moduli
-rw-r--r--. 1 root root 1770 Jul 12 2021 ssh_config
drwxr-xr-x. 2 root root 28 Oct 16 12:45 ssh_config.d
-rw-------. 1 root root 4269 Jul 12 2021 sshd_config
-rw-r-----. 1 root ssh_keys 480 Oct 16 12:54 ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 Oct 16 12:54 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 387 Oct 16 12:54 ssh_host_ed25519_key
-rw-r--r--. 1 root root 82 Oct 16 12:54 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys 2578 Oct 16 12:54 ssh_host_rsa_key
-rw-r--r--. 1 root root 554 Oct 16 12:54 ssh_host_rsa_key.pub
[root@server ssh]#
.pub------公钥
如果没有公私钥的话SSH服务是无法进行远程链接到服务器的。
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。若是已经记录过该服务器的公钥数据,则客户端会去比对此次接收到的与之
前的记录是否有差异。客户端生成会话密钥,并用服务器的公钥加密后,发送给服务器。
在Windows客户端查看密钥。
以下数据为密钥
4. 服务器用自己的私钥将收到的数据解密,获得会话密钥。
5. 服务器和客户端都知道了会话密钥,以后的传输都将被会话密钥加密。
三、认证阶段
SSH提供两种认证方法:
基于口令的认证(password认证):客户端向服务器发出password认证请求,将用户名和密码加密后发送给服务器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败消息。
基于密钥的认证(publickey认证):客户端产生一对公共密钥,将公钥保存到将要登录的服务器上的那个账号的家目录的.ssh/authorized_keys文件中。认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized_keys中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。
注:服务器端对客户端进行认证,如果认证失败,则向客户端发送认证失败消息,其中包含可以再次认证的方法列表。客户端从认证方法列表中选取一种认证方法再次进行认证,该过程反复进行。直到认证成功或者认证次数达到上限,服务器关闭连接为止。
ssh远程连接服务简介
首先需要安装SSH服务的相关数据包
查看ssh配置文件,并确保SSHD服务处于开启状态
[root@server ssh]# ll /etc/ssh/sshd_config
-rw-------. 1 root root 4269 Jul 12 2021 /etc/ssh/sshd_config
[root@server ssh]# vim /etc/ssh/sshd_config
[root@server ssh]# systemctl status sshd
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2022-11-05 12:31:55 EDT; 13s ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 5950 (sshd)
Tasks: 1 (limit: 4652)
Memory: 1.6M
CGroup: /system.slice/sshd.service
└─5950 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.c>
Nov 05 12:31:54 server systemd[1]: Starting OpenSSH server daemon...
Nov 05 12:31:55 server sshd[5950]: Server listening on 0.0.0.0 port 22.
Nov 05 12:31:55 server sshd[5950]: Server listening on :: port 22.
Nov 05 12:31:55 server systemd[1]: Started OpenSSH server daemon.
lines 1-15/15 (END)
滤掉注释和非空字符来查看vim内的数据
[root@server ssh]# grep ^ [^#] /etc/ssh/sshd_config
#Port 22
#AddressFamily any
这是代表服务所使用的默认端口号,可以自己设置。
22 HostKey /etc/ssh/ssh_host_rsa_key
23 HostKey /etc/ssh/ssh_host_ecdsa_key
24 HostKey /etc/ssh/ssh_host_ed25519_key
代表已拥有的私钥文件
42 #LoginGraceTime 2m
登录的最大超时时间,默认是2分钟。
43 PermitRootLogin yes
允许root用户远程链接,改为no则是拒绝root用户远程链接,可自行设置允许和拒绝使用服务的对象。
48 #PubkeyAuthentication yes
默认允许公钥认证
50 # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
51 # but this is overridden so installations will only check .ssh/authorized_keys
52 AuthorizedKeysFile .ssh/authorized_keys
53
指定公钥的存放位置。
70 PasswordAuthentication yes
默认允许密码登录,可以自行修改,但不推荐
关闭SELinux
如果修改了端口号,我们需要修改EXLinux这个文件的配置
首先我们查看下exlinux的相关信息
[root@server ~]# getenforce
Enforcing
[root@server ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@server ~]#
注意这一行:SELINUX=enforcing
这一行表示当SELinux处于enforxing时,会默认阻止所有服务使用一些端口或文件,但系统默认的端口并不在它的阻止范围内。可以通过手动设置将它改为disabled和permissive两种模式,前者表示关闭SELinux,后者代表的是“只提醒但不阻止”。修改为disabled之后需要重启才能生效,而permissive只是临时生效,在重启之后需要重新配置。
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
[root@server ~]#
这代表者已经临时修改了SELinux的配置,但是sset配置文件内的内容依旧不变
[root@server ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@server ~]#
注意:更改端口号的同时需要关闭防火墙
同时SSH存在白名单,如果设置了白名单,那么只有在白名单内的用户可以使用ssh远程链接服务,其他用户都无法使用ssh服务。
[root@server ssh]# netstat -lntup | grep 22 -w
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 5950/sshd
tcp6 0 0 :::22 :::* LISTEN 5950/sshd
[root@server ssh]#
监听端口
拒绝root用户的远程登录
修改此处参数,随后保存退出
42 #LoginGraceTime 2m
43 PermitRootLogin yes
44 PermitRehlLogin no
重启服务进程
[root@server ~]# systemctl restart sshd
[root@server ~]#
此时将无法远程链接到root用户,但是已经链接的将不受影响
06/11/2022 10:50.50 /home/mobaxterm ssh root@192.168.240.128
root@192.168.240.128's password:
root@192.168.240.128's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
允许特定用户登录SSH服务
我们需要在最底部书写白名单,这里是指定的rehl这个账户
PermitTTY no
# ForceCommand cvs server
allowusers rehl
我们可以看见除了rehl之外的其他用户都无法远程登录
06/11/2022 10:54.21 /home/mobaxterm ssh rehl@192.168.240.129
/bin/bash
server
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: Sat Nov 5 22:50:36 2022 from 192.168.240.1
[rehl@server ~]$
06/11/2022 11:02.07 /home/mobaxterm ssh root@192.168.240.128
root@192.168.240.128's password:
root@192.168.240.128's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
✘
06/11/2022 11:02.23 /home/mobaxterm
06/11/2022 11:02.23 /home/mobaxterm ssh xiaolan@192.168.240.128
xiaolan@192.168.240.128's password:
xiaolan@192.168.240.128's password:
xiaolan@192.168.240.128's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
06/11/2022 11:04.23 /home/mobaxterm ssh usr@192.168.240.128
usr@192.168.240.128's password:
usr@192.168.240.128's password:
usr@192.168.240.128's password:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
使用mobaxterm来使用密钥进行远程链接
首先点击Tools,点击MobaKeyGen来进入创建密钥
进入这里来放置密钥
[root@server ~]# vim .ssh/authorized_keys
随后保存退出
[root@server ~]# cat /root/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsyFqoueGP7kUwllmSpQnfsp9XEbdGG052YoF7G3c3TkXYYd1wv3eONmgkiosj6Bnx/NlraxK+iblDBpRPj9bjOgTCHiLk4b7F1XYQEop/uzfkSROIxVWYyDvJimylyQEryaSXMF5SOzxSF1fZSwsJSUo+EcJFkAcQtu30V8KOgP3JGPYY40U/Fy+lxuL7MNUCRetDVQUAf7O6ZhbyroZMLm7cKxk8MrWWwjHb4VyIA4q2+wakNIN39VGmYllJvYjwUiXxVkg8KOd4J16DV8BgEa+x3BIT50PETplsOTWoVXHNnS4TLUOhRfZtk7vKQ41+qzzcGbx7CD0HAWEQuYB5 rsa-key-20221106
[root@server ~]#
接下来使用mobaxterm的图形界面区登录
直接登录,不需要密码。
补充知识:
跨虚拟机传输文件
scp+文件名+使用的用户和IP(例如:root@192.168.240.128)+目标路径
跨虚拟机传送密钥
ssh-copy-id root@192.168.240.128
试题:使用client的小明用户基于密钥认证方式使用ssh登录server端的小明用户和xiaohei用户
首先,创建密钥
由于直接生成的密钥文件默认仅所属者拥有权限,所以为了链接我们需要将文件的权限改为其他人可读的类型。
[root@server ~]# ll /root/.ssh/id_rsa
-rw-------. 1 root root 2602 Nov 9 02:05 /root/.ssh/id_rsa
[root@server ~]# chmod 604 /root/.ssh/id_rsa
[root@server ~]# ll /root/.ssh/id_rsa
-rw----r--. 1 root root 2602 Nov 9 02:05 /root/.ssh/id_rsa
传输密钥
[root@server ~]# ssh-copy-id -i /root/.ssh/id_rsa xiaoming@192.168.240.130
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.240.130 (192.168.240.130)' can't be established.
ECDSA key fingerprint is SHA256:etwMi4LPYFDEf4shAAuMxLTOvB5UgK6LXT6bVXw/0CI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
xiaoming@192.168.240.130's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'xiaoming@192.168.240.130'"
and check to make sure that only the key(s) you wanted were added.
[root@server ~]#
[root@server ~]# ssh-copy-id -i /root/.ssh/id_rsa xiaohei@192.168.240.130
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
xiaohei@192.168.240.130's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'xiaohei@192.168.240.130'"
and check to make sure that only the key(s) you wanted were added.
[root@server ~]#
在xiaoming和xiaohei处修改密钥文件的权限
[root@localhost ~]# chmod 604 /home/xiaohei/.ssh
[root@localhost ~]# ll /home/xiaohei/.ssh
total 4
-rw-------. 1 xiaohei xiaohei 565 Nov 6 09:14 authorized_keys
[root@localhost ~]# ll /home/xiaoming/.ssh
total 4
-rw-------. 1 xiaoming xiaoming 565 Nov 6 09:10 authorized_keys
[root@localhost ~]#
进行远程链接