第五章 SSH远程连接服务

一、ssh远程服务介绍

1.简介

SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?

1.提供远程连接的服务
	linux远程连接: ssh  telnet
	windows的远程连接:  RDP (remote desktop)、向日葵、teamviewer
2.对传输数据进行加密

2.使用telnet连接

#安装telnet服务
[root@nfs ~]# yum install -y telnet-server

#启动
[root@nfs ~]# systemctl start telnet.socket

#telnet只支持普通用户登录,创建用户
[root@nfs ~]# useradd lhd
[root@nfs ~]# echo 123 | passwd --stdin lhd
Changing password for user lhd.
passwd: all authentication tokens updated successfully.

#连接测试
[c:\~]$ telnet 10.0.0.31 23
Connecting to 10.0.0.31:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

Kernel 3.10.0-957.el7.x86_64 on an x86_64
nfs login: lhd
Password: 123
[lhd@nfs ~]$ su -

3.两者区别

1.telnet:
	1)不能使用root用户登录,只能使用普通用户
	2)数据包没有进行加密,传输都是明文的
	
2.ssh:
	1)可以使用任意用户登录
	2)数据传输都是加密的

二、ssh相关命令

SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。
在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp文件传输、ssh-copy-id秘钥分发等应用程序。

1.ssh命令

[root@web01 ~]# ssh root@172.16.1.31 -p 22
命令+虚拟用户@ip

-o StrictHostKeyChecking=no		#首次访问时不验证身份

3.scp命令文件备份传输

scp客户端命令:远程拷贝
类似于rsync,scp全量,rsync增量

scp支持推和拉
参数:
-P 指定端口,默认22端口可不写
-r 表示递归拷贝目录
-p 表示在拷贝文件前后保持文件或目录属性不变
-l 限制传输使用带宽(默认kb)

[root@web01 /tmp]# scp -l 8096 1.txt 172.16.1.31:/tmp/
root@172.16.1.31's password: 
1.txt    12%   64MB   1.0MB/s   07:19 ETA

1)scp推:

#把当前目录下的hostname_ip.sh文件推送到172.16.1.31机器的/tmp目录下
[root@web01 ~]# scp hostname_ip.sh 172.16.1.31:/tmp

#推目录下文件
[root@web01 ~]# scp /data/* root@172.16.1.41:/root
#推目录下文件+目录本身(加不加 / 都是)
[root@web01 ~]# scp -r /data/ root@172.16.1.41:/root

#注意:
	与rsync不同,推送时不论是加 / 还是不加 / ,推送的都是目录
	如果想推送目录下的文件,则使用 *

2)scp拉:

[root@web01 ~]# scp 172.16.1.31:/tmp/1.txt ./

#注意:
	与rsync不同,拉取时不论是加 / 还是不加 / ,拉取的都是目录
	如果想拉取目录下的文件,则使用 *

3)scp优缺点

1.scp通过ssh协议加密方式进行文件或目录拷贝。
2.scp连接时的用户作为为拷贝文件或目录的权限。
3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低。

4.sftp命令文件备份传输

1)终端连接

#文件传输命令
sftp:/root> 

#下载文件
sftp:/root> get hostname_ip.sh
Fetching /root/hostname_ip.sh to hostname_ip.sh
sftp: received 497 ؖ½ؠin 0.01 seconds

#上传文件
sftp:/root> put

2)服务器之间连接

#连接
[root@web01 ~]# sftp root@172.16.1.31
root@172.16.1.31's password: 
Connected to 172.16.1.31.


#操作远程连接过去的机器
sftp> pwd
Remote working directory: /root
sftp> ls -l
-rw-------    1 root     root         1429 Jul  6 02:17 anaconda-ks.cfg
-rw-r--r--    1 root     root          497 Aug  5 20:15 hostname_ip.sh

#如果想操作本机,则在命令前加一个 l
sftp> lls -l
-rw-------. 1 root root 1429 Jul  6 02:17 anaconda-ks.cfg
-rw-r--r--. 1 root root  497 Aug  5 20:15 hostname_ip.sh

get/put 源文件 目标目录
#拉取命令
sftp> get 1.txt ./
#当使用get拉取的时候,前面的是远程服务器,后面的是本地服务器
#推送命令
sftp> put 1.txt ./
#当使用put推送的时候,前面的是本地服务器,后面的是远程服务器

	# get下载
