Linux網路-ssh遠端連線協議

leikj發表於2024-05-05

SSH基礎

1.ssh協議概述

  • SSH(Secure Shell)是一種安全通道協議,主要用來實現字元介面的遠端登入、遠端 複製等功能;
  • SSH 協議對通訊雙方的資料傳輸進行了加密處理,其中包括使用者登入時輸入的使用者口令;
  • SSH 為建立在應用層和傳輸層基礎上的安全協議。對資料進行壓縮,加快傳輸速度。
  • SSH使用傳輸層TCP協議的22號埠。

SSH客戶端<--------------網路---------------->SSH服務端

2.ssh協議優點

  • 資料傳輸是加密的,可以防止資訊洩露
  • 資料傳輸是壓縮的,可以提高傳輸速度

3.ssh服務的最佳實踐

  • 建議使用非預設埠 22
  • 禁止使用protocol version 1
  • 限制可登入使用者 白名單
  • 設定空閒會話超時時長
  • 利用防火牆設定ssh訪問策略
  • 僅監聽特定的IP地址 公網 內網
  • 基於口令認證時,使用強密碼策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
  • 使用基於金鑰的認證
  • 禁止使用空密碼
  • 禁止root使用者直接登入
  • 限制ssh的訪問頻度和併發線上數
  • 經常分析日誌 分離

4.Openssh
penSSH 是 SSH 協議的免費開源實現。是 Centos7 上自帶的軟體,幫助我們實現遠端連線。OpenSSH 常用配置檔案有兩個 /etc/ssh/ssh_config 和 /etc/ssh/sshd_config 。


客戶端相關資訊

  • 客戶端主程式 :/usr/bin/ssh
  • 客戶端配置檔案:/etc/ssh/ssh_config

服務端相關資訊

  • 服務端主程式:/usr/sbin/sshd
  • 服務端配置檔案:/etc/ssh/sshd_config

金鑰的存放位置:

  • 自己的金鑰:/etc/ssh/
  • 其他人的金鑰:~/.ssh/known_hosts

SSH原理

透過公鑰加密,再透過私鑰解密

1.ssh第一次通訊的原理

  • 客戶端(Client)首先發起連線請求給服務端(Server);
  • Server收到請求後,將自己的公鑰,以及一個會話ID發給Client(這一步客戶端得到服務端公鑰);
  • Client生成金鑰對;
  • Client用自己的公鑰異或會話ID,計算出一個值Res,並用Server的公鑰加密;
  • Client傳送加密後的值到服務端,Server用私鑰解密,得到Res;
  • Server用解密後的值Res異或會話ID,計算出Client的公鑰(這一步服務端得到客戶端公鑰);
  • 最終:雙方各自持有三個秘鑰,分別為自己的一對公、私鑰,以及對方的公鑰,之後的所有通訊都會被加密

2.命令格式

點選檢視程式碼
1. ssh [遠端主機使用者名稱]@[遠端伺服器主機名或IP地址] -p port
當在 Linux 主機上遠端連線另一臺 Linux 主機時,如當前所登入的使用者是 root 的話,
當連線另一臺主機時也是用 root 使用者登入時,可以直接使用 ssh  IP,埠預設即可;
如果埠不是預設的情況下,需要使用-p 指定埠。


2. ssh -l [遠端主機使用者名稱] [遠端伺服器主機名或IP 地址] -p port
-l :-l 選項,指定登入名稱。
-p: -p 選項,指定登入埠(當服務端的埠非預設時,需要使用-p 指定埠進行登入)


3. ssh -t 跳板連線


4. ssh  ip  後面直接跟上命令
[root@localhost ~]# ssh 192.168.91.101 ifconfig 

3.known_hosts檔案
known_hosts是Linux系統中一個儲存已知主機公鑰的檔案,用於SSH客戶端驗證遠端主機的身份。當你連線到遠端主機時,SSH客戶端會檢査該主機的公鑰是否存在於 known_hosts檔案中,以確保你連線到的是正確的主機而不是惡意主機。
known_hosts檔案的路徑通常在使用者的家目錄下的.ssh資料夾內,檔名為known_hosts,即 ~/.ssh/known_hosts。每個記錄包含主機名、公鑰、演算法等資訊以及用於驗證主機的指紋。當你首次連線到一個新的遠端主機時,SSH會將該主機的公鑰新增到known_hosts檔案中。如果主機公鑰發生變化,SSH會發出警告,因為這可能意味著連線到了不安全的主機。

點選檢視程式碼
思考:有臺伺服器年久失修,換了一臺新的伺服器,依舊使用舊機器的ip地址,現在ssh遠端連線失敗是為什麼?怎麼解決?
以舊換新需要重新傳送金鑰。刪除之前伺服器的公鑰rm-rf  known_hosts ,重新獲取公鑰。

sshd客戶端配置

客戶端配置檔案位置:/etc/ssh/ssh_config

