作业13:SSH服务综合项目实战(Centos6/7)


文章目录

  • 作业13:SSH服务综合项目实战(Centos6/7)
  • 13.1 某企业要对两台服务器做双机互信,编写脚本解决
  • 13.2 SSH连接速度慢的原因有哪些
  • 13.3 SSH如何实现访问控制
  • 13.4 如何使用SecureCRT或Xshell实现代理转发连接SSH服务器
  • 13.5 使用跳板机一键登录目标服务器


13.1 某企业要对两台服务器做双机互信,编写脚本解决

  1. 实验环境

服务器

IP

系统

主动方(客户端)

192.168.6.146/24

Centos 6.9

被动方(服务器端)

192.168.6.128/24

Centos 7

#客户端
[root@lin ~]# expect
-bash: expect: command not found
[root@lin ~]# yum -y install expect
[root@lin ~]# ll ~/.ssh				
total 0
#服务器端
[root@ / 04:20:21]#ll ~/.ssh
total 4
-rw-r--r--. 1 root root 965 Sep 15 15:50 known_hosts
  1. 客户端脚本编写
[root@lin ~]# vim ssh_mul_trust.exp
#!/usr/bin/expect
set username [ lindex $argv 0 ]  # 脚本首个参数,被动方服务器用户名
set ip [ lindex $argv 1 ]		 # 被动方服务器IP
set passwd [lindex $argv 2 ]	 # 被动方服务器用户名的密码

spawn ssh-keygen  				 # 运行并监控ssh密钥生成指令
expect "(/root/.ssh/id_rsa):"    # 捕获相关问题并做输出
        send "\r"

expect {
        "Overwrite (y/n)?" {    # 回答特殊问题:用户已经生成密钥情况
                send "y\r"
                exp_continue	
            	   # 当问题不存在(即还没生成密钥对),继续回答其他问题
         }
        "empty for no passphrase):" {
                send "\r"
                exp_continue
        }
        "again:" { 
                send "\r"
        }
}
spawn /usr/bin/ssh-copy-id $username@$ip # 执行公钥传输命令并监控
expect {
        "(yes/no)?" {
                send "yes\r" 
                exp_continue 
        }
        "password:" {
        send "$passwd\r"
        }
}
interact 								# 问题回答完毕留在交互界面
  1. 测试
# 主动方
[root@lin ~]# chmod +x /root/ssh_mul_trust.exp      	 #权限修改
[root@lin ~]# ./ssh_mul_trust.exp root 192.168.6.128 **pw***
spawn 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: spawn /usr/bin/ssh-copy-id root@192.168.6.128
root@192.168.6.128's password: 
Now try logging into the machine, with "ssh 'root@192.168.6.128'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
[root@lin ~]# ll ~/.ssh/					#已经生成密钥对文件
total 12
-rw-------. 1 root root 1675 Aug 15 17:32 id_rsa     #私钥文件
-rw-r--r--. 1 root root  390 Aug 15 17:32 id_rsa.pub #公钥文件
-rw-r--r--. 1 root root  395 Aug 15 16:27 known_hosts
    
[root@lin ~]# ssh root@192.168.6.128     #自动ssh登陆且不需要输入密码
Last login: Sun Sep 20 21:33:07 2020 from 192.168.6.1

#被动方
[root@ / 05:46:08]#ll ~/.ssh/
total 8
-rw-------  1 root root 390 Sep 20 17:46 authorized_keys  #密钥文件
-rw-r--r--. 1 root root 965 Sep 15 15:50 known_hosts

13.2 SSH连接速度慢的原因有哪些

#1.在服务器端,即被动方修改
vim /etc/ssh/sshd_config
# UseDNS yes
UseDNS no
# GSSAPIAuthentication yes
GSSAPIAuthentication no
#2. 修改后重启服务
systemctl restart sshd
  1. UseDNS no,取消服务端根据ip地址查找主机名(反向解析)从而取消与客户端请求的正向记录进行比较的过程,减少主机验证阶段花费的时间。
  2. GSSAPIAuthentication no,不允许基于GSSAPI(通用安全服务应用程序接口)的用户认证

13.3 SSH如何实现访问控制

  • 方法一:修改/etc/ssh/sshd_config配置文件示例如下:
allowuser user0
allowuser user1 user2
allowuser user3 user4@192.168.1.1
#允许 user3 和从 192.168.1.1 登录的 user4 帐户通过 SSH 登录系统
allowuser user5@192.168.1.1 user6@192.168.1.2
allowuser *@192.168.1.2
#允许从 192.168.1.2 登录的 任何 帐户通过 SSH 登录系统

