詳細步驟:在 Azure 中建立和管理對 Linux VM 進行驗證所需的 SSH 金鑰

適用於:✔️ Linux VM ✔️ 彈性擴展集

您可以利用安全殼層 (SSH) 金鑰組,建立使用 SSH 金鑰來進行驗證的 Linux 虛擬機器。 本文說明如何建立和使用 SSH 用戶端連線的 SSH RSA 公開和私密金鑰檔案組。

如果您想要快速命令,而不是更深入的 SSH 金鑰說明,請參閱如何在 Azure 中建立 Linux VM 的 SSH 公開-私密金鑰組

若要建立 SSH 金鑰,並使用這些 SSH 金鑰從 Windows 電腦連線到 Linux VM,請參閱如何在 Azure 上對 Windows 使用 SSH 金鑰。 您也可以使用 Azure 入口網站來建立和管理 SSH 金鑰,以在入口網站中建立 VM。

SSH 和金鑰的概觀

SSH 是已加密連線通訊協定,可透過不安全的連線提供安全登入。 雖然 SSH 提供加密的連線,但使用密碼搭配 SSH 連線仍會讓 VM 容易遭受暴力密碼破解攻擊。 建議您使用公開-私密金鑰組 (也稱為 SSH 金鑰),透過 SSH 連線至 VM。

  • 公開金鑰會放置在 VM 上。

  • 私密金鑰會保留在您的本機系統上。 保護此私密金鑰。 不要共用它。

當您使用 SSH 用戶端連線到 VM (具有公鑰) 時,遠程 VM 會測試用戶端以確保其具有正確的私密金鑰。 如果用戶端具有私密金鑰,則會獲得 VM 的存取權。

根據組織的安全性原則,您可以重複使用單一公用/私密金鑰組來存取多個 Azure VM 和服務。 您想要存取的每個 VM 或服務都不需要各有一對金鑰。

公開金鑰可以與任何人共用,但只有您 (或您的本機安全性基礎結構) 才應該有權存取私密金鑰。

支援的 SSH 金鑰格式

Azure 目前支援 SSH 通訊協定 2 (SSH-2) RSA 公開/私密金鑰組,最小長度為 2048 位元。 不支援其他金鑰格式,例如 ED25519 和 ECDSA。

SSH 金鑰的使用和好處

當您指定公開金鑰以建立 Azure VM 時,Azure 會將此公開金鑰 (以 .pub 的格式) 複製到 VM 上的 ~/.ssh/authorized_keys 資料夾。 ~/.ssh/authorized_keys 中的 SSH 金鑰可確保連線用戶端在 SSH 連線期間呈現對應的私密金鑰。 在使用 SSH 金鑰進行驗證的 Azure Linux VM 中,Azure 會停用 SSH 伺服器的密碼驗證系統,而且只允許 SSH 金鑰驗證。 建立具 SSH 金鑰的 Azure Linux VM,即可協助保護 VM 部署的安全,並免除在 sshd_config 檔案中停用密碼的標準部署後設定步驟。

如果您不想使用 SSH 金鑰,您可以將 Linux VM 設定為使用密碼驗證。 如果您的 VM 並未公開至網際網路,則使用密碼可能就以足夠。 不過,您仍然需要管理每個 Linux VM 的密碼,以及維護狀況良好的密碼原則和作法,例如最小密碼長度和定期系統更新。

利用 ssh-keygen 產生金鑰

若要建立金鑰,一般常會使用的命令是 ssh-keygen,您可以在 Azure Cloud Shell、macOS 或 Linux 主機和 Windows (10 & 11) 中透過 OpenSSH 公用程式來使用此命令。 ssh-keygen 在詢問一系列問題後,便會撰寫私密金鑰和對應的公開金鑰。

依預設,SSH 金鑰會保留在 ~/.ssh 目錄中。 如果您沒有 ~/.ssh 目錄,ssh-keygen 命令會使用正確的權限為您建立。 系統會建立 SSH 金鑰作為資源,並儲存在 Azure 中以供稍後使用。

注意

您也可以在 Azure CLI 中使用 az sshkey create 命令建立金鑰,如產生和儲存 SSH 金鑰所說明。

基本範例

下列 ssh-keygen 命令依預設會在 ~/.ssh 目錄中產生 4096 位元的 SSH RSA 公開和私密金鑰檔案。 如果現有的 SSH 金鑰組存在於目前的位置,系統將會覆寫這些檔案。

ssh-keygen -m PEM -t rsa -b 4096

詳細範例

下列範例說明可建立 SSH RSA 金鑰組的其他命令選項。 如果有 SSH 金鑰組存在於目前的位置,系統將會覆寫這些檔案。

ssh-keygen \
    -m PEM \
    -t rsa \
    -b 4096 \
    -C "azureuser@myserver" \
    -f ~/.ssh/mykeys/myprivatekey \
    -N mypassphrase

