SSH遠程管理服務實戰
1.SSH基本概述
SSH是一個安全協議,在進行數據傳輸時,會對數據包進行加密處理,加密后在進行數據傳輸。確保了數據傳輸安全。那SSH服務主要功能有哪些呢?
1.提供遠程連接服務器的服務2.對傳輸的數據進行加密
那么除了SSH協議能提供遠程連接服務,Telnet也能提供遠程連接服務, 那么分別的區別是什么呢?ssh服務會對傳輸數據進行加密, 監聽在本地22/tcp端口, ssh服務默認支持root用戶登錄telnet服務不對數據進行加密, 監聽在本地23/tcp端口, Telnet默認不支持root用戶登錄
Linux遠程鏈接:ssh協議(加密) telnet(明文)
windows遠程連接:RDP協議 (remote desktop)
協議 | 端口 |
---|---|
ssh | 22 |
telnet | 23 |
RDP | 3389 |
http | 80 |
https | 443 |
FTP | 20 21 |
POP3 | 110 |
MySQL | 3306 |
Rsync | 873 |
DNS | 53 |
案例: 使用wireshark驗證telnet明文傳輸與ssh加密傳輸
1.安裝telnet服務並運行
[root@m01 ~]# yum install telnet-server -y
[root@m01 ~]# systemctl start telnet.socket
2.使用wireshark檢測vmnet8網卡上telnet的流量
3.telnet是無法使用root用戶登錄Linux系統,需要創建普通用戶
[root@m01 ~]# useradd zls
[root@m01 ~]# echo "1"| passwd --stdin zls
4.使用普通用戶進行telnet登錄
5.搜索wireshark包含telnet相關的流量

