攜帶您自己的金鑰 (BYOK) 搭配 Azure Kubernetes Service (AKS) 中的 Azure 受控磁碟
Azure 會靜態加密受控磁碟中的所有資料。 根據預設,資料是以使用 Microsoft 管理的金鑰加密。 若要進一步控制加密金鑰,您可以提供客戶自控金鑰,以用於 AKS 叢集中 OS 和資料磁碟的待用加密。
必要條件
- 使用金鑰保存庫加密受控磁碟時,您必須啟用Azure 金鑰保存庫的虛刪除和清除保護。
- 您需要 Azure CLI 版本 2.11.1 或更新版本。
- 只有高於 1.24 的 Kubernetes 版本才支援資料磁碟加密和客戶自控金鑰。
- 如果您選擇定期輪替 (變更) 金鑰,請參閱客戶自控金鑰和 Azure 受控磁碟加密獲取更多資訊。
限制
只有建立 AKS 叢集時,才能啟用具有客戶管理金鑰的 OS 磁碟加密。
不支援虛擬節點。
使用客戶自控金鑰來加密已啟用暫時性 OS 磁碟的節點集區時,如果您想要在 Azure Key Vault 中輪替金鑰,您需要:
- 將節點集區縮小至 0
- 輪替金鑰
- 擴大原點計數的節點集區。
建立 Azure 金鑰保存庫執行個體
使用 Azure 金鑰保存庫執行個體來儲存金鑰。 了解如何使用 Azure 入口網站設定 Azure 金鑰保存庫的客戶自控金鑰
建立新的資源群組,然後建立新的金鑰保存庫執行個體,並啟用虛刪除和清除保護。 請確定您針對每個命令使用相同的區域和資源組名。
# Optionally retrieve Azure region short names for use on upcoming commands
az account list-locations
# Create new resource group in a supported Azure region
az group create --location myAzureRegionName --name myResourceGroup
# Create an Azure Key Vault resource in a supported Azure region
az keyvault create --name myKeyVaultName --resource-group myResourceGroup --location myAzureRegionName --enable-purge-protection true
建立 DiskEncryptionSet 的執行個體
將 myKeyVaultName 取代為金鑰保存庫的名稱。 您還需要儲存在 Azure Key Vault 中的金鑰,才能完成下列步驟。 將現有的金鑰儲存在您先前步驟所建立的金鑰保存庫中,或產生新的金鑰,並以您的金鑰名稱取代 myKeyName。
# Retrieve the Key Vault Id and store it in a variable
keyVaultId=$(az keyvault show --name myKeyVaultName --query "[id]" -o tsv)
# Retrieve the Key Vault key URL and store it in a variable
keyVaultKeyUrl=$(az keyvault key show --vault-name myKeyVaultName --name myKeyName --query "[key.kid]" -o tsv)
# Create a DiskEncryptionSet
az disk-encryption-set create --name myDiskEncryptionSetName --location myAzureRegionName --resource-group myResourceGroup --source-vault $keyVaultId --key-url $keyVaultKeyUrl
重要
請確保 DiskEncryptionSet 位於與您的 AKS 叢集相同的區域中,且 AKS 叢集身分識別擁有 DiskEncryptionSet 的讀取 存取。
將 DiskEncryptionSet 存取權授與金鑰保存庫
使用您在先前步驟上建立的 DiskEncryptionSet 和資源群組,並將 DiskEncryptionSet 資源存取權授與 Azure 金鑰保存庫。
# Retrieve the DiskEncryptionSet value and set a variable
desIdentity=$(az disk-encryption-set show --name myDiskEncryptionSetName --resource-group myResourceGroup --query "[identity.principalId]" -o tsv)
# Update security policy settings
az keyvault set-policy --name myKeyVaultName --resource-group myResourceGroup --object-id $desIdentity --key-permissions wrapkey unwrapkey get
建立新的 AKS 叢集並加密 OS 磁碟
建立新的資源群組或選取現有裝載其他 AKS 叢集的資源群組,然後使用您的金鑰加密,或是使用網路連結的 OS 磁碟或暫時性磁碟加密。 根據預設,叢集會盡可能搭配 VM 大小和 OS 磁碟大小使用暫時性 OS 磁碟。
執行下列命令以擷取 DiskEncryptionSet 值並設定變數:
diskEncryptionSetId=$(az disk-encryption-set show --name mydiskEncryptionSetName --resource-group myResourceGroup --query "[id]" -o tsv)
如果您要為叢集建立新的資源群組,請執行下列命令:
az group create --name myResourceGroup --location myAzureRegionName
若要使用網路連結的 OS 磁碟,其受您的金鑰加密來建立一般叢集,您可以藉由指定 --node-osdisk-type=Managed
引數來執行此動作。
az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed
若要使用暫時性的 OS 磁碟,其受您的金鑰加密來建立一般叢集,您可以藉由指定 --node-osdisk-type=Ephemeral
引數來執行此動作。 您還需要指定自 --node-vm-size
引數,因為預設 VM 大小太小且不支援暫時性 OS 磁碟。
az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Ephemeral --node-vm-size Standard_DS3_v2
將新的節點集區新增至叢集時,在建立流程中提供的客戶自控金鑰會用來加密 OS 磁碟。 下列範例示範如何使用暫時性 OS 磁碟來部署新的節點集區。
az aks nodepool add --cluster-name $CLUSTER_NAME --resource-group $RG_NAME --name $NODEPOOL_NAME --node-osdisk-type Ephemeral
將 AKS 叢集資料磁碟加密
如果您已在叢集建立期間提供磁碟加密集,預設選項為使用相同的磁碟加密集來加密資料磁碟。 因此,此為選用步驟。 不過,如果您想要使用不同的磁碟加密集來加密資料磁碟,您可以遵循下列步驟。
重要
請確定您有適當的 AKS 認證。 受控識別必須具有部署 diskencryptionset 的資源群組參與者存取權。 否則,您會收到錯誤,指出受控識別沒有權限。
若要為 diskencryptionset 指派 AKS 叢集身分識別參與者角色,請執行下列命令:
aksIdentity=$(az aks show --resource-group $RG_NAME --name $CLUSTER_NAME --query "identity.principalId")
az role assignment create --role "Contributor" --assignee $aksIdentity --scope $diskEncryptionSetId
建立名為 byok-azure-disk.yaml 的檔案,其中包含下列資訊。 以您的值取代 myAzureSubscriptionId、myResourceGroup 和 myDiskEncrptionSetName,並套用 yaml。 請務必使用部署 DiskEncryptionSet 的資源群組。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: byok
provisioner: disk.csi.azure.com # replace with "kubernetes.io/azure-disk" if aks version is less than 1.21
parameters:
skuname: StandardSSD_LRS
kind: managed
diskEncryptionSetID: "/subscriptions/{myAzureSubscriptionId}/resourceGroups/{myResourceGroup}/providers/Microsoft.Compute/diskEncryptionSets/{myDiskEncryptionSetName}"
接下來,執行下列命令來更新 AKS 叢集:
# Get credentials
az aks get-credentials --name myAksCluster --resource-group myResourceGroup --output table
# Update cluster
kubectl apply -f byok-azure-disk.yaml