远端下载到本地
get 远端源文件 本地目录
	# put上传
本地上传到远端
put 本地源文件 远端目录

3)文件传输工具

#图形化工具
1.xftp
2.filezilla
3.flashfxp

4)命令对比

1.rz/sz:
	1.不能上传4G以上的文件
	2.不能断点续传
	3.不能上传文件夹

2.sftp:
	1.能上传大于4G的文件
	2.能断点续传
	3.可以上传文件夹
命令\对比项 文件大小 断点续传 文件类型
rz/sz 小于4G 不能 文件
sftp 大于4G 文件+目录

三、SSH验证方式

密码设置规则

1.复杂的密码(容易忘记)
2.简单的密码(容易被破解)
3.每台机器密码都不一样
4.密码是动态的
5.密码三个月一变
6.密码错误三次,锁定用户
7.密码肯定是没有规律的

方式一:基于用户名密码连接

#需要知道服务器的IP,端口,系统用户,用户密码才能链接远程主机
[root@nfs ~]# ssh root@172.16.1.7 -p 2222
root@172.16.1.7's password: 
Last login: Tue Aug 18 00:44:33 2020 from 10.0.0.1
[root@web01 ~]#

方式二:基于密钥的方式

默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。

1)生成密钥对

ssh-keygen		#生成、管理和转换认证密钥	没有指定则默认生成SSH-2的RSA密钥
	-t	指定要创建的密钥类型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2)
	-C	提供注释信息,一般用于指定用户邮箱
	ssh-keygen -t rsa -C xxx@qq.com
	ssh-keygen -t rsa 分别是私钥(id_rsa)与公钥(id_rsa.pub)
[root@web01 ~]# ssh-keygen
[root@web01 ~]#

2)将公钥发送至要免密登录的服务器

1>方式一:手动复制
#查看公钥
[root@web01 ~]# cat .ssh/id_rsa.pub 

#将公钥写到要连接的机器 (保证是一行)
#配置文件要-切换-到要-免密的用户-下写
[root@nfs ~]# mkdir -m 700+ ~/.ssh
[root@nfs ~]# vim ~/.ssh/authorized_keys
:set nu	#(查看是否是一行)

#授权
[root@nfs ~]# chmod 600 .ssh/authorized_keys

#连接测试
[root@web01 ~]# ssh 172.16.1.31
Last failed login: Tue Aug 18 00:51:38 CST 2020 from 10.0.0.1 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Mon Aug 17 23:39:28 2020 from 172.16.1.7
[root@nfs ~]# 
2>方式二:命令推送公钥
# ssh-copy-id #
	#命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
	# ssh-copy-id -f root@10.0.0.7  #将公钥强制传到10.0.0.7
	
#命令推送公钥
[root@web01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
[root@web01 ~]#

#连接测试
[root@web01 ~]# ssh 172.16.1.41
Last login: Mon Aug 17 23:32:44 2020 from 10.0.0.1
[root@backup ~]#	

#不登录远程主机bash,但是可以对远端执行命令
[root@web01 ~]# ssh root@172.16.1.41 "hostname -I ; hostname"
10.0.0.41 172.16.1.41

# 公钥发送给普通用户 (普通用户有密)
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub gjs@172.16.1.7
[root@m01 ~]# ssh gjs@172.16.1.7	免密
[root@m01 ~]# ssh root@172.16.1.7	不免密

# 公钥发送给root用户 (普通用户有密)
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
[root@m01 ~]# ssh root@172.16.1.31	免密
[root@m01 ~]# ssh gjs@172.16.1.31	不免密

四、免密应用场景

#终端工具-->服务端	(直连)
Mac-->Linux		(x)
Xshell-->Linux
PowerShell-->Linux

#服务端-->服务端	(内网跳转)
shell-->Linux	(秘钥,脚本)
expect-->Linux	(非秘钥,脚本)
sshpass-->Linux	(非秘钥,命令)

1、SSH秘钥登陆

#生成秘钥
[root@m01 ~]# ssh-keygen
id_rsa.pub 公钥 ;id_rsa 私钥

1.手动方式
#管理端
[root@m01 ~]# cat .ssh/id_rsa.pub
#被管理端
[root@web01 ~]# vim .ssh/authorized_keys
[root@web01 ~]# chmod 700 .ssh/
[root@web01 ~]# chmod 600 .ssh/authorized_keys

2.命令方式:
#管理端
[root@m01 ~]# ssh-copy-id root@172.16.1.31
[root@m01 ~]# ssh-copy-id root@172.16.1.41

巡检脚本shell

#1.巡检脚本
[root@m01 ~]# vim xunjian.sh 
#!/bin/bash
ip='
7
31
41
'
for i in `echo $ip`;do
     echo "###############172.16.1.$i##############"
     ssh root@172.16.1.$i "$1"
done

#2.巡检脚本
[root@m01 ~]# cat all.sh 
#!/usr/bin/bash
[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1

for i in 31 41
do
    echo "#########172.16.1.$i#####"
    ssh root@172.16.1.$i "$1"
done

2、Xshell免密登录

实践场景,用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录。
实践多用户登陆一台服务器无密码
实践单用户登陆多台服务器免密码
Windows/MAC/Linux --> 跳板机 --> 服务器

1

1)Xshell免密登陆服务器

1.xshell --> 工具 --> 新建用户密钥生成向导
2.下一步 -->  生成公钥对
3.下一步 --> 用户密钥信息(给密钥起名字,加密码)
4.xshell --> 工具 --> 查看密钥用户管理者
5.密钥属性 --> 公钥
6.服务器m01切换到普通用户下创建~/.ssh目录
6.将公钥复制到服务器的.ssh目录下的authorized_keys文件
7.授权文件600

2)跳板机shell脚本

#!/bin/bash
#jumpserver
lb01=10.0.0.5
lb02=10.0.0.6
web01=10.0.0.7
web02=10.0.0.8
web03=10.0.0.9
nfs=10.0.0.31
backup=10.0.0.41
db01=10.0.0.51
m01=10.0.0.61
zabbix=10.0.0.71

menu(){
        cat <<-EOF
        +-------------------------+
        |     1) lb01             |
        |     2) lb02             |
        |     3) web01            |
        |     4) web02            |
        |     5) web03            |
        |     6) nfs              |
        |     7) backup           |
        |     8) db01             |
        |     9) m01              |
        |     10) zabbix          |
        |     h) help             |
        |     c) close             |
        +-------------------------+
EOF
}
#菜单函数
menu

#连接函数
connect(){
  ping -c 1 -w 1 $1 &>/dev/null
  if [ $? -eq 0 ];then
    ssh root@$1
  else
    echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m"
  fi
}

#控制不让输入ctrl+c,z
trap "" HUP INT TSTP
while true
do
    read -p "请输入要连接的主机编号:" num
    case $num in
            1|lb01)
              connect $lb01 lb01
                    ;;
            2|lb02)
              connect $lb02 lb02
                    ;;
            3|web01)
              connect $web01 web01
                    ;;
            4|web02)
              connect $web02 web02
                    ;;
            5|web03)
                  connect $web03 web03
                    ;;
            6|nfs)
              connect $nfs nfs
                    ;;
            7|backup)
                  connect $backup backup
                    ;;
            8|db01)
                   connect $db01 db01
                    ;;
            9|m01)
                    connect $m01 m01
                    ;;
            10|zabbix)
                    connect $zabbix zabbix
                    ;;
            h|help)
                    clear
                    menu
                    ;;
            c|close)
                    break
                    ;;
    esac
done

3)免交互expect

#密码内嵌在脚本,安全性一般
#安装expect
[root@m01 ~]# yum install -y expect

#编写脚本
[root@m01 ~]# vim xunjian.exp
#!/usr/bin/expect
set ip 10.0.0.31
set pass 1
set timeout 30
spawn ssh root@$ip
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "root@*"  {send "df -h\r"}
expect "root@*"  {send "exit\r"}
expect eof

4)免交互sshpass[扩展]

#会暴露密码在命令行,安全性很差
#安装sshpass
[root@m01 ~]# yum install -y sshpass
[root@m01 ~]# sshpass -p 1 ssh root@10.0.0.31
[option]
-p:指定密码
-f:从文件中取密码
-e:从环境变量中取密码
-P:设置密码提示

#当连接不上时,可能是因为没有主机信息文件,则加入ssh免交互参数
[root@m01 ~]# sshpass -p 1 ssh -o StrictHostKeyChecking=no root@10.0.0.31

3、Xshell的ssh安全优化

1)优化内容

SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。
1.更改远程连接登陆的端口
2.禁止ROOT管理员直接登录
3.密码认证方式改为密钥认证
4.重要服务不使用公网IP地址
5.使用防火墙限制来源IP地址

#Xshell秘钥-->m01-->web..
1.xshell --> 工具 --> 新建用户密钥生成向导
2.下一步 -->  生成公钥对
3.下一步 --> 用户密钥信息(给密钥起名字,加密码)
4.xshell --> 工具 --> 查看密钥用户管理者
5.密钥属性 --> 公钥
6.服务器m01切换到普通用户下创建~/.ssh目录
6.将公钥复制到服务器的.ssh目录下的authorized_keys文件
7.授权文件600

2)vim手动修改配置

[root@m01 ~]# vim /etc/ssh/sshd_config
#修改ssh端口
17:#Port 22 --> Port 2222

#禁止使用root登录服务器
38:#PermitRootLogin yes --> PermitRootLogin no

#禁止使用密码登录服务器
65:PasswordAuthentication yes --> PasswordAuthentication no

#禁止GSS认证,减少连接时产生的延迟
79:GSSAPIAuthentication yes --> GSSAPIAuthentication no

#禁止ssh进行DNS反向解析,影响ssh连接效率参数
115:#UseDNS yes --> UseDNS no

[root@m01 ~]# systemctl restart sshd

3.脚本修改配置

[root@m01 ~]# vim /scripts/safety.sh 
#!/bin/bash
FILE=/etc/ssh/sshd_config

# 修改ssh端口
sed -i 's/#Port 22/Port 2222/g' $FILE

# 禁止使用root登录服务器
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' $FILE

# 禁止使用密码登录服务器
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/g' $FILE

# 禁止GSS认证,减少连接时产生的延迟
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' $FILE

# 禁止ssh进行DNS反向解析,影响ssh连接效率参数
sed -i 's/#UseDNS yes/UseDNS no/g' $FILE

sed -n '17p;38p;65p;79p;115p' $FILE

systemctl restart sshd
[root@m01 ~]# sh /scripts/safety.sh

4)Xshell属性配置

#跳板机属性配置
连接 --> 与sshd开放端口一致
用户身份验证 --> 方法:Public Key
			   用户名:gjs(发送给秘钥的用户)
			   用户秘钥:创建的秘钥名称
			   密码:秘钥密码

#其他服务器
复制跳板机修改名称
登录脚本 --> 勾选:执行以下等待并发送规则
		    添加:~]$	su -
		    	Password: 密码
		    	~]#	ssh 172.16.1.7

选项 配置名 修改
连接 端口 sshd修改后的端口
用户身份验证 方法 Public Key
用户名 gjs(拥有秘钥的用户)
用户秘钥 创建的秘钥名称
密码 秘钥密码
登录脚本 等待 输入
执行以下等待.. 勾选
脚本框 Expect Send
~]$ su -
Password: root的密码
~]# ssh 172.16.1.7(ip)

五、PowerShell登录

#创建秘钥
PS C:\Users\win10> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\win10/.ssh/id_rsa):
C:\Users\win10/.ssh/id_rsa already exists.
Overwrite (y/n)?
PS C:\Users\win10> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\win10/.ssh/id_rsa):
C:\Users\win10/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\win10/.ssh/id_rsa.
Your public key has been saved in C:\Users\win10/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:M6biU3ij4QzHyZupxmb7Pgwh4HjtqJDbhjuhh+GX4eY win10@DESKTOP-0NG908I
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|.                |
|+  .             |
|o.o .            |
| + * o  S        |
|= +.O +o o       |
|+X.B+O..         |
|B.O*@.           |
|.O*E+o           |
+----[SHA256]-----+

#取出公钥内容
C:\Users\win10/.ssh/id_rsa.pub
[gjs@m01 ~]$ vim .ssh/authorized_keys
:set nu 
:wq
#连接
PS C:\Users\win10> ssh gjs@10.0.0.61 -p 2222
Last login: Wed Aug 19 09:17:59 2020 from 10.0.0.1
Last login: Wed Aug 19 09:17:59 2020 from 10.0.0.1
[gjs@m01 ~]$
posted @ 2020-08-19 10:48  雪小松  阅读(347)  评论(0编辑  收藏  举报