Adicionar criptografia etcd do Serviço de Gerenciamento de Chaves a um cluster do Serviço Kubernetes do Azure

Este artigo mostra como ativar a criptografia em repouso para seus segredos do Serviço Kubernetes do Azure (AKS) em um armazenamento de chave-valor etcd usando o Cofre de Chaves do Azure e o plug-in KMS (Serviço de Gerenciamento de Chaves). Você pode usar o plug-in KMS para:

  • Use uma chave em um cofre de chaves para criptografia etcd.
  • Traga as suas próprias chaves.
  • Forneça criptografia em repouso para segredos armazenados no etcd.
  • Rode as chaves num cofre de chaves.

Para obter mais informações sobre como usar o KMS, consulte Usando um provedor KMS para criptografia de dados.

Pré-requisitos

Aviso

A partir de 15 de setembro de 2024, o Konnectivity não é mais suportado para cofres de chave privada para novas assinaturas ou assinaturas que não tenham usado essa configuração anteriormente. Para subscrições que estejam atualmente a utilizar esta configuração ou que a tenham utilizado nos últimos 60 dias, o suporte continuará até que a versão 1.30 do AKS atinja o fim da vida útil para suporte da comunidade.

O KMS suporta Konnectivity ou API Server VNet Integration (visualização) para cofres de chave pública.

O KMS oferece suporte à integração de VNet do Servidor de API (visualização) para cofres de chaves públicas e privadas.

Você pode usar kubectl get po -n kube-system para verificar os resultados e mostrar que um pod konnectivity-agent está em execução. Se um pod estiver em execução, o cluster AKS está usando o Konnectivity. Ao usar a Integração de VNet do Servidor de API, você pode executar o az aks show -g -n comando para verificar se a enableVnetIntegration configuração está definida como true.

Limitações

As seguintes limitações se aplicam quando você integra a criptografia KMS etcd com o AKS:

  • Não há suporte para a exclusão da chave, do cofre de chaves ou da identidade associada.
  • A criptografia KMS etcd não funciona com a identidade gerenciada atribuída ao sistema. A política de acesso ao cofre de chaves deve ser definida antes que o recurso seja ativado. A identidade gerenciada atribuída ao sistema só estará disponível após a criação do cluster. Considere a dependência do ciclo.
  • O Azure Key Vault com uma configuração de firewall "permitir acesso público de redes virtuais e endereços IP específicos" ou "desabilitar acesso público" não é suportado porque bloqueia o tráfego do plug-in KMS para o cofre de chaves.
  • O número máximo de segredos suportados por um cluster com o KMS ativado é 2.000. No entanto, é importante observar que o KMS v2 não é limitado por essa restrição e pode lidar com um número maior de segredos.
  • Não há suporte para trazer seu próprio cofre de chaves do Azure (BYO) de outro locatário.
  • Com o KMS ativado, não é possível alterar o modo de cofre de chaves associado (público versus privado). Para atualizar um modo de cofre de chaves, você deve primeiro desativar o KMS e, em seguida, ativá-lo novamente.
  • Se um cluster tiver o KMS ativado e tiver um cofre de chave privada, ele deverá usar o túnel de integração de VNet do Servidor de API (visualização). Konnectivity não é suportado.
  • Usar a API de Conjuntos de Escala de Máquina Virtual para dimensionar os nós no cluster até zero deslocaliza os nós. O cluster então cai e torna-se irrecuperável.
  • Depois de desativar o KMS, não é possível destruir as chaves. Destruir as chaves faz com que o servidor de API pare de funcionar.

O KMS suporta um cofre de chave pública ou um cofre de chave privada.

Ativar o KMS para um cofre de chave pública

As seções a seguir descrevem como ativar o KMS para um cofre de chave pública.

Criar um cofre de chave pública e uma chave

Aviso

A exclusão da chave ou do cofre de chaves não é suportada e faz com que os segredos no cluster sejam irrecuperáveis.

