Использование собственных ключей (BYOK) для управляемых дисков Azure в службе Azure Kubernetes (AKS)

Azure шифрует все данные на управляемых дисках в состоянии покоя. По умолчанию данные шифруются с использованием ключей, управляемых Microsoft. Для большего контроля над ключами шифрования вы можете предоставить ключи, управляемые клиентом, для использования при шифровании в состоянии покоя как для дисков ОС, так и для дисков данных в ваших кластерах AKS.

Узнайте больше о ключах, управляемых клиентом, на Linux и Windows.

Prerequisites

Limitations

  • Шифрование диска ОС с использованием ключей, управляемых клиентом, может быть включено только при создании кластера AKS.

  • Виртуальные узлы не поддерживаются.

  • При шифровании эфемерного пула узлов с поддержкой диска ОС с помощью ключей, управляемых клиентом, если вы хотите повернуть ключ в Azure Key Vault, можно рассмотреть два варианта:

    • Немедленное применение нового CMK

      • Уменьшите количество узлов в пуле до 0.
      • Смена ключа.
      • Увеличьте пул узлов до изначального количества.
    • Постепенное использование нового CMK

      • Разрешить обновления образа узла AKS или обновления версий для естественного внедрения нового CMK с течением времени.
      • До тех пор, пока все узлы в пуле не будут обновлены, существующий CMK будет продолжать функционировать без нарушений.
      • После завершения процесса обновления на всех узлах новый CMK вступает в силу без проблем.

Создайте экземпляр Azure Key Vault

Используйте экземпляр Azure Key Vault для хранения ключей. Вы можете при необходимости использовать портал Azure для настройки ключей, управляемых клиентом, с помощью Azure Key Vault

Создайте новую группу ресурсов, затем создайте новый экземпляр Key Vault и включите мягкое удаление и защиту от удаления. Убедитесь, что вы используете одинаковые названия регионов и групп ресурсов для каждой команды.

# 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

Создайте экземпляр набора шифрования диска

Замените myKeyVaultName именем хранилища ключей. Для выполнения следующих действий вам также потребуется ключ , хранящийся в Azure Key Vault. Либо сохраните свой существующий ключ в Хранилище ключей, которое вы создали на предыдущих шагах, либо создайте новый ключ и замените myKeyName на имя вашего ключа.

Примечание.

Для поддержки доступа между учетными записями для ключей шифрования, управляемых клиентом, необходимо создать DiskEncryptionSet для ключей, управляемых клиентом, как описано в этом руководстве. Оставшаяся конфигурация класса хранилища совпадает с обычными ключами, управляемыми клиентом.

# 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 Key Vault.

# Retrieve the DiskEncryptionSet value and set a variable
desIdentity=$(az disk-encryption-set show --name myDiskEncryptionSetName --resource-group myResourceGroup --query "[identity.principalId]" -o tsv)

# Retrieve the Key Vault resource ID and set a variable
keyVaultId=$(az keyvault show --name myKeyVaultName --resource-group myResourceGroup --query "id" -o tsv)

# Grant the DiskEncryptionSet identity access to Key Vault
az role assignment create --assignee-object-id $desIdentity --assignee-principal-type ServicePrincipal --role "Key Vault Crypto Service Encryption User" --scope $keyVaultId

Создайте новый кластер AKS и зашифруйте диск с операционной системой

Либо создайте новую группу ресурсов, либо выберите существующую группу ресурсов, в которой размещены другие AKS-кластеры, затем используйте ваш ключ для шифрования, используя либо сетевые подключенные 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

Чтобы создать обычный кластер с помощью дисков ОС, подключенных к сети, зашифрованных с помощью ключа, можно сделать это, указав --node-osdisk-type=Managed аргумент.

az aks create --name myAKSCluster --resource-group myResourceGroup --node-osdisk-diskencryptionset-id $diskEncryptionSetId --generate-ssh-keys --node-osdisk-type Managed

Чтобы создать кластер с эфемерным диском ОС, зашифрованным вашим ключом, укажите аргумент --node-osdisk-type=Ephemeral. Вам также необходимо указать аргумент --node-vm-size, потому что размер виртуальной машины по умолчанию слишком мал и не поддерживает эфемерный диск ОС.

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

Когда к кластеру добавляются новые пула узлов, предоставленный во время процесса создания ключ, управляемый клиентом, используется для шифрования диска ОС. Пример ниже показывает, как развернуть новый пул узлов с временным диском ОС.

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

Важно

Набор шифрования диска (DiskEncryptionSet), который мы ранее применяли к классу хранилища, шифрует только новые PVC. Для шифрования существующих PVC необходимо сначала отключиться перед использованием API дисков Azure или CLI для обновления базовых дисков, как показано в этом руководстве.

Шифрование диска данных кластера AKS

Если вы уже предоставили набор шифрования дисков во время создания кластера, шифрование дисков данных с тем же набором шифрования дисков является вариантом по умолчанию. Поэтому этот шаг является необязательным. Однако, если вы хотите зашифровать диски с данными другим набором шифрования дисков, вы можете следовать этим шагам.

Важно

Убедитесь, что у вас есть правильные учетные данные AKS. Для удостоверения кластера AKS требуется доступ читателя к DiskEncryptionSet. В противном случае появляется сообщение об ошибке о том, что у управляемой идентификации нет необходимых разрешений.

Чтобы назначить управляемому удостоверению кластера AKS роль "Читатель" для DiskEncryptionSet, выполните следующие команды:

aksIdentity=$(az aks show --resource-group $RG_NAME --name $CLUSTER_NAME --query "identity.principalId" -o tsv)
az role assignment create --role "Reader" --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

Следующие шаги

Обзор лучших практик для обеспечения безопасности кластера AKS