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
- Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
- CLI do Azure, versão 2.39.0 ou posterior. Execute
az --version
para localizar a sua versão. Se você precisar instalar ou atualizar, confira Instalar a CLI do Azure.
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
Atribuir permissões para criar um link privado
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:
- Desative o KMS no cluster.
- Executar a migração do armazenamento.
- Atualize o cluster para a versão 1.27 ou superior.
- Ative o KMS no cluster.
- 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 -
Azure Kubernetes Service