Se você precisar recuperar seu cofre de chaves ou sua chave, consulte Gerenciamento de recuperação do Cofre de Chaves do Azure com proteção de exclusão e limpeza suave.

Criar um cofre de chaves e uma chave para um cofre de chave pública não RBAC

Use az keyvault create para criar um cofre de chaves sem usar o controle de acesso baseado em função do Azure (Azure RBAC):

az keyvault create --name MyKeyVault --resource-group MyResourceGroup

Use az keyvault key create para criar uma chave:

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Use az keyvault key show para exportar o ID da chave:

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

Este exemplo armazena o ID da chave em KEY_ID.

Criar um cofre de chaves e uma chave para um cofre de chave pública RBAC

Use az keyvault create para criar um cofre de chaves usando o Azure RBAC:

export KEYVAULT_RESOURCE_ID=$(az keyvault create --name MyKeyVault --resource-group MyResourceGroup  --enable-rbac-authorization true --query id -o tsv)

Atribua a si mesmo permissões para criar uma chave:

az role assignment create --role "Key Vault Crypto Officer" --assignee-object-id $(az ad signed-in-user show --query id -o tsv) --assignee-principal-type "User" --scope $KEYVAULT_RESOURCE_ID

Use az keyvault key create para criar uma chave:

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Use az keyvault key show para exportar o ID da chave:

export KEY_ID=$(az keyvault key show --name MyKeyName --vault-name MyKeyVault --query 'key.kid' -o tsv)
echo $KEY_ID

Este exemplo armazena o ID da chave em KEY_ID.

Criar uma identidade gerenciada atribuída pelo usuário para um cofre de chave pública

Use az identity create para criar uma identidade gerenciada atribuída pelo usuário:

az identity create --name MyIdentity --resource-group MyResourceGroup

Use az identity show para obter o ID do objeto de identidade:

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

O exemplo anterior armazena o valor do ID do objeto de identidade em IDENTITY_OBJECT_ID.

Use az identity show para obter o ID do recurso de identidade:

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

Este exemplo armazena o valor do ID do recurso de identidade em IDENTITY_RESOURCE_ID.

Atribuir permissões para desencriptar e encriptar um cofre de chave pública

As seções a seguir descrevem como atribuir, descriptografar e criptografar permissões para um cofre de chave privada.

Atribuir permissões para um cofre de chave pública não RBAC

Se o cofre de chaves não estiver definido com --enable-rbac-authorization, você poderá usar az keyvault set-policy para criar uma política de cofre de chaves do Azure.

az keyvault set-policy --name MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

Atribuir permissões para um cofre de chave pública RBAC

Se o seu cofre de chaves estiver definido com --enable-rbac-authorization, atribua a função Key Vault Crypto User para dar permissões de desencriptação e encriptação.

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Crie um cluster AKS que tenha um cofre de chave pública e ative a criptografia KMS etcd

Para ativar a criptografia KMS etcd, crie um cluster AKS usando o comando az aks create . Você pode usar os --enable-azure-keyvault-kmsparâmetros az aks create, --azure-keyvault-kms-key-vault-network-accesse com --azure-keyvault-kms-key-id .

az aks create \
    --name myAKSCluster \
    --resource-group MyResourceGroup \
    --assign-identity $IDENTITY_RESOURCE_ID \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-vault-network-access "Public" \
    --azure-keyvault-kms-key-id $KEY_ID \
    --generate-ssh-keys

Atualizar um cluster AKS existente para ativar a criptografia KMS etcd para um cofre de chave pública

Para ativar a criptografia KMS etcd para um cluster existente, use o comando az aks update . Você pode usar os --enable-azure-keyvault-kmsparâmetros az-aks-update, --azure-keyvault-kms-key-vault-network-accesse com --azure-keyvault-kms-key-id .

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $KEY_ID

