SSH基于密钥批量远程管理

一、远程管理服务概念介绍

1.远程连接方式ssh

#安全的远程连接,数据信息是加密的,端口22,默认root用户可以连接,主要是系统远程连接方式

2.远程连接方式telnet

#不安全的远程连接,数据信息是明文的,端口23,默认root用户不可以连接,主要是网络设备远程连接方式

3.什么是shell

#每连接登录到一个linux系统中,就是一个shell

#可以一个linux系统有多个会话连接,每一个会话都是一个shell

#系统中用户可以实现相互转换,每转换一个用户就是一个shell

4.shell特点说明

#一般命令行临时配置的信息,只会影响当前shell

#命令配置的信息如果想生效,需要切换shell(例如修改计算机名称,可以通过bash切换生效)

5.安装telnet

#安装
yum install -y telnet-server

#启动
systemctl start telnet.socket

6.演示ssh和telnet抓包

telnet 172.1.1.23
密码是明文密码,而且不能使用root用户登录

在这里插入图片描述
在这里插入图片描述

ssh 172.1.1.23
密码是密文,而且可以使用root用户登录

在这里插入图片描述

二、ssh服务连接工作原理

1.ssh服务连接方式

#基于密码的方式进行远程连接(连接不太安全)
第一个步骤:客户端  			执行远程连接命令
第二个步骤:客户端  服务端    	建立三次握手过程
第三个步骤:服务端            	让客户端进行确认是否接收服务端公钥信息
第四个步骤:客户端            	进行公钥确认,接收到公钥信息
第五个步骤:服务端            	让客户端确认登录用户密码信息
第六个步骤:客户端             进行密码信息确认
第七个步骤:客户端  服务端    	远程连接建立成功


#基于秘钥的方式进行远程连接(连接比较安全)
基于秘钥方式连接过程(原理)
客户端(管理端)    执行命令创建秘钥对
客户端(管理端)    建立远程连接(密码),发送公钥信息
客户端(管理端)    再次建立远程连接
服务端(被管理端)  发送公钥质询信息(你要是能打开我的锁头吗)
客户端(管理端)    处理公钥质询信息(钥匙将锁头打开),将质询结果返回给服务端
服务端(被管理端)  接收到质询结果,建立好远程连接

2.私钥和公钥作用

#私钥类似钥匙,公钥类似锁头

#利用私钥和公钥对数据信息进行加密处理

#利用公钥和私钥进行用户身份认证

#基于密码的方式进行远程连接:公钥和私钥只能完成数据加密过程

#基于秘钥的方式进行远程连接:公钥和私钥可以完成身份认证工作

3.ssh基于密码的方式进行远程连接的过程

扫描二维码关注公众号,回复: 12890493 查看本文章
#使用web01服务器通过ssh连接backup服务器(ssh也可以使用计算机名称连接)
ssh backup
The authenticity of host 'backup (192.1.1.28)' can't be established.
ECDSA key fingerprint is SHA256:6K1mukyuHnEOSGvI/BNIz2eD5W48wr2TyIRJZ9nuMOw. #此时客户端会下载服务端的公钥信息
ECDSA key fingerprint is MD5:da:16:12:0b:20:49:d9:96:43:23:c0:56:fe:04:35:44.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'backup,192.1.1.28' (ECDSA) to the list of known hosts.
root@backup's password: 

#查看ssh被管理客户端backup服务器下载的公钥信息
cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMdD5tlZQneWFs+C2tp0Uy7GacsJIjfcE73KdrcDvwMAXI98buhlvYuwkdNiaqB6A7fHHArNv2jrCcUR6esH1aI= 

#查看ssh管理服务端web01服务器的公钥信息
cat ~/.ssh/known_hosts
backup,192.1.1.28 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMdD5tlZQneWFs+C2tp0Uy7GacsJIjfcE73KdrcDvwMAXI98buhlvYuwkdNiaqB6A7fHHArNv2jrCcUR6esH1aI=

三、ssh实现基于秘钥连接的部署步骤

1.第一个里程:准备好一台管理服务端和一台被管理客户端

管理端计算机名称:m01 
管理端IP地址:192.1.1.29

客户端计算机名称:web01
客户端IP地址:192.1.1.23

2.第二个历程:管理端利用ssh-keygen命令创建秘钥对信息

#ssh-keygen命令的语法
man ssh-keygen
NAME
     ssh-keygen — authentication key generation, management and conversion
SYNOPSIS
     ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1] [-N new_passphrase] [-C comment]
                [-f output_keyfile]

