BYOK (Bring Your Own Key) com discos gerenciados do Azure no AKS (Serviço de Kubernetes do Azure)

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 ter mais controle sobre as chaves de criptografia, você pode fornecer chaves gerenciadas pelo cliente para usar na criptografia em repouso tanto para o sistema operacional quanto para os 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 exclusão temporária e a proteção de limpeza Azure Key Vault ao usar Key Vault para criptografar discos gerenciados.
  • Você também precisa da CLI do Azure versão 2.11.1 ou posterior.
  • Há suporte para criptografia de disco de dados e chaves gerenciadas pelo cliente nas versões 1.24 e superiores do Kubernetes.
  • 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 habilitada durante a criação de um cluster do AKS.

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

  • 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 Azure Key Vault, será necessário:

    • Reduzir verticalmente a contagem de pools de nós para 0
    • Girar a chave
    • Escala verticalmente o 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. Você tem a opção de usar o Portal do Azure para Configurar chaves gerenciadas pelo cliente com o Azure Key Vault

Crie um novo grupo de recursose, em seguida, crie uma nova instância deKey Vault e habilite a proteção à exclusão temporária e limpeza. 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

Crie uma instância de um DiskEncryptionSet

Substitua myKeyVaultName pelo nome do seu cofre de chaves. Você também precisa de uma chave armazenada no Azure Key Vault para concluir as etapas a seguir. Armazene sua chave existente no Key Vault criado nas etapas anteriores ou gere um 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 esteja localizado na mesma região do cluster do AKS, e de que a identidade do cluster do AKS tenha acesso de leitura ao DiskEncryptionSet.

Conceder acesso ao DiskEncryptionSet para o Key Vault

Use o DiskEncryptionSet e os grupos de recursos que você criou nas etapas anteriores e conceda ao recurso DiskEncryptionSet acesso ao 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

Criar um novo cluster AKS e criptografar o disco do sistema operacional

Crie um novo grupo de recursos ou selecione um grupo de recursos existente que hospeda outros clusters do AKS e use sua chave para criptografar os discos do sistema operacional anexados à rede ou disco de SO efêmero. Por padrão, um cluster usa o disco de SO efêmero 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 você quiser 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 do sistema operacional anexados à rede criptografados com sua chave, você pode fazer isso especificando o argumento --node-osdisk-type=Managed.

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 da VM padrão é muito pequeno e não dá suporte ao disco de SO efêmero.

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 SO efêmero.

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

Criptografar o disco de dados do cluster do AKS

Se você já forneceu 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, essa etapa é opcional. No entanto, se você quiser criptografar discos de dados com um conjunto de criptografia de disco diferente, siga estas etapas.

Importante

Verifique se você tem as credenciais de AKS adequadas. A identidade gerenciada precisará ter acesso de colaborador ao grupo de recursos em que o diskencryptionset é implantado. Caso contrário, você receberá um erro sugerindo que a identidade gerenciada não tem permissões.

Para atribuir a identidade do cluster do AKS à função Colaborador do diskencryptionset, 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 contém as informações a seguir. Substitua myAzureSubscriptionId, MyResourceGroup, e myDiskEncrptionSetName por 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 do AKS:

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

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

Próximas etapas

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