Use o seguinte comando para atualizar todos os segredos. Se você não executar esse comando, os segredos criados anteriormente não serão mais criptografados. Para clusters maiores, convém subdividir os segredos por namespace ou criar um script de atualização.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Girar chaves existentes em um cofre de chave pública

Depois de alterar o ID da chave (incluindo alterar o nome da chave ou a versão da chave), você pode usar o comando az aks update . Você pode usar os --enable-azure-keyvault-kmsparâmetros , --azure-keyvault-kms-key-vault-network-accesse com --azure-keyvault-kms-key-id az-aks-update para girar chaves existentes no KMS.

Aviso

Lembre-se de atualizar todos os segredos após a rotação das chaves. Se você não atualizar todos os segredos, os segredos ficarão inacessíveis se as chaves criadas anteriormente não existirem ou não funcionarem mais.

O KMS usa 2 chaves ao mesmo tempo. Após a primeira rotação de chaves, você precisa garantir que as chaves antiga e nova sejam válidas (não expiradas) até a próxima rotação de chaves. Após a segunda rotação da chave, a chave mais antiga pode ser removida/expirada com segurança

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-vault-network-access "Public" --azure-keyvault-kms-key-id $NEW_KEY_ID 

Use o seguinte comando para atualizar todos os segredos. Se você não executar esse comando, os segredos criados anteriormente ainda serão criptografados com a chave anterior. Para clusters maiores, convém subdividir os segredos por namespace ou criar um script de atualização.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Ativar o KMS para um cofre de chave privada

Se você ativar o KMS para um cofre de chave privada, o AKS criará automaticamente um ponto de extremidade privado e um link privado no grupo de recursos do nó. Ao cofre de chaves é adicionada uma conexão de ponto de extremidade privada com o cluster AKS.

Aviso

O KMS suporta apenas a Integração VNet do Servidor de API (visualização) para o cofre de chave privada.

Criar um cofre de chave privada e uma chave

Aviso

A exclusão da chave ou do cofre de chaves não é suportada e faz com que os segredos no cluster sejam irrecuperáveis.

Se você precisar recuperar seu cofre de chaves ou sua chave, consulte Gerenciamento de recuperação do Cofre de Chaves do Azure com proteção de exclusão e limpeza suave.

Use az keyvault create para criar um cofre de chave privada:

az keyvault create --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

Use az keyvault key create para criar uma chave:

az keyvault key create --name MyKeyName --vault-name MyKeyVault

Não há suporte para criar ou atualizar chaves em um cofre de chave privada que não tenha um ponto de extremidade privado. Para saber como gerenciar cofres de chave privada, consulte Integrar um cofre de chaves usando o Azure Private Link.

Criar uma identidade gerenciada atribuída pelo usuário para um cofre de chave privada

Use az identity create para criar uma identidade gerenciada atribuída pelo usuário:

az identity create --name MyIdentity --resource-group MyResourceGroup

Use az identity show para obter o ID do objeto de identidade:

IDENTITY_OBJECT_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'principalId' -o tsv)
echo $IDENTITY_OBJECT_ID

O exemplo anterior armazena o valor do ID do objeto de identidade em IDENTITY_OBJECT_ID.

Use az identity show para obter o ID do recurso de identidade:

IDENTITY_RESOURCE_ID=$(az identity show --name MyIdentity --resource-group MyResourceGroup --query 'id' -o tsv)
echo $IDENTITY_RESOURCE_ID

Este exemplo armazena o valor do ID do recurso de identidade em IDENTITY_RESOURCE_ID.

Atribuir permissões para desencriptar e encriptar um cofre de chave privada

As seções a seguir descrevem como atribuir, descriptografar e criptografar permissões para um cofre de chave privada.

Atribuir permissões para um cofre de chave privada não RBAC

Nota

Ao usar um cofre de chave privada, o AKS não pode validar as permissões da identidade. Verifique se a identidade recebeu permissão para acessar o cofre de chaves antes de habilitar o KMS.