6.使用wireshark分析ssh流量
2.SSH相關命令
*SSH有客戶端與服務端,我們將這種模式稱為C/S架構,ssh客戶端支持Windows、Linux、Mac等平台。在ssh客戶端中包含 ssh|slogin遠程登陸、scp遠程拷貝、sftp文件傳輸、ssh-copy-id秘鑰分發等應用程序。
[root@m01 ~]# ssh root@10.0.0.41
ssh:客戶端命令
root:系統用戶名
@:分割用戶和主機
10.0.0.41:主機的IP(可以是公網也可以是內網)
3.Xshell連接不上虛擬機
1.檢查網絡
#連誰ping誰
ping 10.0.0.41
tcping 10.0.0.41 22
2.檢查端口
telnet 10.0.0.41 22
tcping 10.0.0.41 22
3.如果可以ping通,端口不通
#檢測sshd服務是否啟動
netstat -lntup|grep 22
#防火牆 selinux
systemctl stop firewalld
setenforce 0
4.scp命令
# -P 指定端口,默認22端口可不寫
# -r 表示遞歸拷貝目錄
# -p 表示在拷貝文件前后保持文件或目錄屬性不變
# -l 限制傳輸使用帶寬(默認kb)
#推:將本地/tmp/oldboy推送至遠端服務器10.0.0.31的/tmp目錄,使用對端的root用戶
[root@m01 ~]# scp -P22 -rp /tmp/oldboy root@10.0.0.31:/tmp
#拉:將遠程10.0.0.31服務器/tmp/oldboy文件拉取到本地/opt/目錄下
[root@m01 ~]# scp -P22 -rp root@10.0.0.31:/tmp/oldboy /opt/
#限速
[root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31 password:
test 100% 656MB '83.9MB/s' 00:07
#限速為8096kb,換算為MB,要除以 8096/8=1024KB=1MB
[root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp
root@172.16.1.31s password:
test 7% 48MB '1.0MB/s' 09:45
結論:
1.scp通過ssh協議加密方式進行文件或目錄拷貝。
2.scp連接時的用戶作為為拷貝文件或目錄的權限。
3.scp支持數據推送和拉取,每次都是全量拷貝,效率較低。
5.sftp命令
#默認可以通過sftp命令連接sftp服務
sftp root@10.0.0.61
sftp -oPort=52113 root@10.0.0.61 #sftp的特殊端口連接
# sftp使用get下載文件至於本地服務器
sftp> get conf.txt /tmp/
# sftp使用put上傳本地服務器文件至遠程服務器
sftp> put /root/t1.txt /root/
6.SSH驗證方式
1.基於賬戶密碼遠程登錄
知道服務器的IP端口,賬號密碼,即可通過ssh客戶端命令登陸遠程主機。
[root@m01 ~]# ssh -p22 root@10.0.0.61
root@10.0.0.61 password:
2.基於秘鑰遠程登錄
默認情況下,通過ssh客戶端命令登陸遠程服務器,需要提供遠程系統上的帳號與密碼,但為了降低密碼泄露的機率和提高登陸的方便性,建議使用密鑰驗證方式。
1.在服務器上生成非對稱密鑰,使用-t指定密鑰類型, 使用-C指定用戶郵箱
[root@m01 ~]# ssh-keygen -t rsa -C 861962063@qq.com
...
#默認一路回車即可
...
或者簡單的方法,不加參數:
[root@m01 ~]# 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:
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:P6UswOccoZSLunZ0gekcQ/gDzhFNkH/+I1WHhtwQro8 root@m01
The key's randomart image is:
+---[RSA 2048]----+
| oB. .. |
| = o o. |
| o * oo.o+ . |
| o O+o+o.= . |
| o.**.So .. |
| .+ oB.+ o |
| .. .Eo= = |
| ... . o. . |
| ... . . |
+----[SHA256]-----+
[root@m01 ~]# ll .ssh/
total 8
-rw------- 1 root root 1679 Aug 8 19:07 id_rsa #私鑰(寶塔鎮河妖)
-rw-r--r-- 1 root root 390 Aug 8 19:07 id_rsa.pub #公鑰(天王蓋地虎)
2.將A服務器上的公鑰推送至B服務器
方式一(手動):
#在要連接的服務器上家目錄下創建.ssh目錄(用哪個用戶連,就創建在哪個家目錄下)
[root@backup ~]# mkdir /root/.ssh
#授權700
[root@backup ~]# chmod 700 /root/.ssh
#在m01上查看公鑰文件內容
[root@m01 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuxyeePaQr6cI6KMINgW7262dDdfgiiwspNjKYEoEj7cfjpMBPBCpqTO4H5+E8U/GcxsFcj2S2fHlRevPMa8vXYqOvX3O0Xp/C9zNMJrNdT+NdpCnDHRpsF4/Egr0xxKju7LPC1qz/Gu6ksx1VqUmcX2RKrQdV2BYi+pqu/2SQYOUUjKpen0zWxnhjuVmZMV+hPHgs4ILbGwwmYxqY+ldvP0guviQ2CeK1JtQIbP2Q5bBSlMwPxr4P303LUkIBsI3pHRoCMnDT0YI9x9JjdRkkUNjeFoTAE4APsTgICd6nzRBfRRf/VOYk5REuub367yxrOZpfNXOcJ6QCRLYQl6Xn root@m01
#創建公鑰文件authorized_keys
[root@backup ~]# vim ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDuxyeePaQr6cI6KMINgW7262dDdfgiiwspNjKYEoEj7cfjpMBPBCpqTO4H5+E8U/GcxsFcj2S2fHlRevPMa8vXYqOvX3O0Xp/C9zNMJrNdT+NdpCnDHRpsF4/Egr0xxKju7LPC1qz/Gu6ksx1VqUmcX2RKrQdV2BYi+pqu/2SQYOUUjKpen0zWxnhjuVmZMV+hPHgs4ILbGwwmYxqY+ldvP0guviQ2CeK1JtQIbP2Q5bBSlMwPxr4P303LUkIBsI3pHRoCMnDT0YI9x9JjdRkkUNjeFoTAE4APsTgICd6nzRBfRRf/VOYk5REuub367yxrOZpfNXOcJ6QCRLYQl6Xn root@m01
#授權600
[root@backup ~]# chmod 600 ~/.ssh/authorized_keys
方式2:
方式二:
#使用命令推送公鑰
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
---->yes--->密碼
#命令示例: ssh-copy-id [-i [identity_file]] [user@]machine
ssh-copy-id #命令
-i #指定下發公鑰的路徑
[user@] #以什么用戶身份進行公鑰分發(root),如果不輸入,表示以當前系統用戶身份分發公鑰
machine #下發公鑰至那台服務器, 填寫遠程主機IP地址
#分發秘鑰,[將A服務器的公鑰寫入B服務器~/.ssh/authorized_keys文件中]
[root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
3.A服務器連接B服務器是無需密碼的,如果能直接連接無需密碼則表示秘鑰已配置成功
#遠程登錄對端主機方式
[root@m01 ~]# ssh root@172.16.1.41
#不登陸遠程主機bash,但可在對端主機執行命令
[root@m01 ~]# ssh root@172.16.1.41 "hostname -i"
172.16.1.41
7.SSH場景實踐
實踐場景,用戶通過Windows/MAC/Linux客戶端連接跳板機免密碼登錄,跳板機連接后端無外網的Linux主機實現免密登錄,架構圖如下。實踐多用戶登陸一台服務器無密碼實踐單用戶登陸多台服務器免密碼
1.windows客戶端使用Xshell生成秘鑰對,並下發公鑰至跳板機
1) Xshell-->選擇工具->新建密鑰生成工具

2) 生成公鑰對,選擇下一步

3) 填寫秘鑰名稱。秘鑰增加密碼則不建議配置

4) Windows會提示密碼,繼續即可

