Sign in with Microsoft
New to Microsoft? Create an account.

摘要

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 金鑰組或受控識別。 您可以在任何受影響的機組中手動執行此操作,也可以執行自訂指令碼或自訂命令。

需要更多協助?

擴展您的技能
探索訓練
優先取得新功能
加入 Microsoft 測試人員

這項資訊有幫助嗎?

您對語言品質的滿意度如何?
以下何者是您會在意的事項?

感謝您的意見反應!

×