#管理端创建密钥     
ssh-keygen -t dsa #-t参数可以指定密钥的类型
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): #设置密码保存路径,直接回车则使用默认路径
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): #设置密钥的密码,直接回车则不设置密码
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_dsa. #私钥保存路径
Your public key has been saved in /root/.ssh/id_dsa.pub. #公钥保存路径
The key fingerprint is:
SHA256:SbtIRbbxBiOKCniCcwXZtNNzDmY9L4bQ9147HJBomas root@m01
The key's randomart image is:
+---[DSA 1024]----+
|  .=o . *        |
|o .o.= = X .     |
|* + = B & =      |
|.*   = @ O .     |
|.     o S o o    |
|     . + + o o   |
|      E . . +    |
|             .   |
|                 |
+----[SHA256]-----+

3.第三个历程:管理端将公钥分发到被管理的客户端

#管理端将公钥分发到被管理的客户端
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]  #-i参数可以指定发送的密钥路径
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_dsa.pub"
The authenticity of host '192.1.1.23 (192.1.1.23)' can't be established.
ECDSA key fingerprint is SHA256:6K1mukyuHnEOSGvI/BNIz2eD5W48wr2TyIRJZ9nuMOw.
ECDSA key fingerprint is MD5:da:16:12:0b:20:49:d9:96:43:23:c0:56:fe:04:35:44.
Are you sure you want to continue connecting (yes/no)? 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
[email protected]'s password: #输入客户端服务器的密码
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

#客户端保存管理端发送的密钥路径
cat /root/.ssh/authorized_keys 
ssh-dss AAAAB3NzaC1kc3MAAACBANRSMr7ZJz76AK7xgyX1myvAzrXWaTt9pMg5FfGG9m+1zzR47zD95m/sGK27JeWypysAXQoYjIkeUvrxNlhr4dfnmvB13Xqoz2yhKCaIGw3dcwpWdudA750L5J06RjRFSox/7D90ZRPMHtftLliVmUduatfxPMgp5zMPuFNauTGRAAAAFQDidRPlyHkN0sPz/S9mgUMsW8e3NwAAAIEAx7Gi+fC1/IN8sO8z/n1P/o5uovO/y8jgHBJaOpBUPepthVISGgTj4gvlYlol8Yl9+Q6aHwuY2dGPiepxhCUlXPlQcSJFCUJ8wZJ9rNuCPo/0AvDabxb4WIwNBNWXH4ondgxBJYKOnYpyt3ZrP/GgbrKcrsHffRUnRBmsu4FpcnwAAACBAIle5LJ6/NOBa+iJOANOe2RIn/aJS0yRgzpLs2o8z3pfm1cNqrvGia0brpp7sZPSH3/56oZrBoCb0ML6teoNa55yi5GIm3Fa0e9y23CDJoqTS0WAqBqkIyxohU1rOIw6F0Mu/8tReQTD8Ejz6YcK60VWx/WLF7pAnFpoVKxN2GSc root@m01

4.第四个历程: 管理端进行远程连接测试

#连接测试
ssh 192.1.1.23 
Last login: Wed Aug 12 10:48:32 2020 from 192.1.1.1 #此时管理端不需要密码直接可以访问客户端

#也可以直接执行命令管理客户端
ssh 192.1.1.23 ip a  
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

四、编写脚本进行批量分发公钥

1.脚本开通调用解释器

#!/bin/bash       #使用shell解释器编写脚本
#!/usr/bin/python #使用python解释器编写脚本

2.编写批量分发公钥脚本(此时有交互相关问题)

#此时有脚本有交互相关问题
vim /server/scripts/fenfa_pub_key.sh
#!/bin/bash

for ip in 21 22 24 25 26 27 28 29 30 31 
do ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected].$ip
done

交互问题具体如下
01. 需要有确认yes或no
02. 需要输入密码信息
03. 服务端端口号变化了,如何分发公钥

3.解决脚本的交换问题

#安装免交换软件
yum install -y sshpass

#执行免交互方式分发公钥命令
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]

#跳过输入yes或者no的确认信息
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected] "-o StrictHostKeyChecking=no"

#服务端口号发生变化,如何进行批量分发公钥
ssh -p 22 192.1.1.28 #-p参数可以指定ssh连接端口

#最终结合在一起
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected] -p 22 "-o StrictHostKeyChecking=no"

4.编写批量分发公钥脚本(此时解决交互问题)

#第一种办法:变量ip调用数值信息实现脚本for
vim /server/scripts/fenfa_pub_key.sh
#!/bin/bash
password=123456
port=22
for ip in 21 22 24 25 26 27 28 29 30 31
do
  echo "==================== host 192.16.1.$ip 开始发布公钥 ==================== "
  sshpass -p$password ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected].$ip -p $port "-o StrictHostKeyChecking=no" &>/dev/null
  echo "host 192.16.1.$ip 发布成功"
  echo "==================== host 192.16.1.$ip 结束发表公钥 ==================== "
  echo ""
