通过前面十余篇文章的介绍,相信已经初步入门Linux本地管理的基本方法了,后续的文章将介绍Linux中常用的服务部署以及如何为外部提供相应的服务。
系列文章第三篇“linux入门系列3--linux远程登陆工具”初步介绍了几款用于Linux远程登录管理的工具,本文再来详细讲解下SSH协议以及对应的服务配置,从而更好的远程管理服务器。
提示:在进行操作之前请按前边系列文章的方法,新装或克隆准备2台Linux虚拟机,假设ip地址分别为192.168.78.100和192.168.78.104(需要根据自身实际情况来配置),用于演示linux系统之间的ssh登录。如果忘记如何准备2台虚拟机的,请参考前面文章“linux入门系列1--环境准备及linux安装”的第三节或“linux入门系列13--磁盘管理之RAID、LVM技术”中的1.3.1小节。
一、sshd远程控制服务
1.1 ssh概述
SSH全称为Secure Shell,是一种能够以安全的方式提供远程登录的协议,是目前远程管理 Linux 系统的首选方式。在SSH出现之前一般使用FTP以及Telnet来进行远程登录,但是他们都是以明文的形式在网络中传输账户密码和数据信息,因此非常不安全,这种方式很容易受到黑客发起的中间人攻击,从而篡改数据或截取服务器账号密码。
Linux中的sshd服务是基于SSH协议开发的一款远程管理服务程序,可以通过配置sshd服务来远程管理Linux系统。
sshd提供两种安全验证方法:基于口令的认证和基于密钥的认证。
基于口令的验证,是用账号密码来登录系统,正如我们前面“linux入门系列1--环境准备及linux安装”讲到,在安装系统时会默认创建root用户以及手动指定的test用户,用这些用户账号密码就可以登录使用系统。
基于密钥的认证,到目前的文章为止我们还没有介绍过,它需要在本地生产密钥对,然后把密钥对中的公钥上传到服务器,该方式相对口令认证来说更安全。
下文我们主要演示基于证书登录的方式,在演示之前,我们先配置sshd服务,在RHEL7中,已经默认安装并启用了sshd服务程序。
1.2 ssh服务配置
sshd服务的配置信息保存在/etc/ssh/sshd_config文件中,查看文件内容可以看到里边有很多内容,但是大部分都是注释起来的,我们可以根据需要灵活进行配置。
常用配置参数及作用说明如下:
参数 | 说明 |
---|---|
Port | sshd 服务端口,默认为22 |
ListenAddress | 设定 sshd 服务器监听的 IP 地址,默认为0.0.0.0 |
Protocol | SSH 协议的版本号 |
HostKey | 值为/etc/ssh/ssh_host_key,表示SSH 协议版本为1时,DES 私钥存放的位置;值为/etc/ssh/ssh_host_rsa_key,表示SSH 协议版本为2时,RSA私钥存放的位置;值为/etc/ssh/ssh_host_dsa_key,表示SSH 协议版本为2时,DSA私钥存放的位置 |
PermitRootLogin | 设定是否允许 root 管理员直接登录,默认为yes |
StrictModes | 当远程用户的私钥改变时直接拒绝连接,默认为yes |
MaxAuthTries | 最大密码尝试次数,默认为6 |
MaxSessions 10 | 最大终端数,默认为10 |
PasswordAuthentication | 是否允许密码验证,默认为yes |
PermitEmptyPasswords | 是否允许空密码登录,默认为no |
1.2.1 保存默认配置登录
由于RHEL7中已经默认安装并启用了sshd服务,并且参数都有默认值,因此我们不做任何配置就可以直接使用ssh登录到其他机器。
按开篇讲解的方法开启准备好的2台linux主机,然后进行如下操作:
[root@origin ~]# hostname
origin
[root@origin ~]# ssh 192.168.78.100
The authenticity of host '192.168.78.100 (192.168.78.100)' can't be established.
ECDSA key fingerprint is c1:b8:67:1f:1d:c0:cd:6b:37:90:42:b1:c6:5a:e8:cf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.78.100' (ECDSA) to the list of known hosts.
root@192.168.78.100's password:
Last login: Sun Jan 5 11:19:40 2020 from 192.168.78.1
[root@heimatengyun ~]# hostname
heimatengyun
[root@heimatengyun ~]#
由此可以见,未经过任何配置,直接通过ssh命令就可以从origin的主机远程登录到到了heimatengyun这台主机。
1.2.2 禁止root远程登录
我们把上边heimatengyun这台主机通过修改配置参数,禁止root管理员远程登录,再来观察远程登录的效果。
- 首先:配置sshd服务,修改sshd服务的主配置文件/etc/ssh/sshd_config,找到#PermitRootLogin yes 取消注释并改为no。
[root@heimatengyun ~]# vim /etc/ssh/sshd_config
...省略部分内容
PermitRootLogin no
....省略部分内容
保存并退出。重启sshd服务查看结果:
[root@heimatengyun ~]# systemctl restart sshd
[root@heimatengyun ~]# systemctl enable sshd
[root@heimatengyun ~]#
注意,修改sshd配置后,一定要重启sshd服务才会使配置生效。
- 其次:我们再次从origin这台主机ssh到heimatengyun这台主机,看能否登陆
[root@origin ~]# ssh 192.168.78.100
root@192.168.78.100's password:
Permission denied, please try again.
root@192.168.78.100's password:
可以看到,root已经无法远程登录进入系统了,包括外部的一切ssh工具都无法在登录系统,这样就大大降低被黑客暴力破解密码的几率。
如果想登录这台主机,由于我们目前是在虚拟机演示,因此唯一的方式就是进入虚拟机进行登录,而生产环境中服务器一般是放在机房的,因此也就只有去机房接上显示器,然后进行登录。
演示完成后,我们未来后续的演示,先通过虚拟机登录到系统,将配置修改回来,允许root远程登录。
注意:以上演示的是两台linux主机之间的ssh登录,直接使用的是系统自带的ssh命令即可。而如果是windows与linux之间的ssh登录则是借助各种ssh工具,如果主机禁止了root登录,任何远程ssh工具都无法登录。常见的ssh登录工具见前面系列文章第三篇“linux入门系列3--linux远程登陆工具”。
1.3 使用ssh证书登录
此前的登录都是通过账号密码的形式登录,本节演示通过ssh证书进行登录。
1.3.1 Linux主机之间免密登录
前边的演示中2台机器之间要ssh远程登录,需要先输入密码。但有时候需要linux主机能ssh免密登录,而无需输入账户的密码,比如一台机器上ssh到另外一台机器执行某些脚本,这个过程往往是通过shell脚本进行,而无需人工干预。因此在这种情况下,就需要设置机器之间的互信,而免密登录本质就是证书登录。
还是以前面的2台机器为例,假设需要从192.168.78.104(origin)免密登录到192.168.78.100(heimatengyun),那么origin就是客户端主机,而heimatengyun则是服务器远程主机。
(1)在客户端主机生成密钥对
通过系统自带的ssh-keygen命令生成
[root@origin ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 按回车或设置密钥存储路径
Enter passphrase (empty for no passphrase): 按回车或设置密钥的密码
Enter same passphrase again: 按回车或设置密钥的密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
bc:94:4e:e1:82:7c:4a:96:ad:a3:38:c5:d6:47:ac:94 root@origin
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| o . |
| .E+oo o |
| . o*o+ S |
| +oo+.= . |
| o +. o |
|.. . . |
|... |
+-----------------+
[root@origin ~]#
[root@origin ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
注意,此过程需要按3次回车,不输入信息直接按回车则采用默认值。可以看到在当前用户根目录下的.ssh文件夹中生成了公钥(id_rsa.pub)和私钥文件(id_rsa)。
这样就生成了密钥对。
(2)公钥文件发送至远程主机
通过ssh-copy-id命令把客户端刚生成的公钥文件发送至远程主机
[root@origin ~]# ssh-copy-id 192.168.78.100
/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
root@192.168.78.100's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.78.100'"
and check to make sure that only the key(s) you wanted were added.
[root@origin ~]#
输入远程主机的密码后,就成功把公钥文件发送至远程主机。实际上就是将第一步中生产的id_rsa.pub公钥文件的内容写入到远程主机的.ssh/authorized_keys文件中,同时在自己的.ssh目录下生成known_hosts文件,里边记录的是远程主机的信息。可以自行查看2台主机的这2个文件对比一下就知道了。另外由于授权操作本质就是文件的操作,因此当不需要ssh无密登录时只需要删除.ssh目录下的文件即可。
经过上边操作后,此时就可以直接远程登录到主机了。
[root@origin ~]# ssh 192.168.78.100
Last login: Sun Jan 5 11:36:52 2020 from 192.168.78.1
[root@heimatengyun ~]#
可以看到没有输入root的密码,直接就登录远程服务主机了。但此时远程主机heimatengyun依然可以远程通过账号密码登录。
如果在第一步中指定了证书的密钥,则在登录时需要输入证书的密码才能登录。注意是证书密码而不是用户的密码。
(3)设置远程主机,使其只允许密钥证书登录,拒绝口令登录方式
进入heimatengyun主机,禁止口令登录
[root@heimatengyun ~]# vi /etc/ssh/sshd_config
...省略部分内容
PasswordAuthentication no
...省略部分内容
[root@heimatengyun ~]# systemctl restart sshd.service
[root@heimatengyun ~]#
保存退出并重启sshd服务。
(4)验证远程登录
从origin远程登录到服务器主机
[root@origin ~]# ssh 192.168.78.100
Last login: Sun Jan 5 12:36:48 2020 from 192.168.78.104
[root@heimatengyun ~]#
可以看到通过ssh证书的方式依然可以成功正常登录。
但是此时,通过远程工具从window中通过远程工具如xshell、securecrt通过账号密码进行登录,则无法登录。由此可见即使设置允许root登录,但是不允许通过账号登录,root依然无法远程登录。root要想登录也就只有去虚拟机登录,正式环境也就只有去机房才能登录。
说明:ssh免密登录时单向的,通过上边的设置可以从origin免密登录到heimatengyun,但是反之则不行,如果想让其反之也可以的话需要用同样的方法,在heimatengyun主机上生产密钥对,然后将其公钥传输到origin主机。这样就实现了主机之间的相互ssh免密登录。
1.3.2 window主机到linux主机之间证书登录
我们也可以在windows下生成密钥对,从而在windows下通过证书登录到linxu服务器。但在windows下是不能执行ssh-keygen生成密钥对的。需要安装相应的密钥生成工具才能生成,这类工具很多,其中之前文章中讲解的SecureCRT、xshell、putty等都可以生成。
每种工具的生成方法略有区别,但是由于篇幅所限,此处仅以SecureCRT为例进行演示
(1)windows上用securecrt生成密钥对
工具-生成公钥
在弹出的向导中点击“下一步”
保持默认选择RSA算法,并点击“下一步”
输入证书密码,也可以不输入,如果输入了,则在登录时需要指定证书同时输入密码,注意此处的密码不是用户密码,而是证书密码。
保持默认长度,点击“下一步”
点击“下一步”
选择密钥类型和目录,点击“完成”
这样就在指定的目录生成了密钥文件。
其中Identity为私钥文件,Identity.pub为公钥文件。
(2)将公钥文件上传到服务器
可以通过之前讲解的SecureFx或xftp上传到服务器root目录(如果不知道如何操作或忘记了请参看本系列教程第三篇)。
将上传到root目录的Identity.pub公钥文件,拷贝到.ssh目录下,并命名为authorized_keys
[root@origin .ssh]# ls
Identity.pub
[root@origin .ssh]# cat Identity.pub >>authorized_keys
[root@origin .ssh]# ls
authorized_keys Identity.pub
之所以要该文件名为authorized_keys是因为openssh不支持SecureCRT生成的密钥格式,需要进行类型转换。
(3)服务器禁止采用账号密码方式登录
至此其实就可以在windows上使用securecrt工具通过证书方式登录了,但是为了安全性以及排除演示干扰,我们禁止服务器用账号密码方式登录
[root@heimatengyun ~]# vi /etc/ssh/sshd_config
...省略部分内容
PasswordAuthentication no
...省略部分内容
[root@heimatengyun ~]# systemctl restart sshd.service
[root@heimatengyun ~]#
(4)在SecureCRT中设置采用证书登录
在会话选项中进行设置
设置证书所在的目录
选择刚才第一步中生成的私钥文件,然后点击“Ok”,设置完成即可。
此时就可以成功登录了,使用的就是刚才的证书方式登录。
另外注意,如果securecrt工具连接多台服务器,刚才是通过全局会话选项设置的,则它默认会先用证书登录,如果登录失败会在尝试用账号密码登录。如下演示,100这台服务器并没有设置证书登录,但是由于全局设置了证书登录,因此他会先用证书登录,结果提示失败,然后,添加skip后会继续让用账号密码登录。如下:
点击skip之后,会再次让选择用账号密码登录。
1.4 scp命令
本地拷贝用cp命令,主机之间拷贝数据用scp命令。scp即secure copy,是一个基于ssh协议在网络之间进行安全传输的命令,它传输的数据是经过加密处理的。
语法格式:
scp [参数] 本地文件 远程账户@远程IP地址:远程目录
如果主机之间已经设置免密登录,则可以省略远程账号,即简化为:
scp [参数] 本地文件 远程IP地址或主机名称:远程目录
参数:
参数 | 功能 |
---|---|
-v | 显示详细的连接进度 |
-P | 指定远程主机的sshd端口号,如果是默认的22端口,可以不指定此参数 |
-r | 递归传输文件,用于传输文件夹 |
案例:
(1)本地文件复制到远程主机
[root@origin ~]# echo "local to remote">local.txt
[root@origin ~]# scp local.txt 192.168.78.100:/root/
The authenticity of host '192.168.78.100 (192.168.78.100)' can't be established.
ECDSA key fingerprint is c1:b8:67:1f:1d:c0:cd:6b:37:90:42:b1:c6:5a:e8:cf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.78.100' (ECDSA) to the list of known hosts.
root@192.168.78.100's password:
local.txt 100% 16 0.0KB/s 00:00
本地创建一个文件,通过scp命令指定文件的相对路径,即可传输到远程主机,此时登录远程主机查看,文件以及传输过去了。
另外上边演示是主机之间未设置ssh免密登录所以需要输入密码,如果设置免密登录后,不会要求输入密码。
另外本地文件无论是绝对路径和相对路径都是可以的,上边显示的是相对路径,我们在下用绝对路径来传输。
[root@origin ~]# scp /root/local.txt 192.168.78.100:/root/
root@192.168.78.100's password:
local.txt 100% 16 0.0KB/s 00:00
[root@origin ~]#
(2)远程主机文件下载到本地
[root@origin ~]# rm -rf local.txt
[root@origin ~]# scp 192.168.78.100:/root/local.txt /root/
root@192.168.78.100's password:
local.txt 100% 16 0.0KB/s 00:00
[root@origin ~]# ls
local.txt ...省略部分其他内容
由此可见,成功将远程主机的文件拷贝到了本地。远程拷贝文件需要指定远程文件的绝对路径。
二、screen工具使用
2.1 screen概述
2.1.1 screen产生背景
你是否遇到过在远程计算机上执行长时间运行任务的情况,并且突然连接断开,SSH会话终止了并且你的工作丢失了。
系统管理员经常需要SSH或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
screen就是为了解决这个会话断开导致任务终止的问题。
2.1.2 screen概述
screen是一款能够实现多窗口远程控制的开源服务程序,简单来说就是为了解决网络异常中断或为了同时控制多个远程终端窗口而设计的程序。
screen是终端多路复用器,这意味着可以启动 screen 会话,然后在该会话中打开任意数量的窗口(虚拟终端),即使断开连接,当其窗口不可见时,在 screen 上运行的进程将继续运行。
2.1.3 screen安装
在RHEL7系统中,没有默认安装screen服务程序,需要手动安装。
可以通过如下命令检测是否安装screen
[root@origin ~]# screen --version
bash: screen: command not found...
[root@origin ~]#
通过yum进行安装
[root@origin ~]# yum install screen
Loaded plugins: fastestmirror, langpacks
base | 3.6 kB 00:00
...省略部分内容
Installed:
screen.x86_64 0:4.1.0-0.25.20120314git3c2946.el7
Complete!
[root@origin ~]# screen --version
Screen version 4.01.00devel (GNU) 2-May-06
[root@origin ~]#
安装成功后可以看到版本为4.01。
2.2 语法
语法格式:
screen [参数] 会话名称
常用参数:
参数 | 作用 |
---|---|
-S | 创建会话窗口 |
-r | 回复指定会话 |
-x | 一次性恢复所有会话 |
-ls | 显示当前已有的会话 |
执行方式:
可以先通过screen -S创建会话窗口,然后在窗口中执行任务。也可以直接在screen命令后边跟上要执行的命令,这样命令执行完自动结束screen会话。
2.3 会话管理功能
2.3.1 创建会话
[root@origin ~]# screen -S first
注意观察,此时很快的会屏幕闪一下,然后就没有动静了,其实这已经就进入了刚才创建的first会话窗口了。执行以下命令可以验证
[root@origin ~]# screen -ls
There is a screen on:
48917.first (Attached)
1 Socket in /var/run/screen/S-root.
[root@origin ~]#
2.3.2 退出会话
直接在刚才的窗口中执行exit命令,即可退出first会话
[root@origin ~]# exit
exit
[screen is terminating]
[root@origin ~]#
另外在创建会话时,也可以直接在命令后跟上要执行的任务,这样就无须先创建会话,然后再开始工作,在命令中的一切操作也都会被记录下来,当命令执行结束 后 screen 会话也会自动结束。演示如下:
[root@origin ~]# screen vim test.txt
hello
"test.txt" [New] 1L, 6C written
[screen is terminating]
[root@origin ~]#
创建一个test.txt文件,保存并退出vim后,就自动退出会话了。
2.3.2 会话恢复
所谓的会话恢复是指会话异常断开的情况,比如强行关闭会话窗口,断网等,而不是通过exit正常命令退出窗口或会话。如果正常退出的话通过screen -ls是看不到会话信息的,只有在异常断开的情况才能看到并恢复。
先创建一个会话,并执行一个查看日志文件的任务
[root@heimatengyun ~]# screen -S test
[root@heimatengyun ~]#tail -f /var/log/messages
此时直接断开或关闭会话窗口,模拟异常断开的情况。
再次远程登录系统,在会话窗口中通过以下命令查看上次的会话,并恢复会话
[root@origin ~]# screen -ls
There is a screen on:
49170.test (Detached)
1 Socket in /var/run/screen/S-root.
[root@origin ~]# screen -r test
[root@origin ~]# tail -f /var/log/messages
Jan 5 19:40:01 origin systemd: Starting Session 77 of user root.
Jan 5 19:40:01 origin systemd: Started Session 77 of user root.
Jan 5 19:42:37 origin systemd-logind: Removed session 76.
Jan 5 19:42:39 origin systemd-logind: New session 78 of user root.
Jan 5 19:42:39 origin systemd: Starting Session 78 of user root.
... 省略部分内容
恢复会话后,可以看到tail命令仍然继续在执行,牛吧?
如果是传统方式,直接断开或关闭会话窗口,命令一定会丢失,也就是说下次再登录系统的时候,不会看到tail命令仍然在继续执行。这就是screen的用处,即使会话断开,只要服务器主机没关闭就会继续执行任务。
2.4 会员共享功能
除了前面讲解的会话恢复之外,screen还有其他很多功能,我们在来了解一下会话共享功能。
分别用securecrt登录上边的100和104两台主机,我们以共享104屏幕主机为例(因为104上边已经装了screen)
2.4.1 先从100主机ssh到104
[root@heimatengyun ~]# ssh 192.168.78.104
root@192.168.78.104's password:
Last login: Sun Jan 5 20:41:31 2020 from 192.168.78.1
[root@origin ~]# screen -S test
2.4.2 在104主机执行screen命令
[root@origin ~]# screen -x
2.4.3观察屏幕共享
在104机器上执行的任何操作,在100上都可以看到,同样,在104上执行的任何操作在100上都可以看到。
这样就实现了屏幕共享,退出时只需要执行exit命令即可。
从下一篇文章开始讲解linux下的各种服务部署,包括vsftp文件传输服务、Postfix邮件系统、apache web服务等,敬请期待!