攜帶您自己的金鑰 (BYOK) 搭配 Azure Kubernetes Service (AKS) 中的 Azure 受控磁碟

Azure 會靜態加密受控磁碟中的所有資料。 根據預設,資料是以使用 Microsoft 管理的金鑰加密。 若要進一步控制加密金鑰,您可以提供客戶自控金鑰,以用於 AKS 叢集中 OS 和資料磁碟的待用加密。

深入瞭解 LinuxWindows 上客戶管理的金鑰。

必要條件

  • 使用金鑰保存庫加密受控磁碟時,您必須啟用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 -l myAzureRegionName -n myResourceGroup

# Create an Azure Key Vault resource in a supported Azure region
az keyvault create -n myKeyVaultName -g myResourceGroup -l 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 -n myDiskEncryptionSetName  -l myAzureRegionName  -g 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 -n myDiskEncryptionSetName  -g myResourceGroup --query "[identity.principalId]" -o tsv)

# Update security policy settings
az keyvault set-policy -n myKeyVaultName -g myResourceGroup --object-id $desIdentity --key-permissions wrapkey unwrapkey get

建立新的 AKS 叢集並加密 OS 磁碟

建立新的資源群組或選取現有裝載其他 AKS 叢集的資源群組,然後使用您的金鑰加密,或是使用網路連結的 OS 磁碟或暫時性磁碟加密。 根據預設,叢集會盡可能搭配 VM 大小和 OS 磁碟大小使用暫時性 OS 磁碟。

執行下列命令以擷取 DiskEncryptionSet 值並設定變數:

diskEncryptionSetId=$(az disk-encryption-set show -n mydiskEncryptionSetName -g myResourceGroup --query "[id]" -o tsv)

如果您要為叢集建立新的資源群組,請執行下列命令:

az group create -n myResourceGroup -l myAzureRegionName

若要使用網路連結的 OS 磁碟,其受您的金鑰加密來建立一般叢集,您可以藉由指定 --node-osdisk-type=Managed 引數來執行此動作。

az aks create -n myAKSCluster -g 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 -n myAKSCluster -g 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 -g $RG_NAME --name $NODEPOOL_NAME --node-osdisk-type Ephemeral

將 AKS 叢集資料磁碟加密

如果您已在叢集建立期間提供磁碟加密集,預設選項為使用相同的磁碟加密集來加密資料磁碟。 因此,此為選用步驟。 不過,如果您想要使用不同的磁碟加密集來加密資料磁碟,您可以遵循下列步驟。

重要

請確定您有適當的 AKS 認證。 受控識別必須具有部署 diskencryptionset 的資源群組參與者存取權。 否則,您會收到錯誤,指出受控識別沒有權限。

若要為 diskencryptionset 指派 AKS 叢集身分識別參與者角色,請執行下列命令:

aksIdentity=$(az aks show -g $RG_NAME -n $CLUSTER_NAME --query "identity.principalId")
az role assignment create --role "Contributor" --assignee $aksIdentity --scope $diskEncryptionSetId

建立名為 byok-azure-disk.yaml 的檔案,其中包含下列資訊。 以您的值取代 myAzureSubscriptionIdmyResourceGroupmyDiskEncrptionSetName,並套用 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

下一步

檢閱 AKS 叢集安全性的最佳做法