Se o cofre de chaves não estiver definido com --enable-rbac-authorization, você poderá usar az keyvault set-policy para criar uma política de cofre de chaves no Azure:

az keyvault set-policy --name MyKeyVault --key-permissions decrypt encrypt --object-id $IDENTITY_OBJECT_ID

Atribuir permissões para um cofre de chave privada RBAC

Se o cofre de chaves estiver definido com --enable-rbac-authorization, atribua uma função RBAC do Azure que inclua permissões de descriptografia e criptografia:

az role assignment create --role "Key Vault Crypto User" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Para cofres de chave privada, a função de Colaborador do Cofre de Chaves é necessária para criar um link privado entre o cofre de chave privada e o cluster.

az role assignment create --role "Key Vault Contributor" --assignee-object-id $IDENTITY_OBJECT_ID --assignee-principal-type "ServicePrincipal" --scope $KEYVAULT_RESOURCE_ID

Crie um cluster AKS que tenha um cofre de chave privada e ative a criptografia KMS etcd

Para ativar a criptografia KMS etcd para um cofre de chave privada, crie um cluster AKS usando o comando az aks create . Você pode usar os --enable-azure-keyvault-kmsparâmetros az-aks-create, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accesse --azure-keyvault-kms-key-vault-resource-id com .

az aks create \
    --name myAKSCluster \
    --resource-group MyResourceGroup \
    --assign-identity $IDENTITY_RESOURCE_ID \
    --enable-azure-keyvault-kms \
    --azure-keyvault-kms-key-id $KEY_ID \
    --azure-keyvault-kms-key-vault-network-access "Private" \
    --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID \
    --generate-ssh-keys

Atualizar um cluster AKS existente para ativar a criptografia KMS etcd para um cofre de chave privada

Para ativar a criptografia KMS etcd em um cluster existente que tenha um cofre de chave privada, use o comando az aks update . Você pode usar os --enable-azure-keyvault-kmsparâmetros az-aks-update, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accesse --azure-keyvault-kms-key-vault-resource-id com .

az aks update --name myAKSCluster --resource-group MyResourceGroup --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $KEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Use o seguinte comando para atualizar todos os segredos. Se você não executar esse comando, os segredos criados anteriormente não serão criptografados. Para clusters maiores, convém subdividir os segredos por namespace ou criar um script de atualização.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Girar chaves existentes em um cofre de chaves privadas

Depois de alterar o ID da chave (incluindo o nome da chave e a versão da chave), você pode usar o comando az aks update . Você pode usar os --enable-azure-keyvault-kmsparâmetros , --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-accesse --azure-keyvault-kms-key-vault-resource-id com az-aks-update para girar as chaves existentes do KMS.

Aviso

Lembre-se de atualizar todos os segredos após a rotação das chaves. Se você não atualizar todos os segredos, os segredos ficarão inacessíveis se as chaves criadas anteriormente não existirem ou não funcionarem mais.

Depois de girar a chave, a chave anterior (key1) ainda é armazenada em cache e não deve ser excluída. Se você quiser excluir a chave anterior (key1) imediatamente, você precisa girar a chave duas vezes. Em seguida, key2 e key3 são armazenadas em cache e key1 pode ser excluída sem afetar o cluster existente.

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Use o seguinte comando para atualizar todos os segredos. Se você não atualizar todos os segredos, os segredos criados anteriormente serão criptografados com a chave anterior. Para clusters maiores, convém subdividir os segredos por namespace ou criar um script de atualização.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Atualizar um modo de cofre de chaves

Nota

Para alterar um cofre de chaves diferente com um modo diferente (seja público ou privado), você pode executar az aks update diretamente. Para alterar o modo de um cofre de chaves anexado, você deve primeiro desativar o KMS e, em seguida, ativá-lo novamente usando os novos IDs do cofre de chaves.

As seções a seguir descrevem como migrar um cofre de chave pública anexado para o modo privado. Essas etapas também podem ser usadas para migrar do privado para o público.

