Compartilhar via


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

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

  • usar uma chave em um cofre de chaves para a criptografia etcd;
  • Trazer suas próprias chaves.
  • fornecer criptografia em repouso para segredos armazenados no etcd;
  • fazer a rotação das chaves em um cofre de chaves.

Para obter mais informações sobre como usar 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 terá mais suporte para cofres de chaves privadas para novas assinaturas ou assinaturas que não usaram essa configuração anteriormente. Para assinaturas que estão usando essa configuração atualmente ou a usaram nos últimos 60 dias, o suporte continuará até que a versão 1.30 do AKS chegue ao fim da vida útil para suporte da comunidade.

O KMS oferece suporte ao Konnectivity ou API Server VNet Integration (versão prévia) para cofres de chaves públicas.

O KMS dá suporte à Integração VNET do servidor de API (versão prévia) para cofres de chaves públicas.

É possível usar kubectl get po -n kube-system para verificar os resultados e mostrar que um pod do agente do Konnectivity está em execução. Quando há um pod em execução, isso significa que o cluster do AKS está usando o Konnectivity. Ao usar a integração de VNet do servidor de API, é possível executar o comando az aks show -g -n para verificar se a configuração enableVnetIntegration está definida como true.

Limitações

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

  • Não há suporte à exclusão da chave, do cofre de chaves ou da identidade associada.
  • A criptografia etcd do KMS não funciona com a identidade gerenciada atribuída pelo sistema. A política de acesso ao cofre de chaves deve ser definida antes da ativação do recurso. A identidade gerenciada atribuída pelo sistema só estará disponível após a criação do cluster. Considere a dependência do ciclo.
  • O Azure Key Vault com a configuração de firewall “permitir acesso público de redes virtuais e endereços IP específicos” ou “desativar acesso público” não tem suporte porque bloqueia o tráfego do plug-in KMS para o cofre de chaves.
  • O número máximo de segredos aceitos por um cluster com o KMS ativado é 2.000. No entanto, é importante observar que o KMS v2 não está limitado por essa restrição e pode lidar com um número maior de segredos.
  • Não há suporte para trazer seu próprio (BYO) cofre de chaves do Azure de outro locatário.
  • Com o KMS ativado, não é possível alterar o modo de cofre de chaves associado (entre público ou privado). Para atualizar um modo de cofre de chaves, primeiro desative o KMS e, em seguida, ative-o novamente.
  • Se um cluster tiver KMS ativado e tiver um cofre de chaves privado, ele deverá usar o Túnel de integração VNet do servidor de API. Não há suporte para konnectivity.
  • Usar a API de Conjuntos de Dimensionamento de Máquinas Virtuais para reduzir a escala dos nós no cluster até zero desaloca os nós. Assim, o cluster fica inativo e se torna irrecuperável.
  • Depois de desativar o KMS, não será possível destruir as chaves. A destruição das chaves interrompe o funcionamento do servidor de API.

O KMS dá suporte a um cofre de chaves público ou a um cofre de chaves privado.

Ativar o KMS em um cofre de chaves público

As seções a seguir descrevem como ativar o KMS em um cofre de chaves público.

Criar um cofre de chaves público e uma chave

Aviso

Não há suporte à exclusão da chave ou do cofre de chaves e isso faz com que os segredos no cluster sejam irrecuperáveis.

Se for preciso recuperar o cofre de chaves ou a chave, confira Gerenciamento de recuperação do Azure Key Vault com exclusão temporária ou proteção contra limpeza.

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

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

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 a 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 a ID da chave em KEY_ID.

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

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

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 a 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 a ID da chave em KEY_ID.

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

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 a 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 da ID do objeto de identidade em IDENTITY_OBJECT_ID.

Use az identity show para obter a 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 da ID do recurso de identidade em IDENTITY_RESOURCE_ID.

Atribuir permissões para descriptografar e criptografar um cofre de chaves público

As seções a seguir descrevem como atribuir permissões de descriptografia e criptografia para um cofre de chaves privado.

Atribuir permissões para um cofre de chaves público sem RBAC

Se o cofre de chaves não estiver definido com --enable-rbac-authorization, será possível 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 chaves público com RBAC

Se o cofre de chaves estiver definido com --enable-rbac-authorization, atribua a função de usuário criptográfico do Key Vault para conceder 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

Criar um cluster do AKS que tenha um cofre de chaves público e ativar a criptografia etcd do KMS

Para ativar a criptografia etcd do KMS, crie um cluster do AKS usando o comando az aks create. É possível usar os parâmetros --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-access e --azure-keyvault-kms-key-id com az aks create.

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 existente do AKS para ativar a criptografia etcd do KMS em um cofre de chaves público

Para ativar a criptografia etcd do KMS para um cluster existente, use o comando az aks update. É possível usar os parâmetros --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-access e --azure-keyvault-kms-key-id com az-aks-update.

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 comando a seguir 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, pode ser melhor subdividir os segredos por namespace ou criar um script de atualização.

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

Fazer a rotação das chaves existentes em um cofre de chaves público

Depois de alterar a ID da chave (incluindo a alteração do nome ou da versão dela), é possível utilizar o comando az aks update. É possível usar os parâmetros --enable-azure-keyvault-kms, --azure-keyvault-kms-key-vault-network-access e --azure-keyvault-kms-key-id com az-aks-update para fazer a rotação das chaves existentes no KMS.

Aviso

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

O KMS usa duas chaves ao mesmo tempo. Após a primeira rotação de chave, você precisará garantir que as chaves antigas e novas sejam válidas (não expiradas) até a próxima rotação de chave. Após a segunda rotação de chave, a chave mais antiga poderá 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 comando a seguir 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, pode ser melhor 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 em um cofre de chaves privado

