返回部落格

SSH 概述 – SSH 伺服器、用戶端與金鑰

SSH 概述 – SSH 伺服器、用戶端與金鑰

在遠端運算方面,SSH 是最受歡迎且安全的協定之一。SSH 是一種加密網路協定,可與遠端裝置建立安全連線。連線到遠端裝置後,使用者可以在遠端 shell 上執行指令。SSH 在網路和系統管理員中最為常見。

這份速查表風格的指南介紹了 SSH 的概述、一些常見的 SSH 連線方式以及各種 SSH 設定。

SSH 概述

SSH 是 Secure Shell 的縮寫。有些人也將 SSH 稱為 Secure Socket Shell。SSH 是存取遠端伺服器最常見的方式。使用 SSH 連線到遠端系統時,您會連線到現有的帳戶。連線後,您將可以存取 shell 工作階段。所有執行的指令都將在遠端機器上執行,並將輸出列印在您的本機終端機上。

SSH 連線採用用戶端-伺服器(client-server)模式。遠端系統必須執行 SSH 守護行程(daemon)才能接受遠端 SSH 連線。SSH 守護行程會接聽特定連接埠、驗證連線請求,並在滿足條件時產生適當的環境。

在本指南中,我們設定了兩台 Ubuntu 伺服器。主伺服器將設定為連線到次要伺服器。次要伺服器將設定為接受來自主伺服器的 SSH 連線。這些伺服器 IP 位址將在整個指南中使用:

  • 主伺服器:31.171.250.121

  • 次要伺服器:31.171.250.130

首先,您可以參考我們關於如何在 Ubuntu 中使用 SSH 連線到遠端伺服器 以及 如何設定您的 Linux 伺服器以使用基於金鑰的 SSH 驗證 的詳細指南。現在,讓我們開始吧!

SSH 驗證

SSH 驗證主要有兩種類型。傳統方法是使用密碼。它的安全性較低,強烈不建議使用。第二種方法是 SSH 金鑰。SSH 金鑰提供非常強大的安全性,強烈推薦使用。

雖然密碼驗證更容易理解和設定,但它很容易被利用。例如,自動化機器人可以使用暴力破解來入侵系統。SSH 金鑰是加密金鑰。每個金鑰都有兩個部分 – 私鑰和公鑰。公鑰可以分享到任何地方,無需擔心。然而,私鑰必須保持安全防護。

要使用 SSH 金鑰作為驗證方法,遠端系統必須安裝公鑰的複本。本機系統上也應安裝私鑰和公鑰的複本。預設情況下,公鑰會列在以下檔案中。每個不重複的使用者都有該檔案的唯一複本:

以下是驗證程序的運作方式:

  • 用戶端系統向遠端系統傳送連線請求。它還會傳送要使用哪個 SSH 金鑰。

  • 遠端系統會檢查公鑰是否列在 authorized_keys 中。

  • 如果金鑰存在,系統會產生一個隨機字串,並使用公鑰進行加密。加密後的訊息只能使用私鑰進行解密。

  • 收到字串後,用戶端將解密該字串。

  • 結合該字串和先前協商的會話 ID(session ID),會產生一個 MD5 雜湊值。用戶端將 MD5 雜湊值傳送到遠端系統。

  • 遠端系統知道隨機字串和會話 ID。如果 MD5 雜湊值相符,則允許連線。

SSH 金鑰

在本指南中,SSH 金鑰將是驗證的主要焦點。因此,本節將重點介紹如何使用 SSH 金鑰。

  • 產生 SSH 金鑰組

預設情況下,Linux 系統未安裝 SSH 金鑰。然而,系統可能包含先前產生/安裝的 SSH 金鑰。假設之前沒有 SSH 金鑰,我們需要產生新的 SSH 公鑰和私鑰組。SSH 支援多種用於產生 SSH 金鑰的加密演算法,例如 RSA、DSA、ECDSA 和 EdDSA。RSA 是預設且首選的演算法。

  • 產生一般的 RSA 金鑰組

要產生 SSH 金鑰組,請執行以下指令:

SSH Keygen

系統提示會詢問您要將金鑰對儲存在何處。如前所述,這將會是一個 RSA 金鑰對。如果未輸入任何值,SSH 將會把它儲存到預設位置 /home/demo/.ssh/id_rsa.

下一步是輸入密碼短語。建議使用密碼短語。密碼短語的長度是任意的。它增加了一層安全性。然而,SSH 允許在沒有任何密碼短語的情況下產生金鑰。如果您想要不含密碼短語的金鑰,只需按 Enter 鍵即可。

最終的輸出提供了以下金鑰資訊:

  1. 私鑰的位置( /root/.ssh/id_rsa)。絕對不應該分享它。

  2. 公鑰的位置( /root/.ssh/id_rsa.pub)。與任何人分享都是安全的。

  3. 金鑰指紋。

  4. 金鑰隨機圖像。其原理是,如果金鑰遭到破解,您可能會透過注意到金鑰圖像的任何變化來發現。

  • 產生具有不同位元數的 RSA 金鑰對

預設情況下,SSH 金鑰為 2048 位元。就安全性而言,這被認為已經足夠。然而,我們可以手動指定使用不同的位元數。位元值越高,金鑰就越強固。

執行以下命令以產生 4096 位元的 SSH 金鑰對。大多數伺服器都支援 4096 位元的 SSH 金鑰。如果金鑰太大,出於 DDoS 防護目的,它可能不會被接受:

SSH Keygen with bits因為我們已經產生過金鑰對,SSH 會詢問是否覆寫前一個。其餘過程與產生一般金鑰對相同。

  • 變更私鑰密碼短語

我們可以變更私鑰的密碼短語。此過程需要您知道目前的密碼短語。要變更密碼短語,請執行以下命令:

SSH Keygen Password Change

該命令將提示您輸入私鑰的位置。如果金鑰儲存在預設位置,請按 Enter 鍵。輸入目前的密碼短語。如果被接受,您就可以指定一個新密碼短語。

  • 顯示 SSH 金鑰指紋

每個 SSH 金鑰對都共享一個密碼學指紋。此指紋可用於識別唯一的金鑰。這在許多情況下都很有用。執行以下命令以檢查 SSH 金鑰的指紋:

SSH Key Fingerprint

輸入金鑰的位置。如果金鑰儲存在預設位置,請按 Enter 鍵。

複製公鑰

SSH 金鑰對已準備好用於保護遠端連線。為了讓遠端系統接受 SSH 金鑰進行驗證,它需要有一份公鑰的複本。有多種方法可以將公鑰的複本複製到遠端伺服器。

  • 使用 ssh-copy-id

ssh-copy-id 是 OpenSSH 套件的一部分。這是複製 SSH 公鑰的預設方式。它簡單且易於使用。執行以下命令以傳輸公鑰的複本:

SSH Copy ID

您需要遠端使用者帳戶的密碼才能完成此程序。如果成功,將會顯示成功訊息。

  • 使用 SSH 連線

如果使用 ssh-copy-id 工具不可用,但主要伺服器可以使用 SSH 連線到次要伺服器,那麼我們可以使用不同的技巧來複製金鑰。這是透過 SSH 命令將公鑰的內容以管線(pipe)方式傳送到遠端。請注意,如果目錄 ~/.ssh 在遠端系統上不存在,它可能無法運作:

SSH Copy

  • 手動複製

如果無法進行遠端連線,唯一剩下的方法就是手動將公鑰新增到遠端伺服器。首先,獲取公鑰的內容:

在遠端伺服器上,將金鑰放置在適當的位置:

使用 SSH

現在公鑰已設定完成,我們準備好使用 SSH 進行遠端連線。

  • 連線至遠端系統

第一步是學習如何使用 SSH 連線至遠端系統。這假設本機和遠端系統都允許 SSH 流量。若要連線至遠端系統,請輸入以下內容:

SSH Login Without User

若要連線至遠端伺服器上的特定使用者,請改用以下結構:

SSH Login with User

如果是第一次連線至該伺服器,SSH 可能會顯示警告。輸入 yes 以繼續連線。如果遠端帳戶受密碼保護,您必須輸入密碼。如果 SSH 金鑰受密碼短語保護,您也必須輸入密碼短語。

  • 連線至不同的連接埠

預設情況下,SSH 執行於連接埠 22。SSH 用戶端在連線至遠端系統時會採用預設的連接埠值。然而,如果遠端系統針對 SSH 流量接聽不同的連接埠,則無法運作。在這種情況下,我們需要手動宣告連接埠號碼。若要宣告特定連接埠,請使用 -p 旗標:

每次都手動宣告連接埠會降低效率。我們可以永久變更預設的連接埠值。若要執行此操作,請開啟 SSH 設定檔。如果該檔案不存在,以下命令將會建立它:

然後,新增以下行:

  • 在遠端伺服器上執行命令

現在連線已建立,您在本機終端機上執行的任何命令都將傳送至遠端伺服器。產生的任何輸出都將傳送至本機終端機。

如果只需執行單一命令,我們可以在不進行完整 SSH 登入的情況下執行它。我們只需在 SSH 連線指令後宣告該命令即可:

  • 將金鑰新增至 SSH 代理程式

如果 SSH 金鑰設有密碼短語,則每次連線至遠端系統時,您都必須輸入該密碼短語。重複執行此操作會降低效率。我們可以讓 SSH 代理程式來處理。這是一個小型公用程式,可在您輸入密碼短語後儲存私鑰。在終端機工作階段期間,該私鑰將可供使用。若要啟動 SSH 代理程式,請執行以下命令:

SSH Agent

該程式正在背景執行。您只需要將私鑰新增至代理程式即可。請執行以下命令:

SSH Add

輸入密碼短語以完成操作。

  • 轉遞 SSH 憑證

我們也可以將 SSH 設定為在無密碼的情況下從一部伺服器連線至另一部伺服器。這可能非常高效,尤其是在處理眾多遠端伺服器時。若要實現此目的,我們需要轉遞 SSH 憑證。轉遞 SSH 憑證需要將遠端伺服器設定為接受來自本機/伺服器的連線。然後,您只需要使用 -A 旗標。它會在目前的工作階段中將您的憑證轉遞至伺服器:

遠端伺服器設定

本節包含一些常見的伺服器端設定,以協助您改善伺服器回應和連線安全性。

  • 停用密碼驗證

如果已設定 SSH 金鑰且 SSH 連線運作正常,那麼停用密碼驗證是安全的。以下設定將在任何使用者透過 SSH 連線時停止要求輸入密碼。在遠端伺服器上,開啟 sshd_config 檔案,並使用 root/sudo 權限:

接下來,搜尋項目 PasswordAuthentication。如果該行被註解了,請取消註解。將值變更為 no:

Password Authentication Change

儲存檔案並關閉編輯器。若要使變更生效,請重新啟動 SSH 服務:

如果系統是 CentOS/Fedora,請改用以下命令:

  • 變更 SSH 連接埠

如前所述,SSH 使用連接埠 22 來交換 SSH 流量。然而,根據一些系統管理員的說法,為 SSH 分配不同的連接埠會更好。這有助於防止自動化機器人灌爆該連接埠。若要變更 SSH 監聽的連接埠,請開啟 sshd_config 檔案:

搜尋項目 Port。如果它被註解了,請取消註解。然後,將值變更為其他數值。連接埠值為無正負號的 16 位元整數 (0-65535):

SSH Port Change

儲存檔案並關閉編輯器。若要套用變更,請重新啟動 SSH 精靈:

在 CentOS/Fedora 上,請改為執行以下命令:

  • 使用者限制

我們可以設定哪些使用者帳戶可以透過 SSH 連線。這也涉及調整 sshd_config 檔案。使用 sudo/root 權限開啟該檔案:

搜尋項目 AllowUsers。新增允許的使用者:

User Limitation

儲存檔案並關閉編輯器。重新啟動 SSH 精靈以使變更生效:

在 CentOS/Fedora 上,請改為執行以下命令:

  • 群組限制

與使用者限制類似,我們也可以決定哪些使用者群組可以透過 SSH 連線到系統。開啟 sshd_config 檔案:

使用項目 AllowGroups 來新增可以使用 SSH 的特定使用者群組:

Allow User Groups

儲存檔案並關閉編輯器。重新啟動 SSH 精靈以使變更生效:

對於 CentOS/Fedora,請改為執行以下命令:

請注意,如果從使用者群組中新增或移除了任何使用者,則需要重新啟動 SSH 精靈。否則,群組變更將不會生效。

  • 停用 root 登入

如果您可以使用具有 sudo 權限的使用者,建議停用透過 SSH 進行 root 登入。開啟 sshd_config 檔案:

將項目 PermitRootLogin 的值變更為 no:

Disable Root Login

儲存檔案並關閉編輯器。重新啟動 SSH 精靈以使變更生效:

在 CentOS/Fedora 上,請改為執行以下命令:

  • 轉發 X 應用程式顯示

SSH 精靈還可以將 X 應用程式的顯示從伺服器轉發到用戶端。然而,若要使其正常運作,遠端系統必須設定 X 視窗系統。該功能也必須在 SSH 設定中啟用。開啟 SSH 設定檔:

將指令 X11Forwarding 的值變更為 yes:

X11 Forwarding

儲存檔案並關閉編輯器。重新啟動 SSH 服務以使變更生效:

在 CentOS/Fedora 上,請改為執行以下命令:

用戶端設定

在本節中,我們將介紹 SSH 用戶端上的一些常見設定。

  • 特定伺服器的連線資訊

在本機系統上,我們可以定義遠端連線的詳細資訊。所有資訊都儲存在位於以下路徑的設定檔中: ~/.ssh/config:

每個遠端系統區塊都由關鍵字 Host 後跟別名來表示。所有特定於系統的指令都放在這裡。連線到遠端系統時,SSH 會自動套用它們。如需設定的完整、深入說明,請查看說明手冊(man page):

SSH Manual

遠端連線的條目將遵循以下結構:

  • 連線逾時

您可能會發現,在您準備好執行任何操作之前,SSH 工作階段就已經中斷連線。如果用戶端沒有向遠端伺服器傳送任何封包,一段時間後連線就會逾時。為了避免這種情況,我們可以設定本機用戶端每隔一段時間傳送一個封包,以保持連線運作。

開啟本機設定檔:

在遠端連線條目下,新增指令 ServerAliveInterval ,後跟以秒為單位的封包間隔時間:

Server Alive Interval

儲存檔案並關閉編輯器。

  • 停用主機檢查

預設情況下,每當嘗試連線到新伺服器時,SSH 用戶端都會回報遠端 SSH 服務的指紋。這是驗證主機’真實性的實用功能。如果惡意攻擊者試圖偽裝遠端主機,它將顯示為新伺服器。

停用此功能可能會帶來巨大的安全性風險。通常建議保持開啟此選項。然而,在某些情況下,停用主機檢查可能會帶來便利。開啟設定檔:

在遠端主機區段下,新增以下指令:

Disabling Host Checking

第一個指令將停用自動將新主機新增至儲存在 known_hosts 檔案中的已知主機清單。第二個指令是不對任何變更發出警告。儲存檔案並關閉編輯器。

  • 在單一 TCP 連線上多工傳輸 SSH

有時,建立 TCP 連線可能需要相當長的時間。如果需要對同一台機器建立多個連線,那麼多工(multiplexing)是一個您可以利用的絕佳功能。SSH 多工允許在多個 SSH 工作階段中使用同一個 TCP 連線。它減少了建立新工作階段所需的部分工作負載。限制連線數量也可能有所幫助。

我們可以手動設定多工連線,或者讓 SSH 在可用時自動使用它。在這裡,我們將設定 SSH 採用第二種方式。開啟 SSH 設定檔:

在檔案頂部新增萬用字元主機定義。這可確保下一組指令將套用於所有遠端連線。新增以下指令:

Multiplexing SSH

第一個指令指示 SSH 在可用時自動使用多工。第二個指令建立控制通訊端(control socket)的路徑。此通訊端將在建立第一個工作階段時建立。後續的工作階段將遵循此通訊端。

最後一個指令告訴 SSH 讓初始的主連接在背景執行。它還表示 TCP 連接將在最後一個 SSH 工作階段結束一秒後自動終止。接下來,建立我們在設定檔中宣告的目錄:

最後,多路復用應該已經啟用。

SSH 逸出碼

建立連接後,有幾種方法可以使用逸出碼來控制連接行為。

  • 強制中斷連接

您的 SSH 工作階段卡住了嗎?SSH 工作階段通常由伺服器管理。如果伺服器出現問題,卡在失效的 SSH 工作階段中可能會令人沮喪。幸好,OpenSSH 提供了實用的控制功能,可以從用戶端管理連接狀態。

按幾下 Enter 鍵。然後,輸入以下指令:

Forcing Disconnects

這裡, ~ 是控制字元。在用戶端執行此指令後,連接應該會立即關閉。

  • SSH 背景工作階段

我們也可以將 SSH 工作階段放到背景執行。當放到背景時,您將返回一般的 shell 工作階段。工作完成後,您可以再次返回 SSH shell。請注意,您需要有適當的逾時設定,以避免 SSH 工作階段在背景時發生逾時。若要將 SSH 工作階段放到背景,請輸入控制字元,後面加上 Ctrl + Z:

SSH Background Session

如果這是您最近的背景工作,您可以使用以下指令重新啟用它:

如果有多個背景工作,我們可以從工作列表中確認:

Jobs

若要將目標工作移至前景,請記下第一欄的工作值。然後,執行以下指令:

Job Foreground

  • 變更連接埠轉發設定

利用控制機制,我們可以即時變更連接埠轉發規則。建立連接後,我們可以建立或拆除連接埠轉發規則。這是 SSH 命令列介面的一部分。

若要存取 SSH 命令列介面,請執行以下指令:

SSH Command Line Interface

若要列出可用選項,請輸入以下指令:

如果輸出內容太少,請嘗試使用以下控制指令來增加詳細程度:

現在,再次執行 -h 指令:

SSH Command Line Help

正如輸出所說明的,使用簡單的指令來實作任何連接埠轉發都非常簡單。例如,也可以使用 kill 指令來銷毀通道,這由 K 在指令列表中表示。

結語

SSH 非常常見。這就是為什麼學習 SSH 非常有用。我們全面的 SSH 概述涵蓋了使用者日常使用 SSH 所需了解的最重要 SSH 設定。一旦掌握,您應該就能應對幾乎所有的 SSH 伺服器設定。

祝您使用愉快!

author

Pranay Kapgate

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的創意設計師,專注於透過傳統與創新行銷渠道建立一致的企業形象。他擅長將藝術願景與策略行銷相融合,創造具有影響力的品牌敘事。

留言

目前尚無留言。成為第一個留言的人吧。