檢視原始碼 術語
一般資訊
以下將解釋可能造成混淆的術語。
「使用者」一詞
「使用者」是一個大家都能直覺理解的術語。然而,不同人對它的理解可能有所不同,這可能會造成混淆。
在 OpenSSH 和 Erlang/OTP 中的 SSH 中,該術語的使用方式有所不同。原因在於不同的環境和使用案例,這些並非顯而易見。
本章旨在解釋這些差異,並說明 Erlang/OTP 為何如此處理「使用者」。
在 OpenSSH 中
許多人曾在 Linux 機器(或類似機器)上使用 'ssh' 命令遠端登入另一台機器。輸入
ssh host
即可登入名為 host
的機器。命令會提示您輸入遠端 host
上的密碼,然後您就可以根據您的使用者名稱在遠端 host
上擁有的權限進行讀取、寫入和執行。還有更強大的變體,使用預先分發的金鑰或憑證,但這只是身份驗證過程中的細節。
您可以使用
ssh anotheruser@host
以使用者 anotheruser
的身份登入,如果您已正確授權,則可以在 host
上以 anotheruser
的身份執行操作。
那麼,「您的使用者名稱具有權限」是什麼意思?在 UNIX/Linux 等環境中,它的含義與該環境中的含義完全相同:使用者可以根據作業系統規則讀取、寫入和執行程式。此外,使用者還有一個主目錄($HOME
),以及一個包含 SSH 特定檔案的 $HOME/.ssh/
目錄。
SSH 密碼驗證
當 SSH 嘗試登入主機時,SSH 協議會傳輸使用者名稱(字串)和密碼。遠端 SSH 伺服器會檢查是否定義了該使用者,以及提供的密碼是否可接受。
如果符合,則授權使用者。
SSH 公開金鑰驗證
這是一種更強大的方法,SSH 協議會傳輸使用者名稱、使用者的公開金鑰和一些加密資訊,在此我們可以忽略這些資訊。
遠端主機上的 SSH 伺服器會檢查
- 使用者是否有主目錄、
- 該主目錄是否包含 .ssh/ 目錄,以及
- .ssh/ 目錄是否包含剛在
authorized_keys
檔案中收到的公開金鑰
如果符合,則授權使用者。
成功驗證後,UNIX/Linux 等系統上的 SSH 伺服器會執行以下操作:
成功驗證連入請求後,新的程序會以剛驗證的使用者身份執行。
下一步是根據 SSH 請求啟動服務。如果請求使用 shell,則會啟動一個新的 shell,處理從用戶端(即「您」)傳來的作業系統命令。
如果是 sftp 請求,則會以使用者的權限啟動 sftp 伺服器。因此,如果允許該使用者,則可以讀取、寫入或刪除檔案。
在 Erlang/OTP SSH 中
對於 Erlang/OTP SSH 伺服器,情況有所不同。伺服器在 Erlang 模擬器中的 Erlang 程序中執行,而 Erlang 模擬器又在作業系統程序中執行。當透過 SSH 協定驗證身份時,模擬器不會嘗試變更其使用者。因此,遠端使用者名稱僅在 Erlang/OTP SSH 應用程式中用於驗證目的。
Erlang SSH 中的密碼驗證
Erlang/OTP SSH 伺服器會依以下順序檢查使用者名稱和密碼:
- 如果定義了
pwdfun
,則會呼叫它,而傳回的布林值就是驗證結果。 - 否則,如果定義了
user_passwords
選項,並且使用者名稱和密碼相符,則驗證成功。 - 否則,如果定義了
password
選項,且與密碼相符,則驗證成功。請注意,不建議在非測試程式碼中使用此選項。
Erlang SSH 中的公開金鑰驗證
用戶端傳送的使用者名稱、公開金鑰和加密資料(簽章)會如下使用(為了清楚起見,省略了一些步驟):
- 會使用
key_cb
選項來選取回呼模組。 - 回呼模組會用於檢查提供的公開金鑰是否為使用者預先儲存的金鑰之一。如果使用預設回呼模組,則會在以下順序找到的目錄中搜尋檔案
authorized_keys
和authorized_keys2
:
- 如果定義了選項
user_dir_fun
,則會呼叫該函式,並使用傳回的目錄、 - 否則,如果定義了選項
user_dir
,則會使用該目錄、 - 否則,會使用執行 Erlang 模擬器作業系統程序之使用者主目錄中的
.ssh
子目錄。
如果找不到提供的公開金鑰,則驗證失敗。
- 最後,如果找到提供的公開金鑰,則會使用公開金鑰檢查用戶端提供的簽章。
成功驗證後,Erlang/OTP SSH 伺服器會執行以下操作:
成功驗證後,Erlang 程序會處理來自遠端 SSH 用戶端的服務請求。該程序的權限與執行 Erlang 模擬器的作業系統程序的權限相同。
如果伺服器收到 shell 服務請求,則會在伺服器的模擬器中開啟一個 Erlang shell。該 shell 中的權限與剛驗證的使用者無關。
如果是 sftp 請求,則會以 Erlang 模擬器作業系統程序的使用者權限啟動 sftp 伺服器。因此,使用 sftp 時,驗證的使用者不會影響權限。
因此,在驗證之後,使用者名稱不會再使用,也沒有任何影響。