4.2. SSH:安全網路作業

隨著有愈來愈多的電腦安裝在網路環境中,通常會需要從遠端位置存取主機。這通常是指使用者會傳送登入與密碼字串以供驗證。只要這些字串是以純文字傳送,它們就有可能被攔截和濫用以取得使用者帳戶的存取權,而授權的使用者卻完全未察覺。除了這將會把使用者的所有檔案暴露給攻擊者之外,不合法的帳戶有可能取得管理員或 root 存取權,或是滲透其他的系統。在過去,遠端連線是使用 telnet 建立,它並未提供對抗監聽加密形式或其他安全性機制的防護。有一些通訊通道是未防護的,像是傳統的 FTP 通訊協定以及某些遠端的複製程式。

SSH 套裝軟體可以提供必要的保護,即加密驗證字串 (通常是登入名稱與密碼) 以及所有在主機間的其他資料交換。有了 SSH,即使第三方記錄了資料流,但是內容已被加密,除非知道加密金鑰,否則無法將內容回復至純文字。因此 SSH 可以在非安全的網路上啟用安全通訊,例如網際網路。SUSE Linux 隨附的 SSH 為 OpenSSH。

4.2.1. OpenSSH 套件

SUSE Linux 預設會安裝 OpenSSH 套件。ssh、scp 以及 sftp 程式就變成了 telnet、rlogin、rsh、rcp 以及 ftp 的替代程式。在預設的組態中,只有使用 OpenSSH 公用程式且防火牆允許時,才能存取 SUSE Linux 系統。

4.2.2. ssh 程式

使用 ssh 程式,就有可能登入遠端系統並互動式地工作。它會取代 telnet 與 rlogin。slogin 程式只是指向 ssh 的符號連結。例如,使用 ssh  sun 指令登入 Sun 主機。該主機接著會提示輸入 Sun 的密碼。

在成功地驗證後,即可使用遠端指令行,或使用互動式應用程式,例如 YaST。如果本地使用者名稱與遠端使用者名稱不同,您可以使用不同的登入名稱加上 ssh  -l augustine sunssh  augustine@sun

此外,ssh 提供從遠端系統上執行指令 (亦即 rsh) 的可能性。在下列範例中,在 Sun 主機上執行 uptime 指令,並建立名稱為 tmp 的目錄。程式輸出會顯示在 Earth 主機的本地終端機上。

ssh otherplanet "uptime; mkdir tmp" 
tux@otherplanet's password:
1:21pm  up  2:17,  9 users,  load average: 0.15, 0.04, 0.02

在這裏需要使用引號以使用一個指令傳送兩個指示。只有執行此動作,第二個指令才可以在 Sun 上執行。

4.2.3. scp--安全的複製

scp 會將檔案複製到遠端機器。它是 rcp 的安全與加密的替代程式。例如,scp  MyLetter.tex sun:從 Earth 主機將 MyLetter.tex 檔案複製到 Earth 主機。如果在 Earth 上的使用者名稱與 Sun 上的使用名稱不相同,請使用 username@host 格式指定後者的使用者名稱。此指令並沒有 -l 的選項。

在輸入正確的密碼後,scp 會啟動資料傳輸並顯示逐漸變長的星號列,以模擬進度列。除此之外,程式會永遠在進度列的右邊顯示到達的估計時間。指定 -q 選項以抑制所有的輸出。

scp 也會為整個目錄提供遞迴複製功能。scp  -r src/ sun::backup/ 指令會複製 src 目錄的整個內容 (包括所有的子目錄) 至 Sun 主機上的 backup 目錄。如果這個子目錄不存在,就不會自動建立。

-p 選項會指示 scp 保留未變更檔案的時間戳記。-C 可以壓縮資料傳輸。這可能會減少要傳輸的資料量,但是會造成處理器更重的負擔。

4.2.4. sftp--安全的檔案傳輸

