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的流量
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 ~]$
1.1.5 使用wireshark搜索包含telnet的相关流量
1.1.6. ssh连接Linux系统
1.1.7. 使用wireshark搜索包含ssh的相关流量
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客户端命令登录远程服务器,需要提供远程系统上的账号密码,但为了降低密码泄露的几率和提高登录的方便性,建议使用秘钥验证方式。
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主机免密登录,架构图如下:
实践多用户登录一台服务器无密码
实践用户登录多台服务器免密码
4.1 windows客户端免密登录
4.1.1 xshell-->选择工具-->新建秘钥生成工具
4.1.2 生成公钥对
4.1.3 填写秘钥名称,秘钥加密的密码不建议配置
4.1.4 生成秘钥后,点击xshell-->工具-->用户秘钥管理者-->选择对应秘钥属性
4.1.5 选择对应的公钥,将其复制
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认证,减少连接时产生的延迟