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 --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
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 --name myDiskEncryptionSetName --location myAzureRegionName --resource-group 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 --name myDiskEncryptionSetName --resource-group myResourceGroup --query "[identity.principalId]" -o tsv)
# Update security policy settings
az keyvault set-policy --name myKeyVaultName --resource-group 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 --name mydiskEncryptionSetName --resource-group myResourceGroup --query "[id]" -o tsv)
Se você quiser criar um novo grupo de recursos para o cluster, execute o seguinte comando:
az group create --name myResourceGroup --location 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 --name myAKSCluster --resource-group 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 --name myAKSCluster --resource-group 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 --resource-group $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 --resource-group $RG_NAME --name $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
Azure Kubernetes Service