可以使用 sftp 程式取代 scp,以進行安全的檔案傳輸。在 sftp 工作階段期間,可以使用許多已知的 ftp 指令。sftp 程式可能是比 scp 更好的選擇,特別是在傳輸未知檔名的資料時。

4.2.5. SSH 精靈 (sshd) 伺服器端

若要使用 SSH 用戶端程式 ssh 與 scp,伺服器 (SSH 精靈) 必須在背景執行,監聽 TCP/IP port 22 的連線。精靈會在第一次啟動時產生三個金鑰組合。每個金鑰組合都是由私密與公用金鑰所組成。 因此,此程序可稱為公用金鑰式。為了保證透過 SSH 通訊的安全性,必須限制只有系統管理員可以存取私密金鑰檔。預設安裝會據此設定檔案權限。SSH 精靈只有在本地上需要私密金鑰,而且絕對不能將它給予任何人。公用金鑰元件 (以 .pub 的副檔名來識別) 會傳送至要求連線的用戶端。它們可讓所有的使用者讀取。

SSH 用戶端所啟始的連線。等待 SSH 精靈與要求 SSH 用戶端交換識別資料,以比較通訊協定與軟體版本,並防止透過錯誤埠的連線。因為原始 SSH 精靈的子處理序會回覆要求,所以可以同時建立數個 SSH 連線。

至於 SSH 伺服器與 SSH 用戶端之間的通訊,OpenSSH 可以支援 SSH 通訊協定的版本1 與 2。新安裝的 SUSE Linux 系統預設值為版本 2。若要在更新後繼續使用版本 1,請遵照在 /usr/share/doc/packages/openssh/README.SuSE 中的指示。這個文件也描述如何只執行一些步驟,即將 SSH 1 環境轉換成工作 SSH 2 環境。

當使用 SSH 的版本 1 時,伺服器會傳送每小時由 SSH 精靈重新產生的公用主機金鑰與伺服器金鑰。這兩者都允許 SSH 用戶端加密自由選擇的工作階段金鑰,並且會將它傳送至 SSH 伺服器。SSH 用戶端也會指示伺服器要使用的加密方法 (密碼)。

SSH 通訊協定的版本 2 並不需要伺服器金鑰。兩邊都是使用根據 Diffie-Helman 的演算法來交換金鑰。

私密主機與伺服器金鑰絕對需要解密工作階段的金鑰,而且不能從公用部份產生。只有連絡的 SSH 精靈可以使用私密金鑰解密工作階段金鑰 (請參閱 man /usr/share/doc/packages/openssh/RFC.nroff)。若要仔細監看此啟始連線階段,可以開啟 SSH 用戶端的 -v 詳細偵錯選項。

預設會使用 SSH 通訊協定的版本 2。使用 -1 參數即可覆寫此預設以使用通訊協定的版本 1。用戶端會在第一次與遠端主機連繫後,將所有的公用主機金鑰儲存在 ~/.ssh/known_hosts 中。這將可防止外來的 SSH 伺服器進行「在中間攔截的攻擊」 (外部 SSH 伺服器使用假冒的名稱與 IP 位址)。這類的攻擊通常都是由下列方式所偵測出來:在 ~/.ssh/known_hosts 中未包含主機金鑰,或伺服器在缺少適當的私密對照組時無法解密工作階段的金鑰。

建議將儲存在 /etc/ssh/ 中的私密與公用金鑰備份在安全的外部位置。以此方式,就可以偵測出金鑰的修改,並且可以在重新安裝後,再度使用舊的金鑰。這可讓使用者避免收到任何擾人的警告。儘管出現警告,但是如果已確認它確實是正確的 SSH 伺服器,就必須從 ~/.ssh/known_hosts 移除關於此系統的現有項目。

4.2.6. SSH 驗證機制

