Conectar seu provedor de identidade do Azure ao Driver CSI do Azure Key Vault Secrets Store no Serviço Kubernetes do Azure (AKS)
O driver CSI (Secrets Store Container Storage Interface) no Serviço Kubernetes do Azure (AKS) fornece vários métodos de acesso baseado em identidade ao seu Cofre de Chaves do Azure. Este artigo descreve esses métodos e práticas recomendadas para quando usar modelos de segurança RBAC (controle de acesso baseado em função) ou OpenID Connect (OIDC) para acessar seu cofre de chaves e cluster AKS.
Você pode usar um dos seguintes métodos de acesso:
- Conector de serviço com identidade gerenciada
- ID da carga de trabalho
- Identidade gerida atribuída pelo utilizador
Saiba como se conectar ao Cofre de Chaves do Azure com o Driver CSI do Repositório de Segredos em um cluster do Serviço Kubernetes do Azure (AKS) usando o Service Connector. Neste artigo, você conclui as seguintes tarefas:
- Crie um cluster AKS e um Cofre de Chaves do Azure.
- Crie uma conexão entre o cluster AKS e o Cofre de Chaves do Azure com o Service Connector.
- Crie um
SecretProviderClass
CRD e umPod
que consuma o provedor CSI para testar a conexão. - Limpe os recursos.
Importante
Os recursos de visualização do AKS estão disponíveis em uma base de autosserviço e opt-in. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As visualizações do AKS são parcialmente cobertas pelo suporte ao cliente com base no melhor esforço. Como tal, estas funcionalidades não se destinam a utilização em produção. Para obter mais informações, consulte os seguintes artigos de suporte:
Pré-requisitos
- Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.
- CLI do Azure. Entre usando o
az login
comando. - Docker e kubectl. Para instalar o kubectl localmente, use o
az aks install-cli
comando. - Uma compreensão básica de contêineres e AKS. Comece por preparar uma candidatura para o AKS.
- Antes de começar, certifique-se de concluir as etapas em Usar o provedor do Azure Key Vault para o Driver CSI do Repositório de Segredos em um cluster do Serviço Kubernetes do Azure (AKS) para habilitar o Driver CSI do Azure Key Vault Secrets Store em seu cluster AKS.
Configuração inicial
Se você estiver usando o Service Connector pela primeira vez, comece executando o comando az provider register para registrar os provedores de recursos do Service Connector e da Configuração do Kubernetes.
az provider register -n Microsoft.ServiceLinker
az provider register -n Microsoft.KubernetesConfiguration
Gorjeta
Você pode verificar se esses provedores de recursos já foram registrados executando os comandos
az provider show -n "Microsoft.ServiceLinker" --query registrationState
eaz provider show -n "Microsoft.KubernetesConfiguration" --query registrationState
.Opcionalmente, use o comando CLI do Azure para obter uma lista de serviços de destino suportados para o cluster AKS.
az aks connection list-support-types --output table
Criar recursos do Azure
Crie um grupo de recursos usando o
az group create
comando.az group create \ --name <resource-group-name> \ --location <location>
Crie um cluster AKS usando o
az aks create
comando. O exemplo a seguir cria um cluster AKS de nó único com identidade gerenciada habilitada.az aks create \ --resource-group <resource-group-name> \ --name <cluster-name> \ --enable-managed-identity \ --node-count 1
Conecte-se ao cluster usando o
az aks get-credentials
comando.az aks get-credentials \ --resource-group <resource-group-name> \ --name <cluster-name>
Crie um cofre de chaves do Azure usando o
az keyvault create
comando.az keyvault create \ --resource-group <resource-group-name> \ --name <key-vault-name> \ --location <location>
Crie um segredo no cofre de chaves usando o
az keyvault secret set
comando.az keyvault secret set \ --vault-name <key-vault-name> \ --name <secret-name> \ --value <secret-value>
Criar uma conexão de serviço no AKS com o Service Connector (visualização)
Você pode criar uma conexão de serviço com o Cofre da Chave do Azure usando o portal do Azure ou a CLI do Azure.
No portal do Azure, navegue até o recurso de cluster AKS.
No menu de serviço, em Configurações, selecione Conector de Serviço (Visualização)>Criar.
Na página Criar conexão, defina as seguintes configurações na guia Noções básicas:
- Kubernetes namespace: Selecione padrão.
- Tipo de serviço: Selecione Cofre da Chave e marque a caixa de seleção para habilitar o Provedor CSI do Cofre da Chave do Azure.
- Nome da conexão: insira um nome para a conexão.
- Assinatura: selecione a assinatura que contém o cofre de chaves.
- Cofre de chaves: selecione o cofre de chaves que você criou.
- Tipo de cliente: Selecione Nenhum.
Selecione Rever + criar e, em seguida, selecione Criar para criar a ligação.
Testar a ligação
Clone o repositório de exemplo e implante arquivos de manifesto
Clone o repositório de exemplo usando o
git clone
comando.git clone https://github.com/Azure-Samples/serviceconnector-aks-samples.git
Altere os diretórios para o exemplo de provedor CSI do Azure Key Vault.
cd serviceconnector-aks-samples/azure-keyvault-csi-provider
No arquivo, substitua os seguintes espaços reservados pelas informações do
secret_provider_class.yaml
Cofre da Chave do Azure:- Substitua
<AZURE_KEYVAULT_NAME>
pelo nome do cofre de chaves que você criou e conectou. - Substitua
<AZURE_KEYVAULT_TENANTID>
pelo ID do locatário do cofre de chaves. - Substitua
<AZURE_KEYVAULT_CLIENTID>
pelo ID do cliente de identidade doazureKeyvaultSecretsProvider
addon. - Substitua
<KEYVAULT_SECRET_NAME>
pelo segredo do cofre de chaves que você criou. Por exemplo,ExampleSecret
.
- Substitua
Implante o
SecretProviderClass
CRD usando okubectl apply
comando.kubectl apply -f secret_provider_class.yaml
Implante o arquivo de manifesto
Pod
usando okubectl apply
comando.O comando cria um pod nomeado
sc-demo-keyvault-csi
no namespace padrão do seu cluster AKS.kubectl apply -f pod.yaml
Verificar a ligação
Verifique se o pod foi criado com êxito usando o
kubectl get
comando.kubectl get pod/sc-demo-keyvault-csi
Depois que o pod é iniciado, o conteúdo montado no caminho de volume especificado no YAML de implantação fica disponível.
Mostre os segredos guardados na loja de segredos usando o
kubectl exec
comando.kubectl exec sc-demo-keyvault-csi -- ls /mnt/secrets-store/
Exiba um segredo usando o
kubectl exec
comando.Este comando de exemplo mostra um segredo de teste chamado
ExampleSecret
.kubectl exec sc-demo-keyvault-csi -- cat /mnt/secrets-store/ExampleSecret
Pré-requisitos para o driver CSI
- Antes de começar, certifique-se de concluir as etapas em Usar o provedor do Azure Key Vault para o Driver CSI do Repositório de Segredos em um cluster do Serviço Kubernetes do Azure (AKS) para habilitar o Driver CSI do Azure Key Vault Secrets Store em seu cluster AKS.
- O Microsoft Entra Workload ID suporta clusters Windows e Linux.
Acesso com um ID de carga de trabalho do Microsoft Entra
Uma ID de Carga de Trabalho do Microsoft Entra é uma identidade que um aplicativo em execução em um pod usa para autenticar-se em outros serviços do Azure, como cargas de trabalho em software. O driver CSI do Secret Store integra-se aos recursos nativos do Kubernetes para federar com provedores de identidade externos.
Neste modelo de segurança, o cluster AKS atua como emissor de token. Em seguida, o Microsoft Entra ID usa o OIDC para descobrir chaves de assinatura públicas e verificar a autenticidade do token da conta de serviço antes de trocá-lo por um token do Microsoft Entra. Para que sua carga de trabalho troque um token de conta de serviço projetado para seu volume por um token do Microsoft Entra, você precisa da biblioteca de cliente do Azure Identity no SDK do Azure ou na Biblioteca de Autenticação da Microsoft (MSAL)
Nota
- Este método de autenticação substitui a identidade gerenciada pelo pod do Microsoft Entra (visualização). A identidade gerenciada por pod do Microsoft Entra de código aberto (visualização) no Serviço Kubernetes do Azure foi preterida a partir de 24/10/2022.
- O Microsoft Entra Workload ID é compatível com clusters Windows e Linux.
Configurar identidade da carga de trabalho
Defina sua assinatura usando o
az account set
comando.export SUBSCRIPTION_ID=<subscription id> export RESOURCE_GROUP=<resource group name> export UAMI=<name for user assigned identity> export KEYVAULT_NAME=<existing keyvault name> export CLUSTER_NAME=<aks cluster name> az account set --subscription $SUBSCRIPTION_ID
Crie uma identidade gerenciada usando o
az identity create
comando.Nota
Esta etapa pressupõe que você tenha um cluster AKS existente com a identidade da carga de trabalho habilitada. Se você não tiver habilitado, consulte Habilitar identidade de carga de trabalho em um cluster AKS existente para habilitá-lo.
az identity create --name $UAMI --resource-group $RESOURCE_GROUP export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group $RESOURCE_GROUP --name $UAMI --query 'clientId' -o tsv)" export IDENTITY_TENANT=$(az aks show --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --query identity.tenantId -o tsv)
Crie uma atribuição de função que conceda à identidade da carga de trabalho permissão para acessar os segredos do cofre de chaves, chaves de acesso e certificados usando o
az role assignment create
comando.Importante
- Se o cofre de chaves estiver definido com
--enable-rbac-authorization
e você estiver usandokey
oucertificate
digitando, atribua aKey Vault Certificate User
função para conceder permissões. - Se o cofre de chaves estiver definido com
--enable-rbac-authorization
e você estiver usandosecret
o tipo, atribua aKey Vault Secrets User
função. - Se o cofre de chaves não estiver definido com
--enable-rbac-authorization
, você poderá usar oaz keyvault set-policy
comando com o--key-permissions get
parâmetro ,--certificate-permissions get
ou--secret-permissions get
para criar uma política de cofre de chaves para conceder acesso a chaves, certificados ou segredos. Por exemplo:
az keyvault set-policy --name $KEYVAULT_NAME --key-permissions get --object-id $IDENTITY_OBJECT_ID
export KEYVAULT_SCOPE=$(az keyvault show --name $KEYVAULT_NAME --query id -o tsv) # Example command for key vault with RBAC enabled using `key` type az role assignment create --role "Key Vault Certificate User" --assignee $USER_ASSIGNED_CLIENT_ID --scope $KEYVAULT_SCOPE
- Se o cofre de chaves estiver definido com
Obtenha o URL do Emissor OIDC do cluster AKS usando o
az aks show
comando.Nota
Esta etapa pressupõe que você tenha um cluster AKS existente com a URL do Emissor OIDC habilitada. Se você não o tiver habilitado, consulte Atualizar um cluster AKS com o Emissor OIDC para habilitá-lo.
export AKS_OIDC_ISSUER="$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)" echo $AKS_OIDC_ISSUER
Estabeleça uma credencial de identidade federada entre o aplicativo Microsoft Entra, o emissor da conta de serviço e o assunto. Obtenha a ID do objeto do aplicativo Microsoft Entra usando os seguintes comandos. Certifique-se de atualizar os valores para
serviceAccountName
eserviceAccountNamespace
com o nome da conta de serviço do Kubernetes e seu namespace.export SERVICE_ACCOUNT_NAME="workload-identity-sa" # sample name; can be changed export SERVICE_ACCOUNT_NAMESPACE="default" # can be changed to namespace of your workload cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: ${USER_ASSIGNED_CLIENT_ID} name: ${SERVICE_ACCOUNT_NAME} namespace: ${SERVICE_ACCOUNT_NAMESPACE} EOF
Crie a credencial de identidade federada entre a identidade gerenciada, o emissor da conta de serviço e o assunto usando o
az identity federated-credential create
comando.export FEDERATED_IDENTITY_NAME="aksfederatedidentity" # can be changed as needed az identity federated-credential create --name $FEDERATED_IDENTITY_NAME --identity-name $UAMI --resource-group $RESOURCE_GROUP --issuer ${AKS_OIDC_ISSUER} --subject system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}
Implante um
SecretProviderClass
usando okubectl apply
comando e o seguinte script YAML.cat <<EOF | kubectl apply -f - # This is a SecretProviderClass example using workload identity to access your key vault apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-kvname-wi # needs to be unique per namespace spec: provider: azure parameters: usePodIdentity: "false" clientID: "${USER_ASSIGNED_CLIENT_ID}" # Setting this to use workload identity keyvaultName: ${KEYVAULT_NAME} # Set to the name of your key vault cloudName: "" # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud objects: | array: - | objectName: secret1 # Set to the name of your secret objectType: secret # object types: secret, key, or cert objectVersion: "" # [OPTIONAL] object versions, default to latest if empty - | objectName: key1 # Set to the name of your key objectType: key objectVersion: "" tenantId: "${IDENTITY_TENANT}" # The tenant ID of the key vault EOF
Nota
Se você usar
objectAlias
em vez deobjectName
, atualize o script YAML para contabilizá-lo.Nota
Para que o
SecretProviderClass
funcione corretamente, preencha seu Cofre de Chaves do Azure com segredos, chaves ou certificados antes de fazer referência a eles naobjects
seção.Implante um pod de exemplo usando o
kubectl apply
comando e o seguinte script YAML.cat <<EOF | kubectl apply -f - # This is a sample pod definition for using SecretProviderClass and workload identity to access your key vault kind: Pod apiVersion: v1 metadata: name: busybox-secrets-store-inline-wi labels: azure.workload.identity/use: "true" spec: serviceAccountName: "workload-identity-sa" containers: - name: busybox image: registry.k8s.io/e2e-test-images/busybox:1.29-4 command: - "/bin/sleep" - "10000" volumeMounts: - name: secrets-store01-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store01-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "azure-kvname-wi" EOF
Pré-requisitos para o driver CSI
- Antes de começar, certifique-se de concluir as etapas em Usar o provedor do Azure Key Vault para o Driver CSI do Repositório de Segredos em um cluster do Serviço Kubernetes do Azure (AKS) para habilitar o Driver CSI do Azure Key Vault Secrets Store em seu cluster AKS.
Acesso com identidade gerenciada
Uma ID Gerenciada do Microsoft Entra é uma identidade que um administrador usa para se autenticar em outros serviços do Azure. A identidade gerenciada usa RBAC para federar com provedores de identidade externos.
Neste modelo de segurança, pode conceder acesso aos recursos do cluster a membros da equipa ou inquilinos que partilhem uma função gerida. A função é verificada quanto ao escopo para acessar o keyvault e outras credenciais. Quando você habilitou o provedor do Azure Key Vault para o Driver CSI do Secrets Store em seu Cluster AKS, ele criou uma identidade de usuário.
Configurar identidade gerenciada
Acesse seu cofre de chaves usando o
az aks show
comando e a identidade gerenciada atribuída pelo usuário criada pelo complemento. Você também deve recuperar a identidade doclientId
, que será usada em etapas posteriores ao criar umSecretProviderClass
arquivo .az aks show --resource-group <resource-group> --name <cluster-name> --query addonProfiles.azureKeyvaultSecretsProvider.identity.objectId -o tsv az aks show --resource-group <resource-group> --name <cluster-name> --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId -o tsv
Como alternativa, você pode criar uma nova identidade gerenciada e atribuí-la ao seu conjunto de escala de máquina virtual (VM) ou a cada instância de VM em seu conjunto de disponibilidade usando os comandos a seguir.
az identity create --resource-group <resource-group> --name <identity-name> az vmss identity assign --resource-group <resource-group> --name <agent-pool-vmss> --identities <identity-resource-id> az vm identity assign --resource-group <resource-group> --name <agent-pool-vm> --identities <identity-resource-id> az identity show --resource-group <resource-group> --name <identity-name> --query 'clientId' -o tsv
Crie uma atribuição de função que conceda a permissão de identidade para acessar os segredos do cofre de chaves, chaves de acesso e certificados usando o
az role assignment create
comando.Importante
- Se o cofre de chaves estiver definido com
--enable-rbac-authorization
e você estiver usandokey
oucertificate
digitando, atribua aKey Vault Certificate User
função. - Se o cofre de chaves estiver definido com
--enable-rbac-authorization
e você estiver usandosecret
o tipo, atribua aKey Vault Secrets User
função. - Se o cofre de chaves não estiver definido com
--enable-rbac-authorization
, você poderá usar oaz keyvault set-policy
comando com o--key-permissions get
parâmetro ,--certificate-permissions get
ou--secret-permissions get
para criar uma política de cofre de chaves para conceder acesso a chaves, certificados ou segredos. Por exemplo:
az keyvault set-policy --name $KEYVAULT_NAME --key-permissions get --object-id $IDENTITY_OBJECT_ID
export IDENTITY_OBJECT_ID="$(az identity show --resource-group <resource-group> --name <identity-name> --query 'principalId' -o tsv)" export KEYVAULT_SCOPE=$(az keyvault show --name <key-vault-name> --query id -o tsv) # Example command for key vault with RBAC enabled using `key` type az role assignment create --role "Key Vault Certificate User" --assignee $USER_ASSIGNED_CLIENT_ID --scope $KEYVAULT_SCOPE
- Se o cofre de chaves estiver definido com
Crie um
SecretProviderClass
usando o seguinte YAML. Certifique-se de usar seus próprios valores parauserAssignedIdentityID
,keyvaultName
,tenantId
e os objetos a serem recuperados do cofre de chaves.# This is a SecretProviderClass example using user-assigned identity to access your key vault apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-kvname-user-msi spec: provider: azure parameters: usePodIdentity: "false" useVMManagedIdentity: "true" # Set to true for using managed identity userAssignedIdentityID: <client-id> # Set the clientID of the user-assigned managed identity to use keyvaultName: <key-vault-name> # Set to the name of your key vault cloudName: "" # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud objects: | array: - | objectName: secret1 objectType: secret # object types: secret, key, or cert objectVersion: "" # [OPTIONAL] object versions, default to latest if empty - | objectName: key1 objectType: key objectVersion: "" tenantId: <tenant-id> # The tenant ID of the key vault
Nota
Se você usar
objectAlias
em vez de , certifique-se deobjectName
atualizar o script YAML.Nota
Para que o
SecretProviderClass
funcione corretamente, preencha seu Cofre de Chaves do Azure com segredos, chaves ou certificados antes de fazer referência a eles naobjects
seção.Aplique o
SecretProviderClass
ao cluster usando okubectl apply
comando.kubectl apply -f secretproviderclass.yaml
Crie um pod usando o seguinte YAML.
# This is a sample pod definition for using SecretProviderClass and the user-assigned identity to access your key vault kind: Pod apiVersion: v1 metadata: name: busybox-secrets-store-inline-user-msi spec: containers: - name: busybox image: registry.k8s.io/e2e-test-images/busybox:1.29-4 command: - "/bin/sleep" - "10000" volumeMounts: - name: secrets-store01-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store01-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "azure-kvname-user-msi"
Aplique o pod ao cluster usando o
kubectl apply
comando.kubectl apply -f pod.yaml
Validar segredos do Cofre da Chave
Depois que o pod é iniciado, o conteúdo montado no caminho de volume especificado no YAML de implantação fica disponível. Use os comandos a seguir para validar seus segredos e imprimir um segredo de teste.
Mostrar segredos mantidos no armazenamento de segredos usando o seguinte comando.
kubectl exec busybox-secrets-store-inline-user-msi -- ls /mnt/secrets-store/
Exiba um segredo na loja usando o seguinte comando. Este comando de exemplo mostra o segredo
ExampleSecret
de teste .kubectl exec busybox-secrets-store-inline-user-msi -- cat /mnt/secrets-store/ExampleSecret
Obter certificados e chaves
O design do Azure Key Vault faz distinções nítidas entre chaves, segredos e certificados. Os recursos de certificado do serviço Cofre de Chaves são projetados para usar recursos de chave e segredo. Quando você cria um certificado de cofre de chaves, ele cria uma chave endereçável e um segredo com o mesmo nome. Essa chave permite operações de autenticação e o segredo permite a recuperação do valor do certificado como um segredo.
Um certificado de cofre de chaves também contém metadados de certificado x509 públicos. O cofre de chaves armazena os componentes públicos e privados do seu certificado em segredo. Você pode obter cada componente individual especificando o objectType
in SecretProviderClass
. A tabela a seguir mostra quais objetos são mapeados para os vários recursos associados ao seu certificado:
Object | Valor devolvido | Devolve toda a cadeia de certificados |
---|---|---|
key |
A chave pública, no formato PEM (Privacy Enhanced Mail). | N/A |
cert |
O certificado, em formato PEM. | Não |
secret |
A chave privada e o certificado, em formato PEM. | Sim |
Desativar o addon em clusters existentes
Nota
Antes de desativar o complemento, verifique se não SecretProviderClass
está em uso. Tentar desativar o complemento enquanto existe resulta SecretProviderClass
em um erro.
Desative o provedor do Azure Key Vault para o recurso de Driver CSI do Secrets Store em um cluster existente usando o
az aks disable-addons
comando com o complementoazure-keyvault-secrets-provider
.az aks disable-addons --addons azure-keyvault-secrets-provider --resource-group myResourceGroup --name myAKSCluster
Nota
Quando você desabilita o complemento, as cargas de trabalho existentes não devem ter problemas ou ver atualizações nos segredos montados. Se o pod for reiniciado ou um novo pod for criado como parte do evento de expansão, o pod não será iniciado porque o driver não está mais em execução.
Próximos passos
Neste artigo, você aprendeu como criar e fornecer uma identidade para acessar seu Cofre da Chave do Azure. A integração do Service Connector ajuda a simplificar a configuração de conexão para cargas de trabalho AKS e serviços de suporte do Azure. Ele lida com segurança com autenticação e configurações de rede e segue as práticas recomendadas para se conectar aos serviços do Azure. Para obter mais informações, consulte Usar o provedor do Cofre de Chaves do Azure para o Driver CSI do Repositório de Segredos em um cluster AKS e a introdução do Service Connector.
Se você quiser configurar opções de configuração adicionais ou executar a solução de problemas, consulte Opções de configuração e recursos de solução de problemas para o provedor do Azure Key Vault com o Driver CSI do Secrets Store no AKS.
Azure Kubernetes Service