denyuser user0
denyuser user1 user2
denyuser user3 user4@192.168.1.1
#不允许 user3 和从 192.168.1.1 登录的 user4 帐户通过 SSH 登录系统
denyuser user5@192.168.1.1 user6@192.168.1.2
denyuserr *@192.168.1.2
#不允许从 192.168.1.2 登录的 任何 帐户通过 SSH 登录系统
  1. 服务器端
[root@ ~ 11:30:24]#vim /etc/ssh/sshd_config
allowusers *@192.168.6.146* 
#允许地址为192.168.6.146主机通过任何用户登陆到服务器端
denyusers *@192.168.6.145*
#禁止地址为192.168.6.146主机通过任何用户登陆到服务器端
[root@ ~ 11:35:17]#systemctl restart sshd
  1. 客户端
[root@lin ~]# ip ad sh|grep 146     #尝试合法地址          
    inet 192.168.6.146/24 brd 192.168.6.255 scope global eth0
[root@lin ~]# ssh root@192.168.6.128
Last login: Sun Sep 20 23:39:42 2020 from 192.168.6.146
[root@ ~ 11:40:06]#

[root@lin ~]# ip ad sh|grep 145		#尝试不合法地址
    inet 192.168.6.145/24 brd 192.168.6.255 scope global eth0
[root@lin ~]# ssh root@192.168.6.128
root@192.168.6.128's password: 
Permission denied, please try again.
  • 方法二:设置/etc/hosts.allow和/etc/hosts.deny两个系统配置文件,限制指定某个/段ip进行SSH登陆,示例如下:
vim /etc/hosts.allow
sshd:192.168.6.146:allow    #允许192.168.6.146 ssh登录
//sshd:192.168.6.1/24:allow #允许192.168.0.1/24段 IP地址用户登录
//sshd:192.168.6.*:allow #允许192.168.0.1/24段 IP地址用户登录

vim /etc/hosts.deny
sshd:ALL:deny  #拒绝了所有sshd远程连接,':deny'字段可以省略

#当hosts.allow和 host.deny相冲突时,以hosts.allow设置为准
  • 方法三:iptables/tcpwrapper设置(立即生效)
#白名单测试
#服务器端
[root@ ~ 10:36:10]#iptables -A INPUT -p tcp --dport 22 -s 192.168.6.146 -j ACCEPT    #允许来自192.168.6.146用户的ssh连接

#客户端
[root@lin ~]# ssh root@192.168.6.128
Last login: Mon Sep 21 10:35:10 2020 from 192.168.6.1

#黑名单测试
#服务器端
[root@ ~ 10:36:10]#iptables -A INPUT -p tcp --dport 22 -s 192.168.6.146 -j ACCEPT  #不允许来自192.168.6.1网段用户的ssh连接

#客户端
[root@lin ~]# ssh root@192.168.6.128
ssh: connect to host 192.168.6.128 port 22: Connection timed out

13.4 如何使用SecureCRT或Xshell实现代理转发连接SSH服务器

名称(实验:虚拟机主机)

IP

跳板机(Centos 6.9)

192.168.6.146

目标服务器(Centos 7)

192.168.6.128

  1. 拓扑图

android 平台公钥是 公钥认证服务器_服务器端

ssh(PC登陆到跳板机)提供两种认证方式:口令(密码)认证方式和密钥认证方式;口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法

目的:出于安全,本地电脑是与目标服务器是网关不通的,为了能访问远程服务器数据必须做端口转发:本地运维同学主机进行SSH连接并进行公钥认证登陆的对象为跳板机(Jump-server),然后运维同学,通过跳板机与目标服务器的之间的公钥认证登陆,间接地登陆目标服务器,明白?。

  1. Xshell新建SSH连接(附图贴错了,连接的是跳板机ip:192.168.6.146)

android 平台公钥是 公钥认证服务器_服务器_02

  1. 生成密钥公钥(Public key)与私钥(Private Key)
  • 在“密钥类型”项选择“RSA”公钥加密算法,“密钥长度”选择为“2048”位密钥长度,如下图:

android 平台公钥是 公钥认证服务器_IP_03

  • 在“密钥名称”中输入id_rsa_2048的文件名称,我这里为“id_rsa_2048”;在“密码”处输入一个密码用于加密私钥,并再次输入密码确认,如下图:

android 平台公钥是 公钥认证服务器_IP_04

  • 点击“下一步”,密钥生成完毕,这里显示的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到文件,点击“保存为文件”按钮,将公钥(Public key)保存到磁盘(我放到c盘下的download目录),文件名为“id_rsa_2048.pub”

