Sign in with Microsoft
Sign in or create an account.
Hello,
Select a different account.
You have multiple accounts
Choose the account you want to sign in with.

摘要

Microsoft Azure 平台除了讓使用者提供自己的 SSH 金鑰組進行驗證之外,還藉助 SSH 金鑰組來啟用在部署時加入虛擬機機 (VM) 的部分功能。 我們最近發現,在部分有限的狀況下,Azure 平台憑證的公開金鑰可能會意外加入 .ssh/authorized_keys 檔案中。 這些狀況涉及的範圍僅限於使用 cloud-init 佈建 VM 的情境,而且使用者選擇使用藉助憑證的其他 Azure 功能,例如系統管理的服務識別。

由於特定作業系統的佈建邏輯出現變動,因此發生此意外行為。 這些系統使用 cloud-init,並且在 VM 建立期間,將 VM 可用之所有憑證的公開金鑰意外安裝到 ssh 授權金密檔案。  

如需深入瞭解,請前往 CVE-2019-0816

其他相關資訊

狀況詳細資料

除了公開預覽 RHEL 7.4/7.5/7.6 和 CentOS 7.4 cloud-init 映像之外,「摘要」部分提及的 cloud-init 邏輯目前已存在於 Ubuntu 18.04 的 Azure 映像中, 也可能存在於使用這些作業系統的自訂映像中。 
 
佈建其中一個 Linux 映像時,若啟用以下其中一項功能,可能會在 .ssh/authorized_keys 檔案中看到其他意外的金鑰,例如: 

  • 受控識別

  • 含保護設定的延伸

  • 在 VM 中部署含金鑰保存庫金鑰的 VM

識別並修復現有 VM

識別

若要檢查您是否擁有其他金鑰,請檢閱授權金鑰檔案 (vi .ssh/authorized_keys 檔案),確定是否加入了不’打算加入的任何金鑰。

您可放心手動移除可能已加入的任何 ssh 公開金鑰, 這對於與 VM 一起部署的功能不會有任何影響。 此外,這對於驗證所需的特定 SSH 金鑰組而言,也不會有任何影響。

如果您不知道或無法區分 .ssh/authorized_keys 檔案中用於驗證的公開金鑰為何,請按照以下步驟操作: 

  1. 檢閱部署範本:

    1. ssh 公開金鑰

    2. cloud-init 組態中的 ssh 金鑰

  2. 如果您擁有 sudo/root 存取權限,請在 VM 建立時,從 VM 內部擷取已部署的 ssh 金鑰。 若要執行這項操作,請依照下列步驟執行:

    1. 檢查在 CustomData 中傳遞的 cloud-init 組態: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
      使用 CustomData 值,然後使用 base64 解碼取得您部署的公開金鑰: echo "<customData value>" | base64 -D

    2. 或者,檢查 Instance Meta Data Service (IMDS),查看在 VM Create 的 ssh 公開金鑰屬性中傳遞的 ssh 公開金鑰: curl -H Metadata:true "http://169.254.169.254/metadata/instance/compute/publicKeys?api-version=2018-04-02&format=json"

修復

如果您已找出不打算部署到 VM 的其他憑證,只要從 authorized_keys 檔案清除這些憑證的對應行,即可移除憑證。

以互動方式連接 VM 以執行修復,或在多個 VM 上使用自訂指令碼延伸或 RunCommand。

使用含保護設定或受控識別的延伸來部署 VM

在使用延伸或受控識別部署 VM 的憑證中,使用以下指令碼移除公開金鑰。 這個動作不會移除部署 VM 時指定的金鑰,即使 VM 是使用金鑰保存庫金鑰來部署也一樣。

重要

執行此指令碼前,建議您先備份 authorized_keys 檔案。

 

#!/bin/bash
set -e