客戶端首次連線服務端時,系統詢問是否交換公鑰,進行安全確認。這是由客戶端配置檔案預設的,可以修改配置檔案ssh_config取消詢問。

點選檢視程式碼
[root@localhost ~]#  vim /etc/ssh/ssh_config        #修改客戶端配置檔案
#   StrictHostKeyChecking ask
    StrictHostKeyChecking no     #取消註釋,並將ask改成no,則首次連線時,系統不會進行確認詢問

注意:這種做法只在內網中使用,如果伺服器暴露在外網中,不建議這樣操作,非常危險。

sshd服務端配置

服務端配置檔案位置:/etc/ssh/sshd_config
1.常用配置項

點選檢視程式碼
[root@localhost ~]#  cat -n  /etc/ssh/sshd_config
--------------------
    17	#Port 22                   //埠號,生產環境建議修改埠號
    18	#AddressFamily any
    19	#ListenAddress 0.0.0.0     //監聽地址設定SSHD伺服器繫結的IP 地址,0.0.0.0 表示偵聽所有地址安全建議:如果主機不需要從公網ssh訪問,可以把監聽地址改為內網地址。
    20	#ListenAddress ::
    
    37	#LoginGraceTime 2m         //用來設定如果使用者登入失敗,在切斷連線前伺服器需要等待的時間,單位為秒
    38	#PermitRootLogin yes       //是否允許root使用者登入,ubantu不允許root遠端ssh登入
    39	#StrictModes yes           //#檢查.ssh/檔案的所有者,許可權等
    40	#MaxAuthTries 6            //最多允許輸錯幾次密碼(centos7預設3次,修改也無效)
    41	#MaxSessions 10            //同一時間最多允許10個遠端連線
    
    65	PasswordAuthentication yes   //基於key驗證
    
    68	#ChallengeResponseAuthentication yes       //是否允許空密碼使用者登入
    69	ChallengeResponseAuthentication no         //基於使用者和密碼驗證
 
    115	#UseDNS no                 //禁用反向解析,提高速度可設定為no
    
#以下可以限制可登入使用者的辦法:白名單  黑名單
AllowUsers user1 user2 user3@ip(限制主機)
DenyUsers user1 user2 user3
如果不設定白名單,則所有使用者都可以登入訪問。一旦設定了白名單,那麼只有白名單內的使用者可以訪問。

2.實際操作
修改預設埠

點選檢視程式碼
[root@node2 ~]#  vim  /etc/ssh/sshd_config        //編輯服務端配置檔案
Port 9527   //修改埠號為9527
[root@node2 ~]#  systemctl restart sshd           //重啟服務

[root@localhost ~]#  ssh 172.16.235.100 -p 9527   //在客戶端進行遠端連線
root@172.16.235.100's password: 
Last login: Mon Apr 29 20:30:57 2024 from 172.16.235.1   //連線成功


禁止root使用者登入

點選檢視程式碼
[root@node2 ~]#  vim  /etc/ssh/sshd_config       //編輯服務端配置檔案
PermitRootLogin no   //改為no,不允許root登入
[root@node2 ~]#  systemctl restart sshd          //重啟服務

[root@localhost ~]#  ssh 172.16.235.100 -p 9527  //在客戶端進行遠端連線
root@172.16.235.100's password: 
Permission denied, please try again.
root@172.16.235.100's password: 
Permission denied, please try again.
root@172.16.235.100's password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).  //連線失敗


注意!!!雖然阻止了root,但是普通使用者可以使用su root 進行遠端連線。
[root@localhost ~]#  ssh lisi@172.16.235.100 -p 9527   //lisi為遠端主機使用者
lisi@172.16.235.100's password: 
Last failed login: Mon Apr 29 21:11:53 CST 2024 from 172.16.235.55 on ssh:notty
[lisi@node2 ~]$ su root
密碼:
[root@node2 lisi]# 

怎樣解決來提高安全性呢?修改服務端的pam認證模組!
[root@node2 ~]#  vim /etc/pam.d/su                      //編輯pam配置檔案
6 auth            required        pam_wheel.so use_uid  //開啟第六行

[root@localhost ~]#  ssh lisi@172.16.235.100 -p 9527    //在客戶端進行遠端連線
lisi@172.16.235.100's password: 
Last login: Mon Apr 29 21:13:26 2024 from 172.16.235.55
[lisi@node2 ~]$ su root
密碼:
su: 拒絕許可權                                        //無法使用su root連線服務端
[lisi@node2 ~]$ 