android 平台公钥是 公钥认证服务器_android 平台公钥是_05

  1. 继续做SSH连接配置(附图信息写错了,修正:图中密码为:给刚刚生成的密钥对加密的密码)

android 平台公钥是 公钥认证服务器_服务器_06

  1. 设置文件传输(这里指公钥文件)的本地路径,

android 平台公钥是 公钥认证服务器_服务器端_07

android 平台公钥是 公钥认证服务器_IP_08

  1. 本地主机先口令登陆到跳板机,用于:下载公钥文件id_rsa_2048.pub到跳板机,并修改跳板机ssh配置文件(等到用公钥认证登陆跳板机后,方可以修改相关配置文件取消密码登陆)

android 平台公钥是 公钥认证服务器_服务器_09

#1.用于Linux同Windows进行文件传输的命令行工具传输速度比较慢,
#适用于小文件传输
[root@lin ~]# yum -y install lrzsz

#2.创建公钥文件
[root@lin ~]# cd ~/.ssh
[root@lin .ssh]# touch authorized_keys

#从3.Windows指定位置下载公钥文件
[root@lin .ssh]# rz			
[root@lin .ssh]# ls				#查看目录下是否下载成功,成功
authorized_keys  id_rsa  id_rsa_2048.pub  id_rsa.pub  known_hosts

#4.追加公钥到公钥文件里
[root@lin .ssh]# cat id_rsa_2048.pub >>authorized_keys #mv命令失效

#5.权限修改(必做)
[root@lin .ssh]# chmod 700 ~/.ssh                 
[root@lin .ssh]# chmod 600 ~/.ssh/authorized_keys  
[root@lin .ssh]# ll
total 16
-rw-------. 1 root root  396 Sep 21  2020 authorized_keys
-rw-------. 1 root root 1675 Aug 15 17:32 id_rsa
-rw-r--r--. 1 root root  390 Aug 15 17:32 id_rsa.pub
-rw-r--r--. 1 root root  395 Aug 15 16:27 known_hosts

#6.修改ssh配置文件
[root@lin ~]# vim /etc/ssh/sshd_config            
RSAAuthentication yes      #允许RSA非对称加密算法认证
PubkeyAuthentication yes   #允许公钥认证
AuthorizedKeysFile      .ssh/authorized_keys

#7.#重启服务,并退出当前shell,准备进行公钥登陆
[root@lin ~]# service sshd restart                
[root@lin ~]# exit
  • 常见问题:xshell发起连接,报错:“所选用户密钥未在远程主机上注册”
#1.查看是否在跳板机~/.ssh目录下加载好xshell所在主机生成的RSA公钥文件
#2.是否修改好~/.ssh和~/.ssh/sshd_config的权限?(参考上述步骤)
#3./etc/ssh/sshd_config 的allowuser denyuser字段检查
#4.公钥文件是否损坏?重新生成并放跳板机到指定位置
  1. 公钥登陆

android 平台公钥是 公钥认证服务器_android 平台公钥是_10

#1.Xshell公钥登陆
[C:\~]$ 

Connecting to 192.168.6.146:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Mon Aug 17 11:29:37 2020 from 192.168.6.1 #连接成功
[root@lin ~]# 

