SSH遠端連線
阿新 • • 發佈:2022-05-24
目錄
SSH遠端管理
一、SSH基本概念
1.什麼是ssh
SSH是一個安全協議,在進行資料傳輸時,會對資料包進行加密處理,加密後在進行資料傳輸。確保了資料傳輸安全遠端連線的型別:
Linux:
- ssh 埠:22
- telnet 埠:23
windows
- rdp 埠:3389
2.SSH與Telnet區別
服務連線方式 | 服務資料傳輸 | 服務監聽埠 | 服務登入使用者 |
---|---|---|---|
ssh | 加密 | 22/tcp | 預設支援root使用者登入 |
telnet | 明文 | 23/tcp | 不支援root使用者登入 |
3.抓包演示
SSH資料加密傳輸
Telnet資料明文傳輸
二、ssh相關命令及選項
## 注意:不加使用者@,預設使用當前登入的使用者 ssh:遠端連線Linux伺服器 -p:port指定埠 ## 不連線上伺服器,直接執行命令 ssh [email protected] 'ls /' scp:遠端拷貝資料(寫在前面的是原始檔) -r:遞迴(遠端拷貝目錄) -p:拷貝的時候保持屬性 -P:指定埠 推:scp sersync2.5.4 [email protected]:/root 拉:scp [email protected]:/root/sersync2.5.4 /opt [root@backup ~]# scp -P 22 [email protected]:/root/sersync2.5.4.tar.gz # 結論: 1.scp通過ssh協議加密方式進行檔案或目錄拷貝。 2.scp連線時的使用者作為為拷貝檔案或目錄的許可權。(-p保持檔案屬性) 3.scp支援資料推送和拉取,每次都是全量拷貝,效率較低。
三、ssh免密連線
ssh祕鑰對認證流程
#### ssh-keygen:生成金鑰對 [root@m01 ~]# ssh-keygen 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:3jXcLjP2VzFk55xY7lYGdohVQSSxxBJLDJE9MJIUWbU root@m01 The key's randomart image is: +---[RSA 2048]----+ | .+=*O+o*=*o| | o..o==.*+o| | Eoo*=o| | . o ==| | S + o.+| | . . . o o.| | . . = o .| | . = .| | .. | +----[SHA256]-----+ ## 生成後的金鑰對 [root@m01 ~]# ll /root/.ssh/ -rw------- 1 root root 1679 May 23 11:29 id_rsa -rw-r--r-- 1 root root 390 May 23 11:29 id_rsa.pub #### ssh-copy-id:傳送公鑰 -i:指定公鑰位置 [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] #### .ssh目錄中的know_host作用 [root@m01 ~]# cat ~/.ssh/known_hosts 記錄連線過的伺服器,如果沒有連線過(第一次連線),需要輸入yes #### 生成金鑰對命令:ssh-keygen 1.在當前使用者的家目錄下建立了一個隱藏目錄 .ssh mkdir ~/.ssh 2.將金鑰對存放目錄 .ssh 授權為 700 chmod 700 ~/.ssh 3.將公鑰內容寫入 ~/.ssh/id_rsa.pub 檔案中 4.將私鑰內容寫入 ~/.ssh/id_rsa 檔案中 5.將私鑰檔案授權為 600 chmod 600 ~/.ssh/id_rsa #### 傳送公鑰:ssh-copy-id [root@web01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] 輸入yes 輸入密碼:1 1.在遠端的指定使用者的家目錄下建立了一個隱藏目錄.ssh ssh [email protected] 'mkdir ~/.ssh' 2.將金鑰對存放目錄 .ssh 授權為 700 ssh [email protected] 'chmod 700 ~/.ssh' 3.先在遠端~/.ssh目錄下建立檔案authorized_keys ssh [email protected] 'touch ~/.ssh/authorized_keys' 4.將authorized_keys檔案授權為600 ssh [email protected] 'chmod 600 ~/.ssh/authorized_keys' 5.將公鑰內容,儲存到authorized_keys檔案中 ssh [email protected] 'echo ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgW5rliyT3oan+r4aXuOj0D0fLEFSGNJXZd5JMDYWX2pWhC5kITeVS66+EvXM 5OvqFfr40IQcMrZym0DXk7Zqf8brgWoqxR8AZR9tqAFwV3qTb9T/QB95OM16Y+N14oUOvWCzB9rQo54QU/INPgfhaRy Sk4YOgv+oL2aXdD6qbIGAikPzayvh9hWFjvy/LeFUGLheYYlYTqVM7WgeNrTlmbpjG4QO/IYe/xWESbt20l70yTIrD/ XWSZ2lsxSWQf0KXERhshRGhNkJF87hhS2cJozOHjzhjaPjDvgycjpYajQWf4gERe3sTL9fji/bhf8bZ3dCLp4uK/e5P 6CRpgo9V root@web01' >> ~/.ssh/authorized_keys'
免密使用場景
1.批量檢視伺服器資訊
#!/bin/bash
[ $# -ne 1 ] && echo "請輸入執行的命令" && exit 1
for i in 5 7 8 31 41
do
echo "#########172.16.1.$i#####"
ssh [email protected].$i "$1"
done
2.跳板機
[root@m01 ~]# cat jump.sh
#!/bin/bash
#jumpserver
lb01=172.16.1.5
lb02=172.16.1.6
web01=172.16.1.7
web02=172.16.1.8
web03=172.16.1.9
nfs=172.16.1.31
backup=172.16.1.41
db01=172.16.1.51
m01=172.16.1.61
zabbix=172.16.1.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
四、SSH安全優化
## ssh配置檔案
[root@m01 ~]# vim /etc/ssh/sshd_config
17 Port 52022 # 修改預設埠
115 UseDNS no # 關閉反向解析
38 PermitRootLogin no # 禁止root使用者登入
65 PasswordAuthentication no # 禁止使用密碼登入
79 GSSAPIAuthentication no # 關閉GSSAPI認證
## 將以下內容,直接複製到檔案最後一行
Port 6666 # 變更SSH服務遠端連線埠
PermitRootLogin no # 禁止root使用者直接遠端登入
PasswordAuthentication no # 禁止使用密碼直接遠端登入
UseDNS no # 禁止ssh進行dns反向解析,影響ssh連線效率引數
GSSAPIAuthentication no # 禁止GSS認證,減少連線時產生的延遲
## 重啟服務
[root@m01 ~]# systemctl restart sshd
## 解決方案
如果已經優化完ssh,發現伺服器上出現以下問題:
1.沒有普通使用者
useradd lw(無法建立,進入單使用者模式)
2.windows上祕鑰沒有推送
1)在windows上生成金鑰對
- 使用windows的命令列執行 ssh-keygen
- 使用Xshell
使用Xshell生成金鑰對
生成金鑰對
[lw@m01 ~]$ mkdir .ssh
[lw@m01 ~]$ chmod 700 .ssh/
[lw@m01 ~]$ vim .ssh/authorized_keys
ssh-rsa
AAAAB3NzaC1yc2EAAAABIwAAAQEAuNorYRb3u0gM8RvxeZqGZJjptceVYpZz3ADLzTpF92DZlmGjEScnbmEfZaIVhER
F0nTvd79aixEP97V2l/B7p30b4+oaFugCR0ZDJRmypZUIKXnNYwbDjwT7k/4/V3DTYjS+0OkNLbKghlDDX0ntOoClGb
y2zV87draCqOQ6F4AAHWcrZi72gflKEShRKULKOGjcr3ZzDZfyKH6IxWLxa3EJO3v/tUFOatqDDj2j+aNswgbEDf0iC
Ynaw5h+SiTkVV6zY44TEEM+h9aVXjY1ufyAAePRDcuOnHBB1VzE38TMLEYl94VEUartDwE2TMnVOk5MhRYm4Q09zrPj
VM0J3w==
[lw@m01 ~]$ chmod 600 .ssh/authorized_keys
五、免互動生成金鑰對
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
-t:指定加密型別
-P:空密碼
-f:祕鑰生成的位置
免互動推送公鑰
#ip地址一個一個寫上去
#!/bin/bash
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
## 迴圈
#!/bin/bash
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
ssh-copy-id -i ~/.ssh/id_rsa.pub root@$n
done
## 解決密碼互動問題
1)使用expect解決
[root@m01 ~]# yum install -y expect
#!/usr/bin/expect
set ip 172.16.1.31
set pass 1
set timeout 30
spawn ssh-keygen
expect {
"id_rsa):" {send "\r"; exp_continue}
"passphrase):" {send "\r"; exp_continue}
"again:" {send "\r"}
}
expect eof
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub 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
2)使用sshpass解決
[root@m01 ~]# yum install -y sshpass
## ssh不需要輸入yes的選項
[root@m01 ~]# ssh -o 'StrictHostKeyChecking no' [email protected]
[root@m01 ~]# sshpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub
[email protected]
[root@m01 ~]# cat send_public_key.sh
#!/bin/bash
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
shpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
done
[root@m01 ~]# cat send_public_key.sh
#!/bin/bash
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
shpass -p 1 ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
done
[root@m01 ~]# cat /root/1.txt
172.16.1.31
172.16.1.41
172.16.1.5
172.16.1.7
172.16.1.8
## 密碼不一致的情況
#!/bin/bash
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
pass=`echo $n|awk -F ':' '{print $2}'`
ip=`echo $n|awk -F ':' '{print $1}'`
sshpass -p $pass ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
done
[root@m01 ~]# cat /root/1.txt
172.16.1.31:1
172.16.1.41:2
172.16.1.5:3
172.16.1.7:4
172.16.1.8:111
## 優化後的指令碼
vim send_public_key.sh
#!/bin/bash
. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f
~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
pass=`echo $n|awk -F ':' '{print $2}'`
ip=`echo $n|awk -F ':' '{print $1}'`
sshpass -p $pass ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
&>/dev/null
if [ $? -eq 0 ];then
action "$ip send public key " /bin/true
else
action "$ip send public key " /bin/false
fi
done
## 優化後不使用判斷的指令碼
#!/bin/bash
. /etc/init.d/functions
ls -l ~/.ssh/id_rsa &>/dev/null || ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa &>/dev/null
for n in `cat /root/1.txt`;do
pass=`echo $n|awk -F ':' '{print $2}'`
ip=`echo $n|awk -F ':' '{print $1}'`
sshpass -p $pass ssh-copy-id -o 'StrictHostKeyChecking no' -i ~/.ssh/id_rsa.pub root@$ip
&>/dev/null && \
action "$ip send public key " /bin/true || \
action "$ip send public key " /bin/false
done