摘要
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 檔案中用於驗證的公開金鑰為何,請按照以下步驟操作:
-
檢閱部署範本:
-
ssh 公開金鑰
-
cloud-init 組態中的 ssh 金鑰
-
-
如果您擁有 sudo/root 存取權限,請在 VM 建立時,從 VM 內部擷取已部署的 ssh 金鑰。 若要執行這項操作,請依照下列步驟執行:
-
檢查在 CustomData 中傳遞的 cloud-init 組態: sudo cat /var/lib/waagent/ovf-env.xml | grep "<ns1:CustomData>"
使用 CustomData 值,然後使用 base64 解碼取得您部署的公開金鑰: echo "<customData value>" | base64 -D -
或者,檢查 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
使用金鑰保存庫金鑰部署時,若要確定是否加入了金鑰,請按照以下步驟操作:
-
取得使用 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" -
下載憑證:
az keyvault certificate download --vault-name <keyVaultName> --name <certName> --encoding PEM --file public.pem -
擷取公開金鑰:
openssl x509 -in public.pm -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8 -
將上一步的輸出與 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 金鑰組或受控識別。 您可以在任何受影響的機組中手動執行此操作,也可以執行自訂指令碼或自訂命令。