命令的說明

ssh-keygen = 用來建立金鑰的程式

-m PEM = 將金鑰格式設定為 PEM

-t rsa = 要建立的金鑰類型,在此案例中採用 RSA 格式

-b 4096 = 金鑰中的位元數,在此案例中為 4096

-C "azureuser@myserver" = 附加至公開金鑰檔案結尾以便輕鬆識別的註解。 通常會以電子郵件地址作為註解,但您可以使用任何最適合您的基礎結構的項目。

-f ~/.ssh/mykeys/myprivatekey = 私密金鑰檔案的檔案名稱 (如果您選擇不使用預設名稱)。 加上 .pub 的對應公開金鑰檔案會產生在相同的目錄中。 目錄必須存在。

-N mypassphrase = 用來存取私密金鑰檔案的其他複雜密碼。

ssh-keygen 的範例

ssh-keygen -t rsa -m PEM -b 4096 -C "azureuser@myserver"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/azureuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/azureuser/.ssh/id_rsa.
Your public key has been saved in /home/azureuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
The key's randomart image is:
+---[RSA 4096]----+
|        .oE=*B*+ |
|          o+o.*++|
|           .oo++*|
|       .    .B+.O|
|        S   o=BO.|
|         . .o++o |
|        . ... .  |
|         ..  .   |
|           ..    |
+----[SHA256]-----+

已儲存的金鑰檔案

Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa

本文中的金鑰組名稱。 依預設會有名為 id_rsa 的金鑰組;有些工具可能會預期私密金鑰的檔案名稱為 id_rsa,所以最好有此金鑰組。 ~/.ssh/ 目錄是 SSH 金鑰組和 SSH 組態檔的預設位置。 如果未指定完整路徑,則 ssh-keygen 會在目前的工作目錄 (而不是預設 ~/.ssh) 中建立金鑰。

~/.ssh 目錄的清單

若要檢視 ~/.ssh 目錄中的現有檔案,請執行下列命令。 如果在目錄中找不到任何檔案,或目錄本身遺失,請確定所有先前的命令都已成功執行。 您可能需要根存取權,才能在特定 Linux 發行版本上修改此目錄中的檔案。

ls -al ~/.ssh
-rw------- 1 azureuser staff  1675 Aug 25 18:04 id_rsa
-rw-r--r-- 1 azureuser staff   410 Aug 25 18:04 id_rsa.pub

金鑰複雜密碼

Enter passphrase (empty for no passphrase):

「強烈」建議您為私密金鑰加上複雜密碼。 若未使用複雜密碼來保護金鑰檔案,任何人只要擁有該檔案,就可以用它登入具有對應公開金鑰的任何伺服器。 新增複雜密碼可提升防護能力,以防有人能夠取得您的私密金鑰檔案,讓您有時間變更金鑰。

在部署期間自動產生金鑰

如果您使用 Azure CLI 來建立您的 VM,便可以執行 az vm create 命令加上 --generate-ssh-keys 選項,以選擇性地產生 SSH 公開金鑰與私密金鑰檔案。 金鑰儲存在 ~/.ssh 目錄中。 請注意,如果金鑰已存在於該位置 (例如包含一些預先設定的計算資源庫映像),則此命令選項不會覆寫金鑰。

部署 VM 時,提供 SSH 公開金鑰

若要建立使用 SSH 金鑰進行驗證的 Linux VM,請在使用 Azure 入口網站、CLI、Resource Manager 範本或其他方法建立 VM 時,提供您的 SSH 公開金鑰。 使用入口網站時,您必須輸入公用金鑰本身。 如果您使用 Azure CLI 搭配現有公開金鑰來建立 VM,可執行 az vm create 命令加上 --ssh-key-value 選項,以指定這個公開金鑰的值或位置。

如果您不熟悉 SSH 公開金鑰的格式,則可以如下所示執行 cat,並以自己的公開金鑰檔案位置取代 ~/.ssh/id_rsa.pub,即可看到公開金鑰:

cat ~/.ssh/id_rsa.pub

輸出如下 (下方截斷的範例):

ssh-rsa XXXXXXXXXXc2EAAAADAXABAAABAXC5Am7+fGZ+5zXBGgXS6GUvmsXCLGc7tX7/rViXk3+eShZzaXnt75gUmT1I2f75zFn2hlAIDGKWf4g12KWcZxy81TniUOTjUsVlwPymXUXxESL/UfJKfbdstBhTOdy5EG9rYWA0K43SJmwPhH28BpoLfXXXXXG+/ilsXXXXXKgRLiJ2W19MzXHp8z3Lxw7r9wx3HaVlP4XiFv9U4hGcp8RMI1MP1nNesFlOBpG4pV2bJRBTXNXeY4l6F8WZ3C4kuf8XxOo08mXaTpvZ3T1841altmNTZCcPkXuMrBjYSJbA8npoXAXNwiivyoe3X2KMXXXXXdXXXXXXXXXXCXXXXX/ azureuser@myserver