#2.完成全部设置,并以密钥方式登录成功后,修改ssh配置文件
#/etc/ssh/sshd_config,禁用密码登陆,然后重启ssh服务
#PasswordAuthentication no 
#说明:安全要紧
  1. 从跳板机登录到目标服务器
  • 关于公钥分发,参考[13.1(ctrl+点击)](# 13.1 某企业要对两台服务器做双机互信,编写脚本解决)
[root@lin ~]# ssh root@192.168.6.128
Last login: Mon Sep 21 16:11:13 2020 from 192.168.6.1

13.5 使用跳板机一键登录目标服务器

主机类

IP

系统版本

本地主机

192.168.0.104(127.0.0.1)

Win 10

跳板机

192.168.6.146

Centos 6.9

目标服务器

192.168.6.128

Centos 7.0

  • 方法一:代理方式一键登陆
  1. 在章节 [13.4(ctrl+点击)](# 13.4 如何使用SecureCRT或Xshell实现代理转发连接SSH服务器)基础上进行精简化,以下过程参考该章节,不再赘述:

1、本地运维同学的主机上,Xshell 生成密钥(公钥与私钥);

2、放置公钥(Public Key)到跳板机服务器~/.ssh/authorized_key文件中;

3、修改跳板机服务器ssh配置文件;

4、跳板机分发公钥(跳板机它自己的公钥不是本地主机运维同学的公钥)到目标服务器中;

  1. 新建连接

android 平台公钥是 公钥认证服务器_服务器端_11

  1. 公钥登陆配置

android 平台公钥是 公钥认证服务器_android 平台公钥是_12

  1. 指定连接后要运行的远程命令

android 平台公钥是 公钥认证服务器_服务器_13

  1. 连接,测试
[C:\~]$ 

Connecting to 192.168.6.146:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Last login: Mon Sep 21 20:40:11 2020 from 192.168.6.146
[root@ ~ 09:11:40]#ip ad sh|grep 128 #查看是否已经连接到目的服务器
    inet6 ::1/128 scope host 
    inet 192.168.6.128/24 brd 192.168.6.255 scope global ens33
    
#相关防火墙配置我这里就不赘述
  • 方法二:SSH端口转发方式(隧道)一键登录
  1. 目标服务器下载本地主机的公钥
#先通过xshell进行口令登陆目标服务器,然后在目标服务器做以下操作
#1.安装文件传输工具
[root@ ~ 12:41:36]#yum -y install lrzsz		
[root@ ~ 12:43:43]#cd ~/.ssh				#进入目录
[root@ ~/.ssh 12:43:49]#ll		#公钥文件大小为390,权限没问题
total 8
-rw-------  1 root root  390 Sep 20 17:46 authorized_keys
...

#2.从本地主机指定路径下载公钥文件(可以直接将本地公钥文件拖动到xshell,连接到目标服务器的窗户口下,便会进行文件传输)
[root@ ~/.ssh 12:43:50]#rz		

[root@ ~/.ssh 12:44:17]#ls		#下载成功
authorized_keys  id_rsa_2048.pub  known_hosts

#3.追加新公钥到authorized_keys
[root@ ~/.ssh 12:44:26]#cat id_rsa_2048.pub >> authorized_keys                 
[root@ ~/.ssh 12:44:39]#ll		#公钥文件大小为786,权限没问题
total 12
-rw-------  1 root root  786 Sep 22 00:44 authorized_keys
...

#4.重启ssh服务
[root@ ~/.ssh 12:45:27]#systemctl restart sshd 
[root@ ~/.ssh 12:46:02]#exit				 #退出当前shell
logout
  1. 本地服务器新建两个连接

本地主机想访问目标服务器(192.168.6.128),但不能直接访问。本地主机可以访问跳板机(192.168.6.146),而跳板机可以访问目标服务器,此时就可以通过端口转发来实现,需要建立如下连接: 1.(连接1)跳板机连接设置:本地主机指定端口隧道跳转到目标服务器22号端口 2.(连接2)本地主机登录到目标服务器的隧道连接设置:负责本地主机指定端口隧道跳转到目标服务器22号端口 说白了:就是连接1负责做一个桥梁,在连接1启动之后的基础上,连接2发起,本地主机就可以通过连接1搭建的桥梁直接连接上目标服务器

  • 新建连接1 (标注3:跳板机IP地址;标注4:跳板机上SSH服务器绑定的端口)

android 平台公钥是 公钥认证服务器_IP_14

- 连接1:采用公钥认证登陆(前提:本地主机已经将本地主机的公钥分发到跳板机服务器中)

android 平台公钥是 公钥认证服务器_IP_15

- 连接1,进行隧道搭建(标注4:设置端口转发要绑定的本地地址;标注:设置一个本地端口,不与本地端口冲突就可以了)

android 平台公钥是 公钥认证服务器_android 平台公钥是_16

- 新建连接2(标注4:设置为127.0.0.1或者localhost;标注5:该端口大小与跳板机中端口转发设置(即连接1)的端口大小一致)

android 平台公钥是 公钥认证服务器_服务器端_17

- 连接2采用公钥认证登陆(前提:步骤1.目标服务器下载本地主机公钥;标注5:密码是加密公钥的密码,运维同学知道)

android 平台公钥是 公钥认证服务器_服务器端_18

- 连接2隧道搭建(标注6:目的服务器的ip地址;标注7:目标服务器SSH服务对应的端口)

android 平台公钥是 公钥认证服务器_IP_19

  1. 测试
  • 跳板机不连接,目标服务器无法正常连接到目标服务器

android 平台公钥是 公钥认证服务器_IP_20

android 平台公钥是 公钥认证服务器_服务器_21

- 只有在跳板机连接成功连接上跳板机后,目的服务器连接才能够成功连接上目的服务器;

android 平台公钥是 公钥认证服务器_服务器端_22

android 平台公钥是 公钥认证服务器_服务器端_23