Use a extensão Azure Key Vault Secrets Provider para buscar segredos em clusters Kubernetes habilitados para Azure Arc

O Azure Key Vault Provider for Secrets Store CSI Driver permite a integração do Azure Key Vault como um repositório de segredos com um cluster Kubernetes por meio de um volume CSI. Para clusters Kubernetes habilitados para Azure Arc, você pode instalar a extensão Azure Key Vault Secrets Provider para buscar segredos.

Os recursos da extensão Azure Key Vault Secrets Provider incluem:

  • Monta segredos/chaves/certs no pod usando um volume CSI Inline
  • Suporta portabilidade de pod com o CRD SecretProviderClass
  • Suporta contêineres Linux e Windows
  • Suporta sincronização com segredos do Kubernetes
  • Suporta rotação automática de segredos
  • Os componentes de extensão são implantados em zonas de disponibilidade, tornando-as redundantes de zona

Gorjeta

Se o acesso offline for necessário, ou se você precisar de segredos sincronizados no repositório de segredos do Kubernetes, use a extensão Secret Store para gerenciamento de segredos em seus clusters Kubernetes habilitados para Arc.

Pré-requisitos

  • Um cluster com uma distribuição Kubernetes suportada que está conectada ao Azure Arc. As seguintes distribuições Kubernetes são atualmente suportadas para este cenário:
    • Cluster API Azure
    • Clusters do Serviço Kubernetes do Azure (AKS) no Azure Stack HCI
    • AKS habilitado pelo Azure Arc
    • Motor Kubernetes do Google
    • Distribuição OpenShift Kubernetes
    • Distribuição canônica do Kubernetes
    • Serviço Elastic Kubernetes
    • Tanzu Kubernetes Grid
    • Azure Red Hat OpenShift
  • Conectividade de saída para os seguintes pontos de extremidade:
    • linuxgeneva-microsoft.azurecr.io
    • upstreamarc.azurecr.io
    • *.blob.core.windows.net
  • Verifique se você atendeu aos pré-requisitos gerais para extensões de cluster. Você deve usar a versão 0.4.0 ou mais recente da extensão CLI do k8s-extension Azure.

Instalar a extensão Azure Key Vault Secrets Provider em um cluster Kubernetes habilitado para Arc

Você pode instalar a extensão Azure Key Vault Secrets Provider em seu cluster conectado no portal do Azure, usando a CLI do Azure ou implantando um modelo ARM.

Apenas uma instância da extensão pode ser implantada em cada cluster Kubernetes habilitado para Azure Arc.

Gorjeta

Se o cluster estiver atrás de um servidor proxy de saída, certifique-se de conectá-lo ao Azure Arc usando a opção de configuração de proxy antes de instalar a extensão.

Portal do Azure

  1. No portal do Azure, navegue até Kubernetes - Azure Arc e selecione seu cluster.

  2. Selecione Extensões (em Configurações) e, em seguida, selecione + Adicionar.

    Captura de tela mostrando o painel Extensões para um cluster Kubernetes habilitado para Arc no portal do Azure.

  3. Na lista de extensões disponíveis, selecione Azure Key Vault Secrets Provider para implantar a versão mais recente da extensão.

    Captura de ecrã a mostrar a extensão Azure Key Vault Secrets Provider no portal do Azure.

  4. Siga as instruções para implantar a extensão. Se necessário, personalize a instalação alterando as opções padrão na guia Configuração .

CLI do Azure

  1. Defina as variáveis de ambiente:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Instale o driver CSI do Secrets Store e a extensão Azure Key Vault Secrets Provider executando o seguinte comando:

    az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider
    

Você deve ver uma saída semelhante a este exemplo. Pode levar vários minutos até que o gráfico Helm do provedor de segredos seja implantado no cluster.

{
  "aksAssignedIdentity": null,
  "autoUpgradeMinorVersion": true,
  "configurationProtectedSettings": {},
  "configurationSettings": {},
  "customLocationSettings": null,
  "errorInfo": null,
  "extensionType": "microsoft.azurekeyvaultsecretsprovider",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
  "identity": {
    "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "tenantId": null,
    "type": "SystemAssigned"
  },
  "location": null,
  "name": "akvsecretsprovider",
  "packageUri": null,
  "provisioningState": "Succeeded",
  "releaseTrain": "Stable",
  "resourceGroup": "$RESOURCE_GROUP",
  "scope": {
    "cluster": {
      "releaseNamespace": "kube-system"
    },
    "namespace": null
  },
  "statuses": [],
  "systemData": {
    "createdAt": "2022-05-12T18:35:56.552889+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
  },
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "1.1.3"
}