# /var/lib/waagent has *.crt files that include the crt files corresponding to 
# the user provided public keys and one additional .crt file from MSI.
# This script converts the content of the .crt file into the ssh public key and
# remove it from the authorized_keys file
readarray -t CRT_FILES < <(grep -l -E "(Microsoft.ManagedIdentity|Windows Azure)" /var/lib/waagent/*.crt)
for ((i=0; i < ${#CRT_FILES[@]}; i++))
do
    PUBKEY=$(openssl x509 -in "${CRT_FILES[$i]}" -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8)
    sed -i -e "\@$PUBKEY@d" $HOME/.ssh/authorized_keys
Done 

執行指令碼後,檢查 ssh/authorized_keys 檔案,確保只存在已知的公開金鑰。

使用金鑰保存庫密碼部署的 VM

使用金鑰保存庫金鑰部署時,若要確定是否加入了金鑰,請按照以下步驟操作:

  1. 取得使用 VM 部署的金鑰保存庫憑證的名稱,檢閱部署代碼 Az CLI 或 ARM 範本,或執行此 Az CLI:
      az vm show --resource-group <resourceGroupName> --name <vmName> | grep certificateUrl

    回應將顯示憑證名稱:
      "certificateUrl": "https://<keyVaultname>.vault.azure.net/secrets/<certName>/xxxxxxxxxxxxx"

  2. 下載憑證:
      az keyvault certificate download --vault-name <keyVaultName> --name <certName> --encoding PEM --file public.pem

  3. 擷取公開金鑰:
      openssl x509 -in public.pm -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

  4. 將上一步的輸出與 ssh/authorized_keys 檔案中的其餘憑證進行比對。
      vi .ssh/authorized_keys file

解決方案

Azure MarketPlace 映像

Azure 映像中的 cloud-init 已套用修復:

  • Canonical:UbuntuServer:18.04-LTS:18.04.201902190

注意

日後會在以下映像中加入更新。

  • Canonical:UbuntuServer:18.10:x

  • RedHat:RHEL:7-RAW-CI (公開預覽映像)

  • OpenLogic:CentOS:7-CI (公開預覽映像)

有可用的映像後,將更新本文內容。

自訂映像

如果您使用的自訂映像已由 cloud-init 佈建在已知的作業系統中,您必須更新來源自訂映像。

Ubuntu 18.04 映像

若要更新來源自訂映像,您必須進行以下修改:

  • 編輯下列檔案:

    /etc/cloud/cloud.cfg.d/90-azure.cfg

  • 將下列程式碼加到檔案的結尾處。

重要

必須完全按照指示加入程式碼,包括空格。

datasource:
   Azure:
     agent_command: [service, walinuxagent, start]

RHEL 7.4/7.5/7.6 和 CentOS 7.6 映像

如果之前已按照這些步驟 (或類似方法) 建立 RHEL/CentOS 映像,則必須更新用以建立 VM 的來源映像。 您必須將以下其他步驟加入現有的來源 VM 映像組態:

步驟 1 

編輯下列檔案:

/etc/cloud/cloud.cfg.d/91-azure_datasource.cfg 

重要

必須完全按照指示加入程式碼,包括空格。

將下行加到檔案的結尾處: 

datasource:
   Azure:
     agent_command: [systemctl, start, waagent, --no-block]

步驟 2

如下更新代理程式組態:

cp /lib/systemd/system/waagent.service /etc/systemd/system/waagent.service
sed -i 's/After=network-online.target/WantedBy=cloud-init.service\\nAfter=network.service systemd-networkd-wait-online.service/g' /etc/systemd/system/waagent.service
systemctl daemon-reload

cloud-init 封裝

包含修正程式的所有 cloud-init 封裝都正在進行更新。 Microsoft 將持續研究此問題;若有更多資訊,將於本文發佈。 

常見問題集

問 1: Microsoft 是否取得了我的 VM 的存取權限?

答 1: 加密金鑰的作用是管理身分,而延伸並非作為 Microsoft 員工存取使用。 我們有適當的程序可監控、記錄並防止這類存取。 為了安全起見,我們會檢閱所有記錄檔,確保客戶金鑰未遭到不當存取。 凡是儲存在金鑰保存庫中的憑證 (在 VM 或 VMSS 部署所引用的),Microsoft 員工皆沒有存取密碼的權限。

問 2: 所有 cloud-init 部署的作業系統和版本都會受到影響嗎?

答 2: 不會,這個沒有直接關聯的金鑰問題僅發生在已識別的作業系統中, 並未發生在舊版本的 Ubuntu 中。 這是因為這些系統使用不同的機制來設定公開金鑰。

問 3: 受影響的 cloud-init 封裝 (適用於 Linux 發行版本) 是否包含修正程式?

答 3: 我們正在努力為封裝新增修正程式,以修復受影響的版本;作業完成後,我們將更新本文。

問 4: Microsoft 會自動更新任何受影響的 VM 嗎? 

答 4: 不會。Microsoft 不會變更您已佈建的 VM 內容。

問 5: 我們的安全性原則防止我在 authorized_keys 中操作含無關內容的 Linux VM。 我該怎麼辦?

答 5: 您可以放心地從 authorized_keys 檔案中移除違規行, 不會’影響您建立並控制的 SSH 金鑰組或受控識別。 您可以在任何受影響的機組中手動執行此操作,也可以執行自訂指令碼或自訂命令。

Need more help?

Want more options?

探索訂閱權益、瀏覽訓練課程、瞭解如何保護您的裝置等等。

社群可協助您詢問並回答問題、提供意見反應,以及聆聽來自具有豐富知識的專家意見。

Was this information helpful?

How satisfied are you with the translation quality?
What affected your experience?
By pressing submit, your feedback will be used to improve Microsoft products and services. Your IT admin will be able to collect this data. Privacy Statement.

Thank you for your feedback!

×