Se você ativar o KMS em um cofre de chaves privado, o AKS criará automaticamente um ponto de extremidade privado e um link privado no grupo de recursos do nó. Uma conexão de ponto de extremidade privado será adicionada entre o cofre de chaves e o cluster do AKS.

Aviso

O KMS dá suporte apenas a Integração VNet do Servidor de API (versão prévia) para o cofre de chaves privado.

Criar um cofre de chaves privado e uma chave

Aviso

Não há suporte à exclusão da chave ou do cofre de chaves e isso faz com que os segredos no cluster sejam irrecuperáveis.

Se for preciso recuperar o cofre de chaves ou a chave, confira Gerenciamento de recuperação do Azure Key Vault com exclusão temporária ou proteção contra limpeza.

Use az keyvault create para criar um cofre de chaves privado:

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 a criação ou atualização de chaves em um cofre de chaves privado que não tenha um ponto de extremidade privado. Para saber como gerenciar cofres de chaves privados, confira Integrar um cofre de chaves usando o Link Privado do Azure.

Criar uma identidade gerenciada atribuída pelo usuário para um cofre de chaves privado

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 a 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 da ID do objeto de identidade em IDENTITY_OBJECT_ID.

Use az identity show para obter a 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 da ID do recurso de identidade em IDENTITY_RESOURCE_ID.

Atribuir permissões para descriptografar e criptografar um cofre de chaves privado

As seções a seguir descrevem como atribuir permissões de descriptografia e criptografia para um cofre de chaves privado.

Atribuir permissões para um cofre de chaves privado sem RBAC

Observação

Ao utilizar um cofre de chaves privado, 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, será possível 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 chaves privado com RBAC

Se o cofre de chaves estiver definido com --enable-rbac-authorization, atribua uma função de 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

No caso dos cofres de chaves privados, a função Colaborador do Key Vault é necessária para criar um link privado entre eles 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

Criar um cluster do AKS que tenha um cofre de chaves privado e ativar a criptografia etcd do KMS

Para ativar a criptografar etcd do KMS em um cofre de chaves privado, crie um cluster do AKS utilizando o comando az aks create. É possível usar os parâmetros --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-access e --azure-keyvault-kms-key-vault-resource-id com az-aks-create.

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 existente do AKS para ativar a criptografia etcd do KMS em um cofre de chaves privado

Para ativar a criptografia etcd do KMS em um cluster existente que tenha um cofre de chaves privado, utilize o comando az aks update. É possível usar os parâmetros --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-access e --azure-keyvault-kms-key-vault-resource-id com az-aks-update.

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 comando a seguir para atualizar todos os segredos. Se você não executar esse comando, os segredos criados anteriormente não serão criptografados. Para clusters maiores, pode ser melhor subdividir os segredos por namespace ou criar um script de atualização.

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

Fazer a rotação das chaves existentes em um cofre de chaves privado

Depois de alterar a ID da chave (incluindo o nome e a versão dela), é possível utilizar o comando az aks update. É possível usar os parâmetros --enable-azure-keyvault-kms, --azure-keyvault-kms-key-id, --azure-keyvault-kms-key-vault-network-access e --azure-keyvault-kms-key-vault-resource-id com az-aks-update para fazer a rotação das chaves existentes do KMS.

Aviso

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

Depois da rotação da chave, a chave anterior (key1) ainda ficará armazenada em cache e não deverá ser excluída. Para excluir a chave anterior (key1) imediatamente, será preciso realizar a rotação duas vezes. Assim, 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 comando a seguir 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, pode ser melhor 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

Observação

Para alterar outro cofre de chaves com um modo diferente (seja público ou privado), é possível executar az aks update diretamente. Para alterar o modo de um cofre de chaves anexado, primeiro desligue o KMS e, em seguida, ative-o novamente usando as novas IDs do cofre de chaves.

As seções a seguir descrevem como migrar um cofre de chaves público anexado para o modo privado. Essas etapas também podem ser usadas para migrar de privado para 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 comando a seguir 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, pode ser melhor 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 do 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 como Enabled no comando acima.

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

Ative o KMS usando o cofre de chaves privado 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, é possível ativar as configurações de diagnóstico do cofre de chaves para verificar os logs de criptografia.

Desativar o KMS

Antes de desativar o KMS, é possível usar o seguinte comando da CLI do Azure para verificar se ele 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 desativá-lo no cluster:

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

Use o comando a seguir 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 ainda serão necessárias no cofre de chaves. Para clusters maiores, pode ser melhor subdividir os segredos por namespace ou criar um script de atualização.

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

Suporte ao KMS V2

A partir da versão 1.27 do AKS, ativar o recurso do KMS configura o KMS v2. Com o KMS v2, você não está limitado aos 2.000 segredos que são aceitos pelas versões anteriores. Para saber mais, confira Melhorias 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 de cluster 1.27 ou superior estará bloqueada. Siga estas etapas para migrar para o KMS v2:

  1. Desative o KMS no cluster.
  2. Executar a migração do armazenamento.
  3. Atualize o cluster para a versão 1.27 ou superior.
  4. Ative o KMS no cluster.
  5. Executar a migração do armazenamento.

Desativar o KMS para migrar o armazenamento

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

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

Migrar o armazenamento

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

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

Atualizar o cluster do AKS

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

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

Veja 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

É possível ativar o recurso do KMS novamente no cluster para criptografar os segredos. Depois disso, o cluster do AKS utilizará o KMS v2. Se você não deseja migrar para o KMS v2, pode criar um cluster da versão 1.27 ou superior com o KMS ativado.

Migrar o armazenamento para o KMS v2

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

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