Modelo ARM

  1. Crie um arquivo .json usando o seguinte formato. Certifique-se de atualizar o valor de nome> do <cluster para fazer referência ao cluster.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "ConnectedClusterName": {
                "defaultValue": "<cluster-name>",
                "type": "String",
                "metadata": {
                    "description": "The Connected Cluster name."
                }
            },
            "ExtensionInstanceName": {
                "defaultValue": "akvsecretsprovider",
                "type": "String",
                "metadata": {
                    "description": "The extension instance name."
                }
            },
            "ExtensionVersion": {
                "defaultValue": "",
                "type": "String",
                "metadata": {
                    "description": "The version of the extension type."
                }
            },
            "ExtensionType": {
                "defaultValue": "Microsoft.AzureKeyVaultSecretsProvider",
                "type": "String",
                "metadata": {
                    "description": "The extension type."
                }
            },
            "ReleaseTrain": {
                "defaultValue": "stable",
                "type": "String",
                "metadata": {
                    "description": "The release train."
                }
            }
        },
        "functions": [],
        "resources": [
            {
                "type": "Microsoft.KubernetesConfiguration/extensions",
                "apiVersion": "2021-09-01",
                "name": "[parameters('ExtensionInstanceName')]",
                "identity": {
                 "type": "SystemAssigned"
                },
                "properties": {
                    "extensionType": "[parameters('ExtensionType')]",
                    "releaseTrain": "[parameters('ReleaseTrain')]",
                    "version": "[parameters('ExtensionVersion')]"
                },
                "scope": "[concat('Microsoft.Kubernetes/connectedClusters/', parameters('ConnectedClusterName'))]"
            }
        ]
    }
    
  2. Agora, defina as variáveis de ambiente usando o seguinte comando da CLI do Azure:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Por fim, execute este comando da CLI do Azure para instalar a extensão Azure Key Vault Secrets Provider:

    az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME
    

Agora você deve ser capaz de exibir os recursos do provedor secreto e usar a extensão em seu cluster.

Validar a instalação da extensão

Para confirmar a instalação bem-sucedida da extensão Azure Key Vault Secrets Provider, execute o seguinte comando.

az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider

Você deve ver uma saída semelhante a este exemplo.

{
  "aksAssignedIdentity": null,
  "autoUpgradeMinorVersion": true,
  "configurationProtectedSettings": {},
  "configurationSettings": {},
  "customLocationSettings": null,
  "errorInfo": null,
  "extensionType": "microsoft.azurekeyvaultsecretsprovider",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
  "identity": {
    "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "tenantId": null,
    "type": "SystemAssigned"
  },
  "location": null,
  "name": "akvsecretsprovider",
  "packageUri": null,
  "provisioningState": "Succeeded",
  "releaseTrain": "Stable",
  "resourceGroup": "$RESOURCE_GROUP",
  "scope": {
    "cluster": {
      "releaseNamespace": "kube-system"
    },
    "namespace": null
  },
  "statuses": [],
  "systemData": {
    "createdAt": "2022-05-12T18:35:56.552889+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
  },
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "1.1.3"
}

Criar ou selecionar um Cofre da Chave do Azure

Em seguida, especifique o Cofre da Chave do Azure a ser usado com seu cluster conectado. Se você ainda não tiver um, crie um novo Cofre da Chave usando os seguintes comandos. Lembre-se de que o nome do cofre de chaves deve ser globalmente exclusivo.

Defina as seguintes variáveis de ambiente:

export AKV_RESOURCE_GROUP=<resource-group-name>
export AZUREKEYVAULT_NAME=<AKV-name>
export AZUREKEYVAULT_LOCATION=<AKV-location>

Em seguida, execute o seguinte comando:

az keyvault create -n $AZUREKEYVAULT_NAME -g $AKV_RESOURCE_GROUP -l $AZUREKEYVAULT_LOCATION

O Azure Key Vault pode armazenar chaves, segredos e certificados. Neste exemplo, você pode definir um segredo de texto sem formatação chamado DemoSecret usando o seguinte comando:

az keyvault secret set --vault-name $AZUREKEYVAULT_NAME -n DemoSecret --value MyExampleSecret

Antes de passar para a próxima seção, tome nota das seguintes propriedades:

  • Nome do objeto secreto no Cofre da Chave
  • Tipo de objeto (segredo, chave ou certificado)
  • Nome do recurso Cofre da Chave
  • A ID do Locatário do Azure para a assinatura à qual o Cofre da Chave pertence

Fornecer identidade para acessar o Azure Key Vault

