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

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

Подробнее о ключах, управляемых клиентом, в Linux и Windows.

Необходимые компоненты

  • Необходимо включить обратимое удаление и защиту от очистки для Azure Key Vault при использовании Key Vault для шифрования управляемых дисков.
  • Вам потребуется Azure CLI 2.11.1 или более поздней версии.
  • Шифрование дисков данных и ключи, управляемые клиентом, поддерживаются в Kubernetes версии 1.24 и выше.
  • Если вы решили периодически поворачивать (изменять) ключи, ознакомьтесь с ключами, управляемыми клиентом, и шифрованием управляемого диска Azure для получения дополнительных сведений.

Ограничения

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

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

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

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

Создайте экземпляр 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 -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. Сохраните существующий ключ в 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 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

Создайте кластер AKS и зашифруйте диск ОС

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

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

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

Если вы хотите создать новую группу ресурсов для кластера, выполните следующую команду:

az group create -n myResourceGroup -l myAzureRegionName

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

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

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

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

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

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

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

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

Важно!

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

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

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 со следующими данными. Замените 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