Traga suas próprias chaves (BYOK) com discos gerenciados do Azure no Serviço Kubernetes do Azure (AKS)

O Azure criptografa todos os dados em um disco gerenciado em repouso. Por padrão, os dados são criptografados com chaves gerenciadas pela Microsoft. Para obter mais controle sobre as chaves de criptografia, você pode fornecer chaves gerenciadas pelo cliente para usar para criptografia em repouso para o sistema operacional e discos de dados para seus clusters AKS.

Saiba mais sobre chaves gerenciadas pelo cliente no Linux e no Windows.

Pré-requisitos

  • Você deve habilitar a proteção de exclusão suave e limpeza para o Cofre da Chave do Azure ao usar o Cofre da Chave para criptografar discos gerenciados.
  • Você precisa da CLI do Azure versão 2.11.1 ou posterior.
  • A criptografia de disco de dados e as chaves gerenciadas pelo cliente são suportadas no Kubernetes versões 1.24 e superiores.
  • Se você optar por girar (alterar) suas chaves periodicamente, consulte Chaves gerenciadas pelo cliente e criptografia do disco gerenciado do Azure para obter mais informações.

Limitações

  • A criptografia de um disco do sistema operacional com chaves gerenciadas pelo cliente só pode ser ativada ao criar um cluster AKS.

  • Não há suporte para nós virtuais.

  • Ao criptografar um pool de nós habilitado para disco do sistema operacional efêmero com chaves gerenciadas pelo cliente, se você quiser girar a chave no Cofre de Chaves do Azure, será necessário:

    • Reduza a contagem do pool de nós para 0
    • Rodar a chave
    • Aumente a escala do pool de nós para a contagem original.

Criar uma instância do Azure Key Vault

Use uma instância do Azure Key Vault para armazenar suas chaves. Opcionalmente, você pode usar o portal do Azure para Configurar chaves gerenciadas pelo cliente com o Azure Key Vault

Crie um novo grupo de recursos e, em seguida, crie uma nova instância do Cofre da Chave e habilite a proteção contra exclusão e limpeza suaves. Certifique-se de usar os mesmos nomes de região e grupo de recursos para cada comando.

# 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

Criar uma instância de um DiskEncryptionSet

Substitua myKeyVaultName pelo nome do seu cofre de chaves. Você também precisa de uma chave armazenada no Cofre de Chaves do Azure para concluir as etapas a seguir. Armazene sua chave existente no Cofre da chave que você criou nas etapas anteriores ou gere uma nova chave e substitua myKeyName pelo nome da sua chave.

# 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

Importante

Certifique-se de que o DiskEncryptionSet está localizado na mesma região que o cluster AKS e que a identidade do cluster AKS tem acesso de leitura ao DiskEncryptionSet.

Conceda ao DiskEncryptionSet acesso ao cofre de chaves

Use o DiskEncryptionSet e os grupos de recursos criados nas etapas anteriores e conceda ao recurso DiskEncryptionSet acesso ao Cofre da Chave do 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

Crie um novo cluster AKS e criptografe o disco do sistema operacional

Crie um novo grupo de recursos ou selecione um grupo de recursos existente que hospede outros clusters AKS e, em seguida, use sua chave para criptografar o usando discos de sistema operacional conectados à rede ou disco de sistema operacional efêmero. Por padrão, um cluster usa o disco efêmero do sistema operacional quando possível em conjunto com o tamanho da VM e o tamanho do disco do sistema operacional.

Execute o seguinte comando para recuperar o valor DiskEncryptionSet e definir uma variável:

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

Se desejar criar um novo grupo de recursos para o cluster, execute o seguinte comando:

az group create -n myResourceGroup -l myAzureRegionName

Para criar um cluster regular usando discos de sistema operacional conectados à rede criptografados com sua chave, você pode fazer isso especificando o --node-osdisk-type=Managed argumento.

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

Para criar um cluster com disco de SO efêmero criptografado com sua chave, você pode fazer isso especificando o argumento --node-osdisk-type=Ephemeral . Você também precisa especificar o argumento --node-vm-size porque o tamanho padrão da vm é muito pequeno e não suporta disco efêmero do sistema operacional.

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

Quando novos pools de nós são adicionados ao cluster, a chave gerenciada pelo cliente fornecida durante o processo de criação é usada para criptografar o disco do sistema operacional. O exemplo a seguir mostra como implantar um novo pool de nós com um disco de sistema operacional efêmero.

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

Criptografe seu disco de dados do cluster AKS

Se você já tiver fornecido um conjunto de criptografia de disco durante a criação do cluster, criptografar discos de dados com o mesmo conjunto de criptografia de disco é a opção padrão. Portanto, esta etapa é opcional. No entanto, se pretender encriptar discos de dados com um conjunto de encriptação de disco diferente, pode seguir estes passos.

Importante

Certifique-se de ter as credenciais AKS adequadas. A identidade gerenciada precisa ter acesso de colaborador ao grupo de recursos onde o conjunto de criptografia de disco é implantado. Caso contrário, você receberá um erro sugerindo que a identidade gerenciada não tem permissões.

Para atribuir à identidade do cluster AKS a função de Colaborador para o conjunto de encriptação de discos, execute os seguintes comandos:

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

Crie um arquivo chamado byok-azure-disk.yaml que contenha as seguintes informações. Substitua myAzureSubscriptionId, myResourceGroup e myDiskEncrptionSetName pelos seus valores e aplique o yaml. Certifique-se de usar o grupo de recursos onde seu DiskEncryptionSet está implantado.

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

Em seguida, execute os seguintes comandos para atualizar o cluster AKS:

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

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

Próximos passos

Rever as práticas recomendadas para a segurança do cluster AKS