Secure Shell

安全外殼協議（Secure Shell Protocol，簡稱SSH）是一種加密的網路傳輸協議，可在不安全的網路中為網路服務提供安全的傳輸環境。SSH通過在網路中建立安全隧道來實現SSH客戶端與伺服器之間的連接。

SSH最常見的用途是遠程登錄系統，人們通常利用SSH來傳輸命令行界面和遠程執行命令。雖然SSH最初在類Unix系統中普及，但隨著微軟在Windows 10內部版本1809和Windows Server 2019及後續版本中原生集成OpenSSH，Windows現已全面支持SSH的客戶端與服務端功能。2015年，微軟宣布將在未來的作業系統中提供原生SSH協議支持，Windows 10 1803版本已提供OpenSSH工具。

在設計上，SSH是Telnet和非安全shell的替代品。Telnet和Berkeley rlogin、rsh、rexec等協議採用明文傳輸，使用不可靠的密碼，容易遭到監聽、嗅探和中間人攻擊。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隧道可以在網際網路、防火牆和虛擬機之間提供一個安全的通道。

## 歷史

### 1.x版本

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

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

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

### 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協議。

### 2.x版本

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

### 1.99版

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

### 名詞釋義

- 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的有關規定，特別是在重要的部分，像命名規則和消息編碼方面。

## 外部連結

- SSH Communications Security Corporation的網站
- OpenSSH組織的網站
- IANA的標準及組織
- RFC4251:The Secure Shell (SSH) Protocol Architecture