5) 生成秘鑰后,點擊Xshell->工具->用戶秘鑰管理者->選擇對應秘鑰的屬性

6) 選擇對應秘鑰的公鑰,將其復制

7) 將從WIndows下復制好的公鑰粘貼至跳板機~/.ssh/authorized_keys中,然后測試
[root@m01 ~]# cd ; umask 077; mkdir -p .ssh ;cd .ssh
[root@m01 .ssh]# vim authorized_keys #添加windows公鑰
2.跳板機下發公鑰至后端主機
1) 在跳板機上生成秘鑰對
[root@m01 ~]# ssh-keygen -t rsa -C 861962063@qq.com
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
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.7
3) 在m01管理機上測試是否成功登陸兩台服務器
[root@m01 ~]# ssh root@172.16.1.41
[root@nfs01 ~]# exit
[root@m01 ~]# ssh root@1172.16.1.31
[root@backup ~]# exit
3.通過跳板機能實現scp拷貝文件免密碼
[root@m01 ~]# scp zls.txt root@172.16.1.31:/tmp
zls.txt 100% 0 0.0KB/s 00:00
[root@m01 ~]# scp zls.txt root@172.16.1.41:/tmp
zls.txt 100% 0 0.0KB/s 00:00
4.通過跳板機獲取所有機器的load,CPU,Memory等信息(思考:如果服務器數量多,如何並發查看和分發數據)
[root@m01 ~]# cat all.sh
#!/usr/bin/bash
[ $# -ne 1 ] && echo "請輸入執行的命令" && exit 1
for i in 31 41 7
do
echo "#########172.16.1.$i#####"
ssh root@172.16.1.$i "$1"
done
[root@m01 ~]# sh all.sh "free -m" (執行free -m 命令)
5.腳本實現(跳板機)
#!/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 |
+-------------------------+
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
;;
close)
break
;;
esac
done
2.簡單的腳本測試
#!/bin/bash
read -p "請輸入ip地址或者主機名" name
case "$name" in
41|backup)
ssh 172.16.1.41;;
31|nfs)
ssh 172.16.1.32;;
7|web01)
ssh 172.16.1.7;;
*)
echo "input error"
esac
8.SH安全優化
SSH作為遠程連接服務,通常我們需要考慮到該服務的安全,所以需要對該服務進行安全方面的配置。1.更改遠程連接登陸的端口2.禁止ROOT管理員直接登錄3.密碼認證方式改為密鑰認證4.重要服務不使用公網IP地址5.使用防火牆限制來源IP地址
SSH服務登錄防護需進行如下配置調整,先對如下參數進行了解
Port 6666 # 變更SSH服務遠程連接端口
PermitRootLogin no # 禁止root用戶直接遠程登錄
PasswordAuthentication no # 禁止使用密碼直接遠程登錄
UseDNS no # 禁止ssh進行dns反向解析,影響ssh連接效率參數
GSSAPIAuthentication no # 禁止GSS認證,減少連接時產生的延遲
將如下具體配置添加至/etc/ssh/sshd_config文件中,參數需根據實際情況進行調整
###SSH###
#Port 6666
#PasswordAuthentication no
#PermitRootLogin no
GSSAPIAuthentication no
UseDNS no
###END###
2.重啟sshd服務
[root@m01 ~]# systemctl restart sshd
3.復制一個‘m01-副本’ 回話,會顯示拒絕登陸
4.回到m01,建立普通用戶,並重新生成密鑰文件
[root@m01 ~]# useradd gjy
5.切換到普通用戶,編輯密鑰文件,重啟服務
[root@m01 ~]# su - gjy
[gjy@m01 ~]$ ssh-keygen
[gjy@m01 ~]$ vim ~/.ssh/authorized_keys
[gjy@m01 .ssh]$ chmod 600 authorized_keys
[gjy@m01 .ssh]$ systemctl restart sshd
6.xshell m01 副本會話
7.修改好即可登陸
9.交互expect[擴展]
1.安裝expect
[root@m01 ~]# yum install -y expect
2.編寫expect腳本
#!/usr/bin/expect
set ip 10.0.0.51
set pass 123456
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
10.免交互sshpass[擴展]
1.安裝sshpass
[root@m01 ~]# yum install -y sshpass
2.使用sshpass命令
[root@m01 ~]# sshpass -p 123456 ssh root@10.0.0.51
[option]
-p:指定密碼
-f:從文件中取密碼
-e:從環境變量中取密碼
-P:設置密碼提示