Atualmente, o driver CSI do Secrets Store em clusters habilitados para Arc pode ser acessado por meio de uma entidade de serviço. Siga estas etapas para fornecer uma identidade que possa acessar seu Cofre de Chaves.

  1. Siga as etapas para criar uma entidade de serviço no Azure. Anote a ID do Cliente e o Segredo do Cliente gerados nesta etapa.

  2. Em seguida, verifique se o Cofre da Chave do Azure tem permissão GET para a entidade de serviço criada.

  3. Use o ID do cliente e o segredo do cliente na primeira etapa para criar um segredo do Kubernetes no cluster conectado:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. Rotule o segredo criado:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. Crie um SecretProviderClass com o seguinte YAML, preenchendo seus valores para nome do cofre de chaves, ID do locatário e objetos para recuperar de sua instância AKV:

    # This is a SecretProviderClass example using service principal to access Keyvault
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: akvprovider-demo
    spec:
      provider: azure
      parameters:
        usePodIdentity: "false"
        keyvaultName: <key-vault-name>
        cloudName:                           # Defaults to AzurePublicCloud
        objects:  |
          array:
            - |
              objectName: DemoSecret
              objectType: secret             # object types: secret, key or cert
              objectVersion: ""              # [OPTIONAL] object versions, default to latest if empty
        tenantId: <tenant-Id>                # The tenant ID of the Azure Key Vault instance
    

    Para uso com nuvens nacionais, mude cloudName para AzureUSGovernmentCloud Azure Government ou para Microsoft AzureChinaCloud Azure operado pela 21Vianet.

  6. Aplique o SecretProviderClass ao seu cluster:

    kubectl apply -f secretproviderclass.yaml
    
  7. Crie um pod com o seguinte YAML, preenchendo o nome da sua identidade:

    # This is a sample pod definition for using SecretProviderClass and service principal to access Keyvault
    kind: Pod
    apiVersion: v1
    metadata:
      name: busybox-secrets-store-inline
    spec:
      containers:
        - name: busybox
          image: k8s.gcr.io/e2e-test-images/busybox:1.29
          command:
            - "/bin/sleep"
            - "10000"
          volumeMounts:
          - name: secrets-store-inline
            mountPath: "/mnt/secrets-store"
            readOnly: true
      volumes:
        - name: secrets-store-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "akvprovider-demo"
            nodePublishSecretRef:                       
              name: secrets-store-creds
    
  8. Aplique o pod ao cluster:

    kubectl apply -f pod.yaml
    

Validar os segredos

Depois que o pod é iniciado, o conteúdo montado no caminho de volume especificado no YAML de implantação fica disponível.

## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/

## print a test secret 'DemoSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/DemoSecret

Opções de configuração adicionais

A extensão Azure Key Vault Secrets Provider dá suporte a configurações de gráfico Helm.

As seguintes definições de configuração são usadas com freqüência com a extensão Azure Key Vault Secrets Provider:

Definição de configuração Predefinido Description
enableSecretRotation false Tipo booleano. Se true, atualiza periodicamente a montagem do pod e o Kubernetes Secret com o conteúdo mais recente do armazenamento de segredos externos
rotaçãoPollInterval 2 metros Se enableSecretRotation for true, essa configuração especifica a duração do intervalo de sondagem de rotação secreta. Essa duração pode ser ajustada com base na frequência com que o conteúdo montado para todos os pods e segredos do Kubernetes precisa ser ressincronizado com o mais recente.
syncSecret.enabled false Entrada booleana. Em alguns casos, você pode querer criar um segredo do Kubernetes para espelhar o conteúdo montado. If true, SecretProviderClass permite que o secretObjects campo defina o estado desejado dos objetos Kubernetes Secret sincronizados.

Essas configurações podem ser especificadas quando a extensão é instalada usando o az k8s-extension create comando:

az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true

Você também pode alterar essas configurações após a instalação usando o az k8s-extension update comando:

az k8s-extension update --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true

Você pode usar outras definições de configuração conforme necessário para sua implantação. Por exemplo, para alterar o diretório raiz do kubelet ao criar um cluster, modifique o az k8s-extension create comando:

az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings linux.kubeletRootDir=/path/to/kubelet secrets-store-csi-driver.linux.kubeletRootDir=/path/to/kubelet

Desinstalar a extensão Azure Key Vault Secrets Provider

Para desinstalar a extensão, execute o seguinte comando:

az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider

Nota

A desinstalação da extensão não exclui as CRDs (Custom Resource Definitions) que foram criadas quando a extensão foi instalada.

Para confirmar que a instância de extensão foi excluída, execute o seguinte comando:

az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Se a extensão tiver sido removida com êxito, você não verá a extensão do Provedor de Segredos do Cofre de Chaves do Azure listada na saída. Se você não tiver outras extensões instaladas no cluster, verá uma matriz vazia.

Se você não precisar mais dele, certifique-se de excluir o segredo do Kubernetes associado à entidade de serviço executando o seguinte comando:

kubectl delete secret secrets-store-creds

Reconciliação e solução de problemas

A extensão do Provedor de Segredos do Azure Key Vault é autorrecuperável. Se alguém tentar alterar ou excluir um componente de extensão que foi implantado quando a extensão foi instalada, esse componente será reconciliado com seu estado original. As únicas exceções são para Definições de Recursos Personalizados (CRDs). Se os CRDs forem excluídos, eles não serão reconciliados. Para restaurar CRDs excluídos, use o az k8s-extension create comando novamente com o nome da instância de extensão existente.

Para obter mais informações sobre como resolver problemas comuns, consulte os guias de solução de problemas de código aberto para o provedor do Azure Key Vault para driver CSI do Secrets Store e o driver CSI do Secrets Store.

Próximos passos

  • Quer experimentar? Comece rapidamente com um cenário do Azure Arc Jumpstart usando a API de Cluster.
  • Saiba mais sobre o Azure Key Vault.