OpenSSH 金鑰管理

適用于 Windows server 2019、Windows 10: Windows Server 2022、

Windows 環境中的大部分驗證都是使用使用者名稱-密碼組來完成,這對共用通用網域的系統很有作用。 在跨網域(例如內部部署和雲端裝載的系統)之間工作時,它會容易遭受暴力密碼破解入侵。

相較之下,Linux 環境通常會使用公開金鑰/私密金鑰組來驅動驗證,不需要使用可猜測的密碼。 OpenSSH 包含可協助支援此操作的工具,特別是:

  • ssh-keygen,用來產生安全金鑰
  • ssh-agentssh-add,用來安全地儲存私密金鑰
  • scpsftp,在初始使用伺服器期間安全地複製公開金鑰檔案

本檔概述如何在 Windows 上使用這些工具,開始使用金鑰型驗證搭配 SSH。 如果您不熟悉 SSH 金鑰管理,強烈建議您參閱 NIST 檔 IR 7966 標題為「使用安全殼層 (SSH) 的互動式和自動化存取管理的安全性」。

關於金鑰組

金鑰組指的是特定驗證通訊協定所使用的公開和私密金鑰檔案。

SSH 公開金鑰驗證會使用非對稱式密碼編譯演算法來產生兩個金鑰檔–一個「私用」和另一個「公用」。 私密金鑰檔案相當於密碼,且在所有情況下都應受到保護。 如果有人取得您的私密金鑰,他們就可以登入您有權存取的任何 SSH 伺服器。 公開金鑰是放在 SSH 伺服器上的金鑰,而且可以在不危及私密金鑰的情況下共用。

搭配 SSH 伺服器使用金鑰驗證時,SSH 伺服器和用戶端會比較針對私密金鑰提供的使用者名稱的公開金鑰。 如果無法根據用戶端私密金鑰驗證伺服器端公開金鑰,驗證就會失敗。

在產生金鑰組時輸入複雜密碼,即可使用金鑰組來執行多重要素驗證 (請參閱以下) 的 使用者金鑰產生 。 在驗證期間,系統會提示使用者輸入複雜密碼,該密碼會與 SSH 用戶端上的私密金鑰一起用來驗證使用者。

主機金鑰產生

公開金鑰具有特定的 ACL 需求,在 Windows 上等同於只允許系統管理員和系統的存取權。 第一次使用 sshd 時,將會自動產生主機的金鑰組。

重要

您必須先安裝 OpenSSH 伺服器。 請參閱 OpenSSH 入門

依預設,sshd 服務會設定為手動啟動。 若要在每次伺服器重新開機時啟動它,請從伺服器上提高許可權的 PowerShell 提示字元執行下列命令:

# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Now start the sshd service
Start-Service sshd

因為沒有任何使用者與 sshd 服務相關聯,所以主機金鑰會儲存在 C:\ProgramData\ssh。

使用者金鑰產生

若要使用以金鑰為基礎的驗證,您必須先為您的用戶端產生公開/私密金鑰組。 ssh-keygen.exe 用來產生金鑰檔案,而且可以指定 DSA、RSA、ECDSA 或 Ed25519 的演算法。 如果未指定任何演算法,則會使用 RSA。 應該使用強式演算法和金鑰長度,例如此範例中的 Ed25519。

若要使用 Ed25519 演算法來產生金鑰檔,請從您用戶端上的 PowerShell 或命令提示字元執行下列命令:

ssh-keygen -t ed25519

這應該會顯示下列 (,其中 "username" 會取代為您的使用者名稱) :

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username\.ssh\id_ed25519):

您可以按下 Enter 接受預設值,或指定您想要產生金鑰的路徑和/或檔案名。 此時,系統會提示您使用複雜密碼來加密您的私密金鑰檔案。 這可以是空的,但不建議使用。 複雜密碼適用于金鑰檔,以提供雙重要素驗證。 在此範例中,我們會將複雜密碼保留空白。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username\.ssh\id_ed25519.
Your public key has been saved in C:\Users\username\.ssh\id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@server@LOCAL-HOSTNAME

