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
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- CLI do Azure versão 2.39.0 ou posterior. Execute
az --version
para encontrar a sua versão. Se precisar de instalar ou atualizar, veja Instalar a CLI do Azure.
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-kms
parâmetros az aks create
, --azure-keyvault-kms-key-vault-network-access
e 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-kms
parâmetros az-aks-update
, --azure-keyvault-kms-key-vault-network-access
e 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-kms
parâmetros , --azure-keyvault-kms-key-vault-network-access
e 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
Depois de girar a versão da chave KMS com o novo keyId
, verifique securityProfile.azureKeyVaultKms.keyId
o recurso AKS json. Verifique se a nova versão da chave está em uso.
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
Atribuir permissões para criar um link privado
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-kms
parâmetros az-aks-create
, --azure-keyvault-kms-key-id
, --azure-keyvault-kms-key-vault-network-access
e --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-kms
parâmetros az-aks-update
, --azure-keyvault-kms-key-id
, --azure-keyvault-kms-key-vault-network-access
e --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-kms
parâmetros , --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 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.
Depois de girar a versão da chave KMS com o novo keyId
, verifique securityProfile.azureKeyVaultKms.keyId
o recurso AKS json. Verifique se a nova versão da chave está em uso.
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:
- Desative o KMS no cluster.
- Execute a migração de armazenamento.
- Atualize o cluster para a versão 1.27 ou posterior.
- Ative o KMS no cluster.
- 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 -
Observabilidade KMS
Recurso AKS json
Você pode verificar a configuração KMS no recurso AKS json por:
- Usando o
az aks show
comando - Através do Portal do Azure
A securityProfile.azureKeyVaultKms
seção mostra a configuração do KMS, incluindo o cofre da chave, a chave, as versões atual e anterior da chave.
Diagnosticar e resolver problemas
Como o plug-in KMS é um carro lateral do kube-apiserver Pod, você não pode acessá-lo diretamente. Para melhorar a observabilidade do KMS, você pode verificar o status do KMS da seguinte forma:
- Abra a página do Portal do Azure do seu cluster AKS
- Ir para
Diagnose and solve problems
e procurar porKMS
- No
KMS
detetor, você pode ver o status do KMS e se ele está em alguns cenários de falha conhecidos
Tomemos KeyExpired: Operation encrypt is not allowed on an expired key
como exemplo:
Como o plug-in AKS KMS atualmente só permite o cofre e a chave de chaves BYO, é sua responsabilidade gerenciar o ciclo de vida da chave. Se a chave tiver expirado, o plug-in KMS não conseguirá descriptografar os segredos existentes. Você precisa
- Estender a data de expiração da chave para fazer o KMS funcionar
- Girar a versão da chave
Azure Kubernetes Service