linux 入门系列 14--ssh 服务及主机远程管理
通过前面十余篇文章的介绍,相信已经初步入门 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/sshhostkey,表示 SSH 协议版本为 1 时,DES 私钥存放的位置;值为/etc/ssh/sshhostrsa_key,表示 SSH 协议版本为 2 时,RSA 私钥存放的位置;值为/etc/ssh/ssh_hostdsakey,表示 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/
idrsa idrsa.pub known_hosts
~~~
注意,此过程需要按 3 次回车,不输入信息直接按回车则采用默认值。可以看到在当前用户根目录下的.ssh 文件夹中生成了公钥(idrsa.pub)和私钥文件(idrsa)。
这样就生成了密钥对。
(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 服务等,敬请期待!
自学帮
版权声明: 本文为 InfoQ 作者【黑马腾云】的原创文章。
原文链接:【http://xie.infoq.cn/article/1b2bee4fb3b4f4dccc84f2317】。未经作者许可,禁止转载。
评论