linux入门系列14--ssh服务及主机远程管理

经过前面十余篇文章的介绍,相信已经初步入门Linux本地管理的基本方法了,后续的文章将介绍Linux中经常使用的服务部署以及如何为外部提供相应的服务。linux

系列文章第三篇“linux入门系列3--linux远程登录工具”初步介绍了几款用于Linux远程登陆管理的工具,本文再来详细讲解下SSH协议以及对应的服务配置,从而更好的远程管理服务器。git

提示:在进行操做以前请按前边系列文章的方法,新装或克隆准备2台Linux虚拟机,假设ip地址分别为192.168.78.100和192.168.78.104(须要根据自身实际状况来配置),用于演示linux系统之间的ssh登陆。若是忘记如何准备2台虚拟机的,请参考前面文章“linux入门系列1--环境准备及linux安装”的第三节或“linux入门系列13--磁盘管理之RAID、LVM技术”中的1.3.1小节。web

1、sshd远程控制服务

1.1 ssh概述

SSH全称为Secure Shell,是一种可以以安全的方式提供远程登陆的协议,是目前远程管理 Linux 系统的首选方式。在SSH出现以前通常使用FTP以及Telnet来进行远程登陆,可是他们都是以明文的形式在网络中传输帐户密码和数据信息,所以很是不安全,这种方式很容易受到黑客发起的中间人攻击,从而篡改数据或截取服务器帐号密码。算法

Linux中的sshd服务是基于SSH协议开发的一款远程管理服务程序,能够经过配置sshd服务来远程管理Linux系统。shell

sshd提供两种安全验证方法:基于口令的认证基于密钥的认证apache

基于口令的验证,是用帐号密码来登陆系统,正如咱们前面“linux入门系列1--环境准备及linux安装”讲到,在安装系统时会默认建立root用户以及手动指定的test用户,用这些用户帐号密码就能够登陆使用系统。vim

基于密钥的认证,到目前的文章为止咱们尚未介绍过,它须要在本地生产密钥对,而后把密钥对中的公钥上传到服务器,该方式相对口令认证来讲更安全。windows

下文咱们主要演示基于证书登陆的方式,在演示以前,咱们先配置sshd服务,在RHEL7中,已经默认安装并启用了sshd服务程序安全

1.2 ssh服务配置

sshd服务的配置信息保存在/etc/ssh/sshd_config文件中,查看文件内容能够看到里边有不少内容,可是大部分都是注释起来的,咱们能够根据须要灵活进行配置。bash

经常使用配置参数及做用说明以下:

参数 说明
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生成密钥对

工具-生成公钥

file

在弹出的向导中点击“下一步”

file

保持默认选择RSA算法,并点击“下一步”

file

输入证书密码,也能够不输入,若是输入了,则在登陆时须要指定证书同时输入密码,注意此处的密码不是用户密码,而是证书密码

file

保持默认长度,点击“下一步”

file

点击“下一步”

file

选择密钥类型和目录,点击“完成”

file

这样就在指定的目录生成了密钥文件。

file

其中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中设置采用证书登陆

在会话选项中进行设置

file

设置证书所在的目录

file

选择刚才第一步中生成的私钥文件,而后点击“Ok”,设置完成便可。

file

此时就能够成功登陆了,使用的就是刚才的证书方式登陆。

另外注意,若是securecrt工具链接多台服务器,刚才是经过全局会话选项设置的,则它默认会先用证书登陆,若是登陆失败会在尝试用帐号密码登陆。以下演示,100这台服务器并无设置证书登陆,可是因为全局设置了证书登陆,所以他会先用证书登陆,结果提示失败,而后,添加skip后会继续让用帐号密码登陆。以下:

file

点击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  ...省略部分其余内容

因而可知,成功将远程主机的文件拷贝到了本地。远程拷贝文件须要指定远程文件的绝对路径。

2、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还有其余不少功能,咱们在来了解一下会话共享功能。

file

分别用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上均可以看到。

file

这样就实现了屏幕共享,退出时只须要执行exit命令便可。

从下一篇文章开始讲解linux下的各类服务部署,包括vsftp文件传输服务、Postfix邮件系统、apache web服务等,敬请期待!

相关文章
相关标签/搜索