The key's randomart image is:
+--[ED25519 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

現在,您在指定的位置中有公開/私用的 Ed25519 金鑰組。 .Pub 檔案是公開金鑰,而且沒有副檔名的檔案是私密金鑰:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 ed25519
-a----         6/3/2021   2:55 PM            103 ed25519.pub

請記住,私密金鑰檔案相當於密碼,應該與保護密碼的方式一樣加以保護。 為了協助您進行這項操作,請使用 ssh-agent 安全地將私密金鑰儲存在 Windows 安全性內容中,並與您的 Windows 登入產生關聯。 若要這麼做,請以系統管理員身分啟動 ssh-agent 服務,並使用 ssh-add 來儲存私密金鑰。

# By default the ssh-agent service is disabled. Allow it to be manually started for the next step to work.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Manual

# Start the service
Start-Service ssh-agent

# This should return a status of Running
Get-Service ssh-agent

# Now load your key files into ssh-agent
ssh-add ~\.ssh\id_ed25519

完成這些步驟之後,每當此用戶端需要私密金鑰來進行驗證時,ssh-agent 就會自動擷取本機私密金鑰,並將它傳遞給您的 SSH 用戶端。

重要

強烈建議您將私密金鑰備份至安全的位置,然後在將它新增至 ssh-agent 之後,從本機系統將它刪除。 無法從提供強式演算法的代理程式抓取私密金鑰,例如在此範例中的 Ed25519。 如果您失去私密金鑰的存取權,就必須建立新的金鑰組,並在您互動的所有系統上更新公開金鑰。

部署公開金鑰

若要使用上述建立的使用者金鑰,您的公開金鑰 (~ \ id_ed25519 .pub) 的內容必須放在伺服器上的文字檔、名稱和位置,取決於使用者帳戶是本機系統管理員群組的成員,還是標準使用者帳戶的成員。

標準使用者

您的公開金鑰 (~ \ . ssh \ id_ed25519 .pub) 的內容必須放在伺服器上,並放在 C:\Users\username 的文字檔 authorized_keys 中 \ 。 \ OpenSSH 用戶端包含 scp (這是安全的檔案傳輸公用程式),可協助進行此工作。

下列範例會將公開金鑰複製到伺服器 (其中的 "username" 取代為您的使用者名稱) 。 您必須一開始就使用伺服器的使用者帳戶密碼。

# Make sure that the .ssh directory exists in your server's user account home folder
ssh username@domain1@contoso.com mkdir C:\Users\username\.ssh\

# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:\Users\username\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\Users\username\.ssh\authorized_keys

系統管理使用者

您的公開金鑰 (~ \ . ssh \ id_ed25519 .pub) 的內容必須放置在伺服器上,以 C:\ProgramData\ssh 的文字檔 administrators_authorized_keys \ 。 OpenSSH 用戶端包含 scp (這是安全的檔案傳輸公用程式),可協助進行此工作。 此檔案上的 ACL 必須設定為只允許系統管理員和系統的存取權。

下列範例會將公開金鑰複製到伺服器,並設定 ACL (,其中 "username" 會取代為您的使用者名稱) 。 您必須一開始就使用伺服器的使用者帳戶密碼。

注意

此範例顯示建立的步驟 administrators_authorized_keys file 。 如果執行多次,則每次都會覆寫此檔案。 若要新增多個系統管理使用者的公開金鑰,您需要使用每個公開金鑰附加此檔案。

# Make sure that the .ssh directory exists in your server's user account home folder
ssh user1@domain1@contoso.com mkdir C:\ProgramData\ssh\

# Use scp to copy the public key file generated previously on your client to the authorized_keys file on your server
scp C:\Users\username\.ssh\id_ed25519.pub user1@domain1@contoso.com:C:\ProgramData\ssh\administrators_authorized_keys

# Appropriately ACL the authorized_keys file on your server
ssh --% user1@domain1@contoso.com icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

這些步驟會完成在 Windows 上搭配 OpenSSH 使用以金鑰為基礎的驗證所需的設定。 然後,使用者就可以從任何具有私密金鑰的用戶端連線到 sshd 主機。