Desativar o KMS no cluster

Desative o KMS em um cluster existente e libere o cofre de chaves:

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Use o seguinte comando para atualizar todos os segredos. Se você não executar esse comando, os segredos criados anteriormente ainda serão criptografados com a chave anterior. Para clusters maiores, convém subdividir os segredos por namespace ou criar um script de atualização.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Alterar o modo de cofre de chaves

Atualize o cofre de chaves de público para privado:

az keyvault update --name MyKeyVault --resource-group MyResourceGroup --public-network-access Disabled

Para migrar de privado para público defina --public-network-access para Enabled no comando acima.

Ativar o KMS para o cluster usando o cofre de chaves atualizado

Ative o KMS usando o cofre de chave privada atualizado:

az aks update --name myAKSCluster --resource-group MyResourceGroup  --enable-azure-keyvault-kms --azure-keyvault-kms-key-id $NewKEY_ID --azure-keyvault-kms-key-vault-network-access "Private" --azure-keyvault-kms-key-vault-resource-id $KEYVAULT_RESOURCE_ID

Depois de configurar o KMS, você pode ativar as configurações de diagnóstico para o cofre de chaves para verificar os logs de criptografia.

Desativar KMS

Antes de desativar o KMS, você pode usar o seguinte comando da CLI do Azure para verificar se o KMS está ativado:

az aks list --query "[].{Name:name, KmsEnabled:securityProfile.azureKeyVaultKms.enabled, KeyId:securityProfile.azureKeyVaultKms.keyId}" -o table

Se os resultados confirmarem que o KMS está ativado, execute o seguinte comando para desativar o KMS no cluster:

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Use o seguinte comando para atualizar todos os segredos. Se você não executar esse comando, os segredos criados anteriormente ainda serão criptografados com a chave anterior e as permissões de criptografia e descriptografia no cofre de chaves ainda serão necessárias. Para clusters maiores, convém subdividir os segredos por namespace ou criar um script de atualização.

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Suporte KMS v2

A partir da versão 1.27 do AKS, ativar o recurso KMS configura o KMS v2. Com o KMS v2, você não está limitado aos 2.000 segredos suportados pelas versões anteriores. Para obter mais informações, consulte Aprimoramentos do KMS V2.

Migrar para o KMS v2

Se a versão do cluster for anterior à 1.27 e você já tiver ativado o KMS, a atualização para a versão do cluster 1.27 ou posterior será bloqueada. Use as seguintes etapas para migrar para o KMS v2:

  1. Desative o KMS no cluster.
  2. Execute a migração de armazenamento.
  3. Atualize o cluster para a versão 1.27 ou posterior.
  4. Ative o KMS no cluster.
  5. Execute a migração de armazenamento.

Desativar o KMS para migrar o armazenamento

Para desativar o KMS em um cluster existente, use o az aks update comando com o --disable-azure-keyvault-kms argumento:

az aks update --name myAKSCluster --resource-group MyResourceGroup --disable-azure-keyvault-kms

Migrar armazenamento

Para atualizar todos os segredos, use o kubectl get secrets comando com o --all-namespaces argumento:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

Atualizar o cluster AKS

Para atualizar um cluster AKS, use o az aks upgrade comando. Defina a versão para 1.27.x ou posterior usando o --kubernetes-version argumento.

az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <AKS version>

Eis um exemplo:

az aks upgrade --resource-group myResourceGroup --name myAKSCluster --kubernetes-version 1.27.1

Ativar o KMS após a migração do armazenamento

Você pode ativar o recurso KMS no cluster novamente para criptografar os segredos. Depois, o cluster AKS usa KMS v2. Se não quiser migrar para o KMS v2, você pode criar um novo cluster com a versão 1.27 ou posterior com o KMS ativado.

Migrar armazenamento para KMS v2

Para criptografar novamente todos os segredos no KMS v2, use o kubectl get secrets comando com o --all-namespaces argumento:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -