Secure Shell

安全外殼協議（Secure Shell Protocol，簡稱 SSH）是一種加密的網路傳輸協議，可在不安全的網路中為網路服務提供安全的傳輸環境。SSH 透過在網路中建立來實現 SSH 客戶端與伺服器之間的連線。SSH 最常見的用途是遠端登入系統，人們通常利用 SSH 來傳輸命令列介面和遠端執行命令。SSH 使用頻率最高的場合是類 Unix 系統，但是 Windows 作業系統也能有限度地使用 SSH。2015 年，微軟宣佈將在未來的作業系統中提供原生 SSH 協議支援，Windows 10 1803 版本已提供 OpenSSH 工具。

在設計上，SSH 是 Telnet 和非安全 shell 的替代品。Telnet 和 Berkeley 、rsh、等協議採用明文傳輸，使用不可靠的密碼，容易遭到監聽、嗅探和中間人攻擊。SSH 旨在保證非安全網路環境（例如網際網路）中資訊加密完整可靠。

不過，SSH 也被指出有被嗅探甚至解密的漏洞。早在 2011 年，中國的網際網路審查機構已經有能力針對 SSH 連線的刺探及幹擾。而後愛德華・斯諾登洩露的檔案也指出，美國國家安全域性有時能夠把 SSH 協議傳輸的資訊解密出來，從而讀出 SSH 會話的傳輸內容。2017 年 7 月 6 日，非營利組織維基解密確認美國中央情報局已經開發出能夠在 Windows 或 Linux 作業系統中竊取 SSH 會話的工具。

概述

SSH 以非對稱加密實現身份驗證。身份驗證有多種途徑，例如其中一種方法是使用自動生成的公鑰 - 私鑰對來簡單地加密網路連線，隨後使用密碼認證進行登入；另一種方法是人工生成一對公鑰和私鑰，透過生成的金鑰進行認證，這樣就可以在不輸入密碼的情況下登入。任何人都可以自行生成金鑰。公鑰需要放在待訪問的電腦之中，而對應的私鑰需要由使用者自行保管。認證過程基於生成出來的私鑰，但整個認證過程中私鑰本身不會傳輸到網路中。

SSH 協議有兩個主要版本，分別是 SSH-1 和 SSH-2。無論是哪個版本，核實未知金鑰來源都是重要的事情，因為 SSH 只驗證提供使用者是否擁有與公鑰相匹配的私鑰，只要接受公鑰而且金鑰匹配伺服器就會授予許可。這樣的話，一旦接受了惡意攻擊者的公鑰，那麼系統也會把攻擊者視為合法使用者。

金鑰管理

在類 Unix 系統中，已許可登入的公鑰通常儲存在使用者 /home 目錄的～/.ssh/authorized_keys 檔案中，該檔案只由 SSH 使用。當遠端機器持有公鑰，而本地持有對應私鑰時，登入過程不再需要手動輸入密碼。另外為了額外的安全性，私鑰本身也能用密碼保護。

私鑰會儲存在固定位置，也可以透過命令列引數指定（例如 ssh 命令的 “-i” 選項）。ssh-keygen 是生成金鑰的工具之一。

SSH 也支援基於密碼的身份驗證，此時金鑰是自動生成的。若客戶端和服務端從未進行過身份驗證，SSH 未記錄伺服器端所使用的金鑰，那麼攻擊者可以模仿伺服器端請求並獲取密碼，即中間人攻擊。但是密碼認證可以停用，而且 SSH 客戶端在發現新金鑰或未知伺服器時會向用戶發出警告。

應用

SSH 的經典用途是登入到遠端電腦中執行命令。除此之外，SSH 也支援隧道協議、埠對映和 X11 連線。藉助 SFTP 或 SCP 協議，SSH 還可以傳輸檔案。

SSH 使用客戶端 - 伺服器模型，標準埠為 22。伺服器端需要開啟 SSH 守護程序以便接受遠端的連線，而使用者需要使用 SSH 客戶端與其建立連線。

大多數現代作業系統（包括 macOS、大部分 Linux、OpenBSD、FreeBSD、Solaris 等系統）都提供了 SSH，包括 Windows 系統也提供 SSH 程式（在 Windows 10 1809 版本之後）。在軟體層次，許多關於 SSH 的專有軟體、免費軟體和開源軟體被研發出來，如：

檔案管理軟體（同步、複製、刪除等）。如：PuTTY 和 Windows 下的 WinSCP、類 Unix 系統下的 Konqueror 等。
SSH 客戶端。

從雲計算的角度上講，SSH 能夠阻止一些因直接暴露在網際網路而產生的安全問題，在解決連線問題上發揮了重要作用。SSH 隧道可以在網際網路、防火牆和虛擬機器之間提供一個安全的通道。

歷史

4.1 1.x 版本

芬蘭赫爾辛基理工大學的塔圖・于勒寧發現自己學校存在嗅探密碼的網路攻擊，便於 1995 年編寫了一套保護資訊傳輸的程式，並稱其為 “secure shell”，簡稱 SSH，設計目標是取代先前的、Telnet、FTP 和 rsh 等安全性不足的協議。1995 年 7 月，于勒寧以免費軟體的形式將其釋出。程式很快流行起來，截至 1995 年底，SSH 的使用者數已經達到兩萬，遍佈五十個國家。

1995 年 12 月，于勒寧創立了 SSH 通訊安全公司來繼續開發和銷售 SSH。SSH 的早期版本用到了很多自由軟體，例如 GNU libgmp，但後來由 SSH 公司釋出的版本逐漸變成了專有軟體。

截至 2000 年，已經有兩百萬使用者使用 SSH。

4.2 OpenSSH 和 OSSH

1999 年，開發者們希望使用自由版本的 SSH，於是重新使用較舊的 1.2.12 版本，這也是最後一個採用開放原始碼許可的版本。隨後瑞典程式設計師 Björn Grönvall 基於這個版本開發了 OSSH。不久之後，OpenBSD 的開發者又在 Grönvall 版本的基礎上進行了大量修改，形成了 OpenSSH，並於 OpenBSD 2.6 一起發行。從該版本開始，OpenSSH 又逐漸移植到了其他作業系統上面。

截至 2005 年，OpenSSH 是唯一一種最流行的 SSH 實現，而且成為了大量作業系統的預設元件，而 OSSH 已經過時。OpenSSH 仍在維護，而且已經支援 SSH-2 協議。從 7.6 版開始，OpenSSH 不再支援 SSH-1 協議。

4.3 2.x 版本

2006 年，SSH-2 協議成為了新的標準。與 SSH-1 相比，SSH-2 進行了一系列功能改進並增強了安全性，例如基於迪菲 - 赫爾曼金鑰交換的加密和基於訊息鑑別碼的完整性檢查。SSH-2 還支援透過單個 SSH 連線任意數量的 shell 會話。SSH-2 協議與 SSH-1 不相容，由於更加流行，一些實現（例如 lsh 和 Dropbear）只支援 SSH-2 協議。

4.4 1.99 版

RFC 4253 規定支援 2.0 及以前版本 SSH 的 SSH 伺服器應將其原始版本標為 “1.99”。“1.99” 並不是實際的軟體版本號，而是為了表示向下相容。

4.5 名詞釋義

SSH：泛指 SSH 協定或實現 SSH 之軟體。
SSH-1：SSH 協定版本第 1 版，以資與 SSH-2 區分。其中 1.3 與 1.5 版最常使用，提及時採 SSH-1.3 與 SSH-1.5。
SSH-2：SSH 協定版本第 2 版，以資與 SSH-2 區分，為現行最新版本。
SSH1：專指塔圖・于勒寧所開發 “secure shell” 第 1 版，實作 SSH-1 協定。
SSH2：專指塔圖・于勒寧所開發 “secure shell” 第 2 版，實作 SSH-2 協定，現屬於 SSH Communications Security 該公司所有。
OpenSSH (OpenBSD Secure Shell)：專指基於 secure shell 1.2.12 版分支所開發之軟體，現行版本已停止支援 SSH-1 協定。
OpenSSH /1：OpenSSH 於執行 SSH-1 協定行為代稱。
OpenSSH /2：OpenSSH 於執行 SSH-2 協定行為代稱。

基本架構

SSH 協議框架中最主要的部分是三個協議：

傳輸層協議（The Transport Layer Protocol）：傳輸層協議提供伺服器認證，資料機密性，資訊完整性等的支援。
使用者認證協議（The User Authentication Protocol）：使用者認證協議為伺服器提供客戶端的身份鑑別。
連線協議（The Connection Protocol）：連線協議將加密的資訊隧道複用成若干個邏輯通道，提供給更高層的應用協議使用。

同時還有為許多高層的網路安全應用協議提供擴充套件的支援。

各種高層應用協議可以相對地獨立於 SSH 基本體系之外，並依靠這個基本框架，透過連線協議使用 SSH 的安全機制。

SSH 的安全驗證

在客戶端來看，SSH 提供兩種級別的安全驗證。

第一種級別（基於密碼的安全驗證），知道帳號和密碼，就可以登入到遠端主機，並且所有傳輸的資料都會被 SSH 傳輸層協議加密。但是，可能會有別的伺服器在冒充真正的伺服器，但只要客戶端校驗主機公鑰，在伺服器私鑰不洩露的前提下就能避免被「中間人」攻擊。
第二種級別（基於金鑰的安全驗證），需要依靠金鑰，也就是你必須為自己建立一對金鑰，並把公鑰放在需要訪問的伺服器上。客戶端軟體會向伺服器發出請求，請求用你的私鑰進行安全驗證併發送使用私鑰對會話 ID 等資訊的簽名。伺服器收到請求之後，先在你在該伺服器的使用者根目錄下尋找你的公鑰，然後把它和你傳送過來的公鑰進行比較，並用公鑰檢驗簽名是否正確。如果兩個金鑰一致，且簽名正確，伺服器就認為使用者登入成功。

在伺服器端來看，SSH 也提供安全驗證。

伺服器將自己的公鑰分發給相關的客戶端，並將金鑰交換過程中的公開資訊與協商金鑰的雜湊值的簽名傳送給客戶端，客戶端將獲取的伺服器公鑰計算指紋並與其他安全通道獲得的公鑰指紋相比對並驗證主機簽名。
存在一個金鑰認證中心，所有提供服務的主機都將自己的公鑰提交給認證中心，公鑰認證中心給服務端頒發證書，而任何作為客戶端的主機則只要儲存一份認證中心的公鑰就可以了。在這種模式下，伺服器會發送認證中心提供給主機的證書與主機對金鑰交換過程中公開資訊的簽名。客戶端只需要驗證證書的有效性並驗證簽名。

SSH 協議的可擴充套件性

SSH 協議框架中設計了大量可擴充套件項，比如使用者自定義演算法、客戶自定義金鑰規則、高層擴充套件功能性應用協議。這些擴充套件大多遵循 IANA 的有關規定，特別是在重要的部分，像命名規則和訊息編碼方面。