目前以最簡單的形式所執行的實際驗證,是由上方所提及的輸入密碼所組成。SSH 的目標就是要引進安全且易於使用的軟體。因為它是用以取代 rsh 與 rlogin,SSH 也必須能夠提供適於平日使用的驗證方法。SSH 是藉由使用者所產生的另一個金鑰組合來完成此動作。SSH 套件為此提供了說明程式:ssh-keygen。在輸入 ssh-keygen  -t rsassh-keygen -t dsa 之後,就會產生金鑰組合,而且會提示您輸入儲存金鑰的基本檔案名稱。

確認預設值並回覆通關密語的要求。即使軟體建議空白的通關密語,一般建議輸入 10 至 30 個字元的文字以描述在此的程序。請勿使用簡短的文字或片語。重複通關密語以確認。接著,您將會看到儲存私密與公用金鑰的位置,在此例中,為 id_rsaid_rsa.pub 檔案。

使用 ssh-keygen  -p -t rsassh-keygen -p -t dsa 以變更舊的通關密語。複製公用金鑰元件 (在範例中為 id_rsa.pub) 至遠端機器,並將它儲存至 ~/.ssh/authorized_keys。下次建立連線時,將會要求您驗證自己的通關密語。如果沒有要求您驗證,請驗證這些檔案的位置與內容。

就長期而言,此程序比每次給密碼更為麻煩。因此,SSH 套件提供另一個工具:ssh-agent。此工具可保留了 X 工作階段期間的私密金鑰。整個 X 工作階段是啟動成 ssh-agent 的子處理序。執行這個的最簡單的方法就是在 .xsession 檔案的開頭將 usessh 變數設為 yes,並透過顯示管理員 (例如 KDM 或 XDM) 登入。或者,輸入 ssh-agent  startx

現在您可以照常使用 ssh 或 scp。如果您已依照上方所述配送公用金鑰,就不會再提示您輸入密碼。請利用 xlock 之類的密碼保護應用程式,來終止或鎖定 X 工作階段。

在推出 SSH 通訊協定版本 2 後所造成的相關變更,也記載在 /usr/share/doc/packages/openssh/README.SuSE 檔案中。

4.2.7. X,驗證與轉寄機制

除了先前所述的安全性相關改善之外,SSH 也會簡化遠端 X 應用程式的使用。如果您以 -X 選項執行 ssh,就會自動在遠端機器上設定 DISPLAY 變數,而且所有的 X 輸出都會透過現有的 SSH 連線輸出至遠端機器。同時,未獲授權的個體將無法攔截以此方式檢視,並在遠端和本地上啟動的 X 應用程式。

透過新增 -A 選項,ssh-agent 驗證機制就會延續至下一部機器。以此方式,您不需輸入密碼就可以在不同的機器上工作,但僅限於您已配送公用金鑰至目的主機並將它適當地儲存在主機上。

兩種機制都是在預設值中停用,但是也可以隨時在整個系統的 /etc/ssh/sshd_config 組態檔中或使用者的 ~/.ssh/config 中啟動。

ssh 也可以用於重新導向 TCP/IP 連線。在下列範例中,設定 SSH 分別重新導向 SMTP 與 POP3 埠:

ssh -L 25:sun:25 earth

使用此指令後,任何導向 Earth 埠 25 (SMTP) 的連線都會透過加密通道重新導向至 Earth 上的 SMTP 埠。這對於那些使用 SMTP 伺服器但卻沒有 SMTP-AUTH 或 POP-before-SMTP 功能的連線特別有用。從任何連線至網路的位置,都可以將電子郵件傳送至「主」郵件伺服器以進行傳遞。同樣地,在 Earch 上的所有 POP3 要求 (埠110) 都可以使用此指令轉寄至 Sun 的 POP3 埠:

ssh -L 110:sun:110 earth

兩個指令都必須以 root 的身份執行,因為該連線必須以有權限的本地埠建立。電子郵件是由一般的使用者在現有的 SSH 連線中傳送和擷取。SMTP 與 POP3 主機都必須設成 localhost 才能正常運作。上方所述的每個程式的其他資訊都可以在手冊頁面中找到,也可以在 /usr/share/doc/packages/openssh 下的檔案中找到。