Byok (Bring Your Own Keys) med Azure-hanterade diskar i Azure Kubernetes Service (AKS)

Azure krypterar alla data på en hanterad disk i vila. Som standard krypteras data med Microsoft-hanterade nycklar. Om du vill ha mer kontroll över krypteringsnycklar kan du ange kundhanterade nycklar som ska användas för kryptering i vila för både operativsystemet och datadiskarna för dina AKS-kluster.

Läs mer om kundhanterade nycklar i Linux och Windows.

Förutsättningar

  • Du måste aktivera skydd mot mjuk borttagning och rensning för Azure Key Vault när du använder Key Vault för att kryptera hanterade diskar.
  • Du behöver Azure CLI version 2.11.1 eller senare.
  • Datadiskkryptering och kundhanterade nycklar stöds i Kubernetes version 1.24 och senare.
  • Om du väljer att rotera (ändra) dina nycklar regelbundet läser du Kundhanterade nycklar och kryptering av Azure-hanterad disk för mer information.

Begränsningar

  • Kryptering av en OS-disk med kundhanterade nycklar kan bara aktiveras när du skapar ett AKS-kluster.

  • Virtuella noder stöds inte.

  • När du krypterar en tillfälliga OS-diskaktiverad nodpool med kundhanterade nycklar måste du:

    • Skala ned antalet nodpooler till 0
    • Rotera nyckeln
    • Skala upp nodpoolen till det ursprungliga antalet.

Skapa en Azure Key Vault-instans

Använd en Azure Key Vault-instans för att lagra dina nycklar. Du kan också använda Azure-portalen för att konfigurera kundhanterade nycklar med Azure Key Vault

Skapa en ny resursgrupp och skapa sedan en ny Key Vault-instans och aktivera skydd mot mjuk borttagning och rensning. Se till att du använder samma region- och resursgruppsnamn för varje kommando.

# 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

Skapa en instans av en DiskEncryptionSet

Ersätt myKeyVaultName med namnet på ditt nyckelvalv. Du behöver också en nyckel som lagras i Azure Key Vault för att slutföra följande steg. Lagra antingen din befintliga nyckel i nyckelvalvet som du skapade i föregående steg eller generera en ny nyckel och ersätt myKeyName med namnet på din nyckel.

# 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

Viktigt!

Kontrollera att DiskEncryptionSet finns i samma region som AKS-klustret och att AKS-klusteridentiteten har läsbehörighet till DiskEncryptionSet.

Ge DiskEncryptionSet åtkomst till nyckelvalvet

Använd DiskEncryptionSet och resursgrupper som du skapade i föregående steg och ge DiskEncryptionSet-resursen åtkomst till Azure Key Vault.

# 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

Skapa ett nytt AKS-kluster och kryptera OS-disken

Skapa antingen en ny resursgrupp eller välj en befintlig resursgrupp som är värd för andra AKS-kluster och använd sedan nyckeln för att kryptera antingen med nätverksanslutna OS-diskar eller tillfälliga OS-diskar. Som standard använder ett kluster tillfälliga OS-diskar när det är möjligt tillsammans med VM-storlek och OS-diskstorlek.

Kör följande kommando för att hämta värdet DiskEncryptionSet och ange en variabel:

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

Om du vill skapa en ny resursgrupp för klustret kör du följande kommando:

az group create -n myResourceGroup -l myAzureRegionName

Om du vill skapa ett vanligt kluster med nätverksanslutna OS-diskar som krypterats med nyckeln kan du göra det genom att --node-osdisk-type=Managed ange argumentet.

az aks create -n myAKSCluster -g myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

Om du vill skapa ett kluster med en tillfällig OS-disk krypterad med nyckeln kan du göra det genom att --node-osdisk-type=Ephemeral ange argumentet. Du måste också ange argumentet --node-vm-size eftersom standardstorleken för virtuella datorer är för liten och inte stöder tillfälliga OS-diskar.

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

När nya nodpooler läggs till i klustret används den kundhanterade nyckel som tillhandahålls under skapandeprocessen för att kryptera OS-disken. I följande exempel visas hur du distribuerar en ny nodpool med en tillfällig OS-disk.

az aks nodepool add --cluster-name $CLUSTER_NAME -g $RG_NAME --name $NODEPOOL_NAME --node-osdisk-type Ephemeral

Kryptera AKS-klusterdatadisken

Om du redan har angett en diskkrypteringsuppsättning när klustret skapas är kryptering av datadiskar med samma diskkrypteringsuppsättning standardalternativet. Därför är det här steget valfritt. Men om du vill kryptera datadiskar med en annan diskkrypteringsuppsättning kan du följa dessa steg.

Viktigt!

Kontrollera att du har rätt AKS-autentiseringsuppgifter. Den hanterade identiteten måste ha deltagaråtkomst till resursgruppen där diskenkrypteringsuppsättningen distribueras. Annars får du ett fel som tyder på att den hanterade identiteten inte har behörighet.

Om du vill tilldela AKS-klusteridentiteten rollen Deltagare för diskencryptionset kör du följande kommandon:

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

Skapa en fil med namnet byok-azure-disk.yaml som innehåller följande information. Ersätt myAzureSubscriptionId, myResourceGroup och myDiskEncrptionSetName med dina värden och tillämpa yaml. Se till att använda resursgruppen där DiskEncryptionSet distribueras.

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}"

Kör sedan följande kommandon för att uppdatera AKS-klustret:

# Get credentials
az aks get-credentials --name myAksCluster --resource-group myResourceGroup --output table

# Update cluster
kubectl apply -f byok-azure-disk.yaml

Nästa steg

Granska metodtips för AKS-klustersäkerhet