5.SSH远程服务

1. SSH基本概述

SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输,确保了数据传输安全,那ssh服务主要功能有哪些呢?
1.提供远程连接服务器的服务;
2.对传输的数据进行加密


1.1 SSH与telnet

那么除了SSH协议能提供远程连接服务,Telnet也能提供远程连接服务,那么分别是什么呢?
ssh服务会对传输数据进行加密,监听在本地22/tcp端口,ssh服务默认支持root用户登录;
Telnet服务不对数据进行加密,监听在本地23/tcp端口,Telnet默认不支持root用户登录;

服务器连接方式 服务数据传输 服务监听端口 服务登录用户
ssh 加密 22/tcp 默认支持root<用户登录
telnet 明文 23/tcp 默认不支持root用户登录
ftp         dns         ssh         telnet       mysql      http        https
tcp/20      tcp/53      tcp/22      tcp/23      tcp/3306    tcp/80      tcp/443
tcp/21      udp/53

案例:使用wireshark验证telnet明文传输与ssh加密传输

1.1.1 安装telnet服务并运行

[root@web01 ~]# yum install -y telnet-server
[root@web01 ~]# systemctl start telnet.socket

1.1.2 使用wireshark检测vmnet8网卡上telnet的流量

-c

1.1.3 telnet无法使用root用户登录Linux系统,需要创建普通用户

[root@web01 ~]# useradd oldboy
[root@web01 ~]# echo '1' | passwd --stdin oldboy
Changing password for user oldboy.
passwd: all authentication tokens updated successfully.

1.1.4 telnet使用普通用户连接Linux系统

[d:\~]$ telnet 10.0.0.7


Connecting to 10.0.0.7:23...
Connection established.
To escape to local shell, press Ctrl+Alt+].

Kernel 3.10.0-957.el7.x86_64 on an x86_64
web01 login: root
Password: 
Login incorrect

web01 login: oldboy
Password: 
Last login: Fri Jul 26 09:52:55 from ::ffff:10.0.0.1
[oldboy@web01 ~]$

-c

1.1.5 使用wireshark搜索包含telnet的相关流量

-c

-c

-c

1.1.6. ssh连接Linux系统

-c

1.1.7. 使用wireshark搜索包含ssh的相关流量

-c

-c

2. SSH相关命令

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

2.1 ssh远程登录服务器命令示例

[root@web01 ~]# ssh -p22 root@10.0.0.41
root@10.0.0.41's password: 
Last login: Fri Jul 26 10:53:10 2019 from 10.0.0.7
[root@backup ~]# 

# -p 指定连接远程主机的端口,默认22端口可省略
# root@10.0.0.41
# “@”前面为用户,如果当前用户连接可以不指定用户
# “@”后面为要连接的服务器ip

2.2 scp复制数据至远程主机命令(全量复制)

scp  与  rsync远程传输方式类似
覆盖式 增量  

# -P 指定端口,默认22端口可不写
# -r 表示递归拷贝目录
# -p 表示在拷贝文件前后保持文件或目录属性不变
# -l 限制传输使用带宽(默认kb) /8 ->KB  /1024  ->MB

#拉、下载:将远程172.16.1.31服务器/etc/exports文件拉取到本地/data目录
[root@web01 data]# scp -P22 -rp root@172.16.1.31:/etc/exports /data/
root@172.16.1.31's password: 
exports                                      100%   64    41.0KB/s   00:00    
[root@web01 data]#

#推、上传:将本地/data/exports文件推送至远程服务器172.16.1.31的/data目录
[root@web01 data]# scp -P22 -rp /data/exports root@172.16.1.31:/data/
root@172.16.1.31's password: 
exports                                      100%   64    28.6KB/s   00:00    
[root@web01 data]#

#限速
[root@web01 data]# dd if=/dev/zero of=/data/1.txt bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 3.16385 s, 166 MB/s
[root@web01 data]# ll -h /data/
total 501M
-rw-r--r-- 1 root root 500M Jul 26 14:23 1.txt
-rw-r--r-- 1 root root   64 Jul 23 17:01 exports
[root@web01 data]# scp /data/1.txt root@172.16.1.31:/tmp
root@172.16.1.31's password: 
1.txt                                                    91%  455MB  53.2MB/s   00:00 E1.txt                                                   100%  500MB  50.0MB/s   00:10   
[root@web01 data]#
#限速为8096,换算为MB,8096/8=1024k=1M
[root@web01 data]# scp -l 8096 /data/1.txt root@172.16.1.31:/tmp
root@172.16.1.31's password: 
1.txt                                                 13%   68MB   1.0MB/s   07:14 ETA
[root@web01 data]#

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

2.3 Sftp远程数据传输命令

2.3.1 默认可以通过sftp命令连接sftp服务

[root@web01 data]# sftp root@10.0.0.31
root@10.0.0.31's password: 
Connected to 10.0.0.31.
sftp>

2.3.2 查看本台服务器路径(命令前加l)

[root@web01 data]# sftp root@10.0.0.31
root@10.0.0.31's password: 
Connected to 10.0.0.31.
sftp>
sftp> lpwd
Local working directory: /data
sftp> lls
sftp>

2.3.3 查看远程服务器路径[默认用户家目录]

[root@web01 data]# sftp root@10.0.0.31
root@10.0.0.31's password: 
Connected to 10.0.0.31.
sftp>
sftp> pwd
Remote working directory: /data
sftp> ls
exports  
sftp>

2.3.4 sftp使用get下载文件至本地服务器

格式为:get 远程机器路径 当前机器路径
sftp> get /data/exports /data/
Fetching /data/exports to /data/exports
/data/exports                                        100%   64     8.5KB/s   00:00    
sftp> lls
exports
sftp> 

2.3.5 sftp使用put上传文件至远程服务器

格式为:put 当前机器路径 远程机器路径
sftp> put /data/put.txt /data/
Uploading /data/put.txt to /data/put.txt
/data/put.txt                                        100%    0     0.0KB/s   00:00    
sftp> ls
exports  put.txt  
sftp>

3. SSH验证方式

3.1 基于账号密码远程登录

[root@web01 ~]# ssh root@172.16.1.61
The authenticity of host '172.16.1.61 (172.16.1.61)' can't be established.
ECDSA key fingerprint is SHA256:5BsWOqUTowAsb7pKpfPSX3D/aENFyhCY/m2NJG9Q3Bo.
ECDSA key fingerprint is MD5:7b:4a:5f:92:07:9b:c4:c4:aa:65:9d:e2:68:11:f4:1d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.61' (ECDSA) to the list of known hosts.
root@172.16.1.61's password: 
Last login: Fri Jul 26 15:39:03 2019 from 10.0.0.1
[root@m01 ~]#

3.2 基于秘钥远程登录

通过SSH协议,用户可以通过终端机访问和使用远程linux服务器,ssh的端口为22。但每次进行连接都要输入密码。如果管理几台到十几台集群,那可以应付的的过来。如果集群增加了几百,上千台。那么使用SSH管理起来就不方便了。
默认情况下,通过ssh客户端命令登录远程服务器,需要提供远程系统上的账号密码,但为了降低密码泄露的几率和提高登录的方便性,建议使用秘钥验证方式。

-c

3.2.1 在服务器上生成非对称秘钥

# -t  指定秘钥类型
# -C  指定用户邮箱
[root@m01 ~]# ssh-keygen -C linhaoda0225@sina.com
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
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:
SHA256:nxa7encEsG4V6vNDcBB6qn5A3VunbGJRUCKBz231ZQE linhaoda0225@sina.com
The key's randomart image is:
+---[RSA 2048]----+
|       .o.++.E...|
|      .  oo.+   o|
|       +.o.B o o |
|      . +oO = o  |
|     .  S+.O +   |
|      .. .O+= .  |
|      .. o=* .   |
|     .  ....+ .  |
|      ...o.. o   |
+----[SHA256]-----+
[root@m01 ~]# ll .ssh/
total 8
-rw------- 1 root root 1679 Jul 26 16:28 id_rsa
-rw-r--r-- 1 root root  403 Jul 26 16:28 id_rsa.pub
[root@m01 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/gfWoiOd30VGftSp8YIqNqweUClvUI7dGw4Is/VxPdlndseoAFAsjVRDyQ84kdSgddy2vII0rjnWd1ILWOvMl7YJU2G1UO4hbhL9X14dq+XBibwQ/Chb2JDMJSMKRi1jVJyQPUgAnpYW2n5qIdmk0CVxLBo7HX53IO0j86WY6XsKMsA57UwpaH9oK9sXiH/SRhK6z/Y5FI9EVU35GCiDgHu6vk0uksIPwqE9e8Zw+S6xrYJ6RmHKYGwSNqRB1UKfIUQI3pQZz8ieyw7O9i5fzMNValL/U6j7LoGYNbJXvdL4IWVgHvgR7EqALC3pGTAeUiQ5YNGvgKm9yd3fA0C1f linhaoda0225@sina.com
[root@m01 ~]#

3.2.2 将公钥推送到你需要连接的主机,第一次需要输入对端主机的密码

命令格式:
ssh-copy-id [-i [传输的文件]] [user]@传输的位置

[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/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@172.16.1.31's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.16.1.31'"
and check to make sure that only the key(s) you wanted were added.

[root@m01 ~]#

3.2.3 通过ssh命令测试连接是否需要密码

[root@m01 ~]# ssh 172.16.1.31
Last login: Fri Jul 26 16:35:35 2019 from 172.16.1.61
[root@nfs ~]#

4. SSH场景实践

实践场景:用户通过Windows/Mac/Linux客户端连接跳板机免密登录,跳板机连接后无外网的Linux主机免密登录,架构图如下:
实践多用户登录一台服务器无密码
实践用户登录多台服务器免密码

-c

4.1 windows客户端免密登录

4.1.1 xshell-->选择工具-->新建秘钥生成工具

-c

4.1.2 生成公钥对

-c

-c

4.1.3 填写秘钥名称,秘钥加密的密码不建议配置

-c

-c

4.1.4 生成秘钥后,点击xshell-->工具-->用户秘钥管理者-->选择对应秘钥属性

-c

4.1.5 选择对应的公钥,将其复制

-c

4.1.6 将复制的公钥粘贴至跳板机 ~/.ssh/authorized_keys中,然后测试

[root@mumu ~]# pwd
/root
[root@mumu ~]# cat .ssh/authorized_keys 
####windows
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3trkdOykPQ2dgImPPuTgxjPjQ3cqi7OeO0ZuXTKT2e4MtOxrpeMS442jQvG5UIMUiKp2z1h2L60PbIHjmwLEKABXIg8/K3z7fW1UXEm6DL/yL2GJYCuDH7fLRfsd6XAEP2HXsyMiAMqfBdCh3AHRf4lEW4yeabz2HikPJ7JrKYkFOI97pBX9MidMSbCEmgpfiDmDgTpocHlD1MYmDCYysdH1WwgW7vOztLAIpTJBGdIrz0jE2LuHQa6OE+i3gYDerzIWuWPgWnha7P4v+ga5GEcILv+CyABJDxjl1PH9yv7TUGfz1CnmsQtgaODiFVZ1RgP0v9NCKuYC0xSL7GGBmw==
[root@mumu ~]# 

4.2 跳板机下发公钥至后端主机

4.2.1 在跳板机上生成秘钥对

[root@m01 ~]# ssh-keygen -t rsa -C linhaoda0225@sina.com
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:
SHA256:fD8UODgDJSh8LWFTaGryYaysDjL+B/rpKhoQqOC2l8Q linhaoda0225@sina.com
The key's randomart image is:
+---[RSA 2048]----+
| .  +*+..        |
|. o.*..o . .     |
|+. = .  + o .    |
|=.B    . o . .   |
|+O E    S . .    |
|+.+..    . o     |
|*..o.       o    |
|*+. ..       .   |
|=+==.            |
+----[SHA256]-----+
[root@m01 ~]#

4.2.2 拷贝跳板机上的秘钥至后端主机,如果ssh不是默认的22端口,使用-p指定对应端口

[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.31

[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.41

4.2.3 在跳板机上测试是否能免密登录两台服务器

[root@m01 ~]# ssh root@172.16.1.41
Last login: Mon Jul 29 08:25:26 2019 from 10.0.0.1
[root@backup ~]# exit
logout
Connection to 172.16.1.41 closed.

[root@m01 ~]# ssh root@172.16.1.31
Last login: Mon Jul 29 08:25:25 2019 from 10.0.0.1
[root@nfs ~]# exit
logout
Connection to 172.16.1.31 closed.
[root@m01 ~]#

4.2.4 测试scp是否免密

[root@m01 ~]# scp anaconda-ks.cfg root@172.16.1.31:/tmp/
anaconda-ks.cfg                                  100% 1444     1.5MB/s   00:00    
[root@m01 ~]# 

4.2.5 通过跳板机获取所有机器的load、CPU、memory等信息

[root@m01 ~]# cat test.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 "$i"
done
[root@m01 ~]#
[root@m01 ~]# ssh root@172.16.1.31 "ifconfig eth0"
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.31  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe52:a35a  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:52:a3:5a  txqueuelen 1000  (Ethernet)
        RX packets 1392  bytes 107036 (104.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 335  bytes 30526 (29.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5. SSH安全优化

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

SSH服务登录防护需进行如下配置调整,先对如下参数进行了解

Port 9292                       # 变更SSH服务远程连接端口
PermitRootLogin         no      # 禁止root用户直接远程登录
PasswordAuthentication  no      # 禁止使用密码直接远程登录
UseDNS                  no      # 禁止ssh进行dns反向解析,影响ssh连接效率参数
GSSAPIAuthentication    no      # 禁止GSS认证,减少连接时产生的延迟

posted @ 2019-08-30 17:05  _︶"  阅读(624)  评论(0编辑  收藏  举报