done

#第二种办法:变量ip调用文本信息实现脚本for
vim /server/scripts/ip.txt
192.1.1.21
192.1.1.22
192.1.1.23
192.1.1.24
192.1.1.25
192.1.1.26
192.1.1.27
192.1.1.28
192.1.1.29
192.1.1.30
192.1.1.31

vim /server/scripts/fenfa_pub_key.sh
#!/bin/bash
password=123456
port=22
for ip in `cat /server/scripts/ip.txt`
do
  echo "==================== host $ip 开始发布公钥 ==================== "
  sshpass -p$password ssh-copy-id -i /root/.ssh/id_dsa.pub root@$ip -p $port "-o StrictHostKeyChecking=no" &>/dev/null
  echo "host 192.16.1.$ip 发布成功"
  echo "==================== host $ip 结束发表公钥 ==================== "
  echo ""
done

5.执行脚本

sh /server/scripts/fenfa_pub_key.sh 
==================== host 192.16.1.192.1.1.21 开始发布公钥 ==================== 
host 192.16.1.192.1.1.21 发布成功
==================== host 192.16.1.192.1.1.21 结束发表公钥 ==================== 

==================== host 192.16.1.192.1.1.22 开始发布公钥 ==================== 
host 192.16.1.192.1.1.22 发布成功
==================== host 192.16.1.192.1.1.22 结束发表公钥 ==================== 
.......以下信息省略

五、分发公钥检查脚本(串型批量管理)

1.编写分发公钥检查脚本

vim /server/scripts/check_pub_key.sh
#!/bin/bash
#变量CMD负责参数传递
CMD=$1
for ip in `cat /server/scripts/ip.txt`
do
  echo "==================== host 192.16.1.$ip 调用命令 ==================== "
  ssh $ip $CMD
  echo "==================== host 192.16.1.$ip 结束命令 ==================== "
  echo ""
done

2.执行脚本

sh check_pub_key.sh hostname #此时脚本中的CMD会调用命令hostname
==================== host 192.16.1.192.1.1.21 调用命令 ==================== 
lb01
==================== host 192.16.1.192.1.1.21 结束命令 ==================== 

==================== host 192.16.1.192.1.1.22 调用命令 ==================== 
lb02
==================== host 192.16.1.192.1.1.22 结束命令 ==================== 
.......以下信息省略
 
sh check_pub_key.sh "yum install -y vim"  #此时脚本中的CMD会调用命令yum install -y vim

六、ssh服务配置文件/etc/ssh/sshd_config

#客户端的ssh配置文件/etc/ssh/ssh_config

#服务端的ssh配置文件/etc/ssh/sshd_config
Port 22                   #修改端口
ListenAddress 0.0.0.0     #监听地址 指定一块网卡能够接受远程访问请求(指定监听地址只能是本地网卡上有的地址)
PermitEmptyPasswords no   #是否允许远程用户使用空密码登录(默认不允许)
PermitRootLogin yes       #是否禁止root用户远程连接主机(建议改为no)
GSSAPIAuthentication no   #是否开启GSSAPI认证功能(关闭可以加快ssh连接速率)
UseDNS no                 #是否开启反向DNS解析功能(建议进行关闭)

七、ssh远程服务防范入侵的案例

1.用密钥登录,不用密码登陆
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#修改ssh的服务端配置文件
vim /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

#重启ssh服务
systemctl restart sshd

在这里插入图片描述

2.牤牛阵法:解决SSH安全问题

a.防火墙封闭SSH,指定源IP限制(局域网、信任公网)
b.开启SSH只监听本地内网IP(ListenAddress 192.16.1.61)

3.尽量不给服务器外网IP

4.权限最小化

八、ssh相关的命令总结

#创建ssh密钥文件
ssh-keygen -t dsa                                                        

#将密钥文件以root身份发送给客户端
ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected]                     

#免交互方式将密钥文件以root身份发送给客户端
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub [email protected] -p 22 "-o StrictHostKeyChecking=no"  

#ssh远程访问
ssh 192.1.1.23                                                          

#指定root用户备份/etc/hosts 
scp -rp /etc/hosts [email protected]:/backup                               

#访问ftp
sftp 192.1.1.23
Connected to 192.1.1.23.
sftp> help
Available commands:
ls       查看远程ftp服务器信息
cd       查看远程ftp服务器信息
lls      查看本地ftp客户端信息
lcd      查看本地ftp客户端信息
get      下载信息
put      上传信息
help     查看命令帮助
bye      退出ftp连接

猜你喜欢

转载自blog.csdn.net/qq_41938046/article/details/108103028