如果您複製公開金鑰檔案的內容,並將其貼到 Azure 入口網站或 Resource Manager 範本中,請確定您並未複製任何額外的空白字元或導入額外的分行符號。 例如,如果您使用 macOS,則可以透過管道將公開金鑰檔案 (預設為 ~/.ssh/id_rsa.pub) 傳送至 pbcopy 以複製內容 (另有其他 Linux 程式可執行相同作業,例如 xclip)。

如果您想要使用多行格式的公開金鑰,您可以從您先前建立的公開金鑰在 pem 容器中產生 RFC4716 格式化金鑰。

若要從現有的 SSH 公開金鑰建立 RFC4716 格式的金鑰︰

ssh-keygen \
-f ~/.ssh/id_rsa.pub \
-e \
-m RFC4716 > ~/.ssh/id_ssh2.pem

從 SSH 用戶端透過 SSH 連線至您的 VM

公開金鑰已部署到您的 Azure VM 且私密金鑰儲存在本機系統中,此時可以使用 VM 的 IP 位址或 DNS 名稱,透過 SSH 連線到您的 VM。 將下列命令中的 azureusermyvm.westus.cloudapp.azure.com 換成系統管理員使用者名稱和完整網域名稱 (或 IP 位址):

ssh azureuser@myvm.westus.cloudapp.azure.com

如果您在建立金鑰組時提供了複雜密碼,請在登入程序期間出現提示時輸入複雜密碼 (伺服器會新增至 ~/.ssh/known_hosts 資料夾,而且系統不會要求您重新連線,除非 Azure VM 上的公開金鑰有變更或伺服器名稱已從 ~/.ssh/known_hosts 中移除)。

如果 VM 使用 Just-In-Time 存取原則,您必須先要求權限,才能連線到 VM。 如需 Just-In-Time 原則的詳細資訊,請參閱使用 Just-In-Time 原則管理虛擬機器存取

使用 ssh-agent 儲存您的私密金鑰複雜密碼

若要避免在每次 SSH 登入時輸入私密金鑰檔案複雜密碼,您可以使用 ssh-agent 來快取您本地系統上的私密金鑰檔案複雜密碼。 如果您使用 Mac,則 macOS 金鑰鏈會在您叫用 ssh-agent時安全地儲存私密金鑰複雜密碼。

確認並使用 ssh-agentssh-add 為 SSH 系統提供金鑰檔案的相關資訊,您即無須以互動方式使用複雜密碼。

eval "$(ssh-agent -s)"

現在使用 ssh-add 命令將私密金鑰加入至 ssh-agent

ssh-add ~/.ssh/id_rsa

私密金鑰複雜密碼現已儲存在 ssh-agent 中。

使用 ssh-copy-id 將金鑰複製到現有 VM

如果您已經建立 VM,您可以使用 ssh-copy-id 將新的 SSH 公開金鑰新增至 Linux VM。

ssh-copy-id -i ~/.ssh/id_rsa.pub azureuser@myserver

建立和設定 SSH 組態檔

您可以建立及設定 SSH 組態檔 (~/.ssh/config) 以加速登入,並最佳化您的 SSH 用戶端行為。

下列範例說明可讓您以使用者身分使用預設的 SSH 私密金鑰快速登入特定 VM 的簡易設定。

建立檔案。

touch ~/.ssh/config

編輯檔案以新增 SSH 組態

vim ~/.ssh/config

為您的主機 VM 新增適當的組態設定。 在此範例中,VM 名稱 (主機) 是 myvm,帳戶名稱 (使用者) 是 azureuser,而 IP 位址或 FQDN (主機名稱) 是 192.168.0.255。

# Azure Keys
Host myvm
  Hostname 192.168.0.255
  User azureuser
# ./Azure Keys

您可以新增其他主機的組態,讓每個主機使用其本身的專用金鑰組。 如需進階組態選項,請參閱 SSH 組態檔

您現在已擁有 SSH 金鑰組和設定好的 SSH 組態檔,因此能夠快速且安全地遠端存取 Linux VM。 當您執行下列命令時,SSH 會從 SSH 組態檔的 Host myvm 區塊中找出並載入任何設定。

ssh myvm

第一次使用 SSH 金鑰登入伺服器時,命令會提示您輸入該金鑰檔案的複雜密碼。

下一步

接下來是使用新的 SSH 公開金鑰建立 Azure Linux VM。 相較於以預設登入方法密碼建立的 VM,以 SSH 公開金鑰作為登入所建立的 Azure VM 比較安全。