![](https://img2024.cnblogs.com/blog/3396297/202405/3396297-20240505013529674-1062879601.png)

白名單黑名單列表

點選檢視程式碼
1.設定白名單
[root@node2 ~]#  vim /etc/ssh/sshd_config
AllowUsers zhangsan@172.16.235.55  lisi
只允許 172.16.235.55 登入我的張三 ; 任何人可以登入我的lisi
[root@node2 ~]#  systemctl restart sshd

用服務端1(172.16.235.10)進行測試:
[root@node1 ~]# ssh zhangsan@172.16.235.100 -p 9527   //遠端登入到zhangsan
zhangsan@172.16.235.100's password: 
Permission denied, please try again.
zhangsan@172.16.235.100's password: 
Permission denied, please try again.
zhangsan@172.16.235.100's password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).  //登入失敗
[root@node1 ~]# ssh lisi@172.16.235.100 -p 9527           //遠端登入到lisi
lisi@172.16.235.100's password: 
Last login: Mon Apr 29 21:21:23 2024 from 172.16.235.55   
[lisi@node2 ~]$                                           //登入成功

用服務端2(172.16.235.55)進行測試:
[root@localhost ~]#  ssh zhangsan@172.16.235.100 -p 9527  //遠端登入到zhangsan
zhangsan@172.16.235.100's password: 
Last login: Mon Apr 29 21:40:18 2024 from 172.16.235.55   
[zhangsan@node2 ~]$                                       //登入成功


2.設定黑名單
DenyUsers  liwu@192.168.91.100    //只拒絕192.168.91.100登入伺服器的liwu使用者


注意!市場環境中先備份配置檔案,再做修改!

免密登入

1.使用金鑰對及免互動驗證登入
客戶端如果想免密登入,進行兩步操作即可:

第一步:生成金鑰
第二步:傳金鑰給對方
實驗步驟:

1.客戶端使用命令 ssh-keygen 生成金鑰(預設使用rsa演算法);

點選檢視程式碼
[root@localhost ~]#  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:aA9uuLdOnvTs1DuT3lDcrveeU9bT1OAyZDXp3ABgbpg root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|          o..oo. |
|         =  o +. |
|        E oo + +.|
|       . . .o.+ +|
|      + S   oo..o|
|     + o . . . .=|
|    . = o o.  ..o|
|     *.=  ++ ....|
|    .o=o+.ooo. ++|
+----[SHA256]-----+


![](https://img2024.cnblogs.com/blog/3396297/202405/3396297-20240505013751948-1990197422.png)

2.使用命令 ssh-copy-id -i 自己金鑰檔案 對方地址 將客戶端的公鑰檔案複製到服務端(注意路徑不要寫錯);

點選檢視程式碼
[root@localhost ~]#  cd /root/.ssh
[root@localhost .ssh]#  ls   // 家目錄 ~/.ssh/ 下會生成兩個金鑰檔案,一個公鑰一個私鑰,.pub結尾的是公鑰
id_rsa  id_rsa.pub  known_hosts
[root@localhost .ssh]#  ssh-copy-id -i id_rsa.pub 172.16.235.100   //將金鑰複製到服務端(注意埠號)
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "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.235.100's password: 

Number of key(s) added: 1

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


![](https://img2024.cnblogs.com/blog/3396297/202405/3396297-20240505013819624-1107970514.png)

3.測試遠端連線服務端時,是否免密碼。

點選檢視程式碼
[root@localhost .ssh]#  ssh 172.16.235.100         //遠端登入到服務端
Last login: Mon Apr 29 22:29:53 2024 from 172.16.235.1
[root@node2 ~]#                                    //免密登入

![](https://img2024.cnblogs.com/blog/3396297/202405/3396297-20240505014040207-1253334424.png)

2.同網段主機免密登入指令碼
生產環境中,多臺主機間想要免密登入,可以供用金鑰

點選檢視程式碼
[root@localhost ~]#  cd /data
[root@localhost data]#  vim ssh_log.sh  //編寫免密登入指令碼

#!/bin/bash
PASS=123123    //密碼自行修改
#設定網段最後的地址,4-255之間,越小掃描越快
END=254

IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

輕量級自動化運維工具pssh

pssh基於python編寫,可在多臺伺服器上執行命令的工具,也可實現檔案複製,提供了基於ssh和scp的多個並行工具。

點選檢視程式碼
yum install epel-release.noarch -y  #推薦安裝方式

[root@ky15-1 yum.repos.d]#yum clean all
#清除快取
[root@ky15-1 yum.repos.d]# pssh
[root@ky15-1 yum.repos.d]# ssh-keygen 
#一路回車
[root@ky15-1 yum.repos.d]# ssh-copy-id 192.168.91.102
[root@ky15-1 yum.repos.d]# ssh-copy-id 192.168.91.105
#上傳秘鑰對
[root@ky15-1 yum.repos.d]# pssh -H 192.168.91.102 hostname -i
[1] 02:10:10 [SUCCESS] 192.168.91.102


#管理多臺,寫入一個檔案
[root@ky15-1 yum.repos.d]#vim hosts.txt
[root@ky15-1 yum.repos.d]#cat hosts.txt 
10.0.0.8
10.0.0.6

[root@ky15-1 yum.repos.d]#pssh -i -h hosts.txt   hostname  //注意-i寫在前面

相關文章