Usare il provider di Azure Key Vault per il driver CSI dell'archivio segreti Kubernetes
Si applica a: AKS su Azure Locale 22H2, AKS su Windows Server
Il driver CSI dell'archivio segreti Kubernetes integra gli archivi segreti con Kubernetes tramite un volume CSI (Container Storage Interface). Se si integra il driver CSI dell'archivio segreti con il servizio Azure Kubernetes abilitato da Azure Arc, è possibile montare segreti, chiavi e certificati come volume. I dati vengono quindi montati nel file system del contenitore.
Con il driver CSI dell'archivio segreti è anche possibile integrare un insieme di credenziali delle chiavi con uno dei provider supportati, ad esempio Azure Key Vault.
Operazioni preliminari
Prima di iniziare, verificare di aver soddisfatto i prerequisiti seguenti:
- Account e sottoscrizione di Azure.
- Una distribuzione esistente del servizio Azure Kubernetes abilitata da Arc con un cluster del carico di lavoro esistente. Se non si ha una distribuzione, seguire questa guida introduttiva per la distribuzione di un host del servizio Azure Kubernetes e di un cluster del carico di lavoro.
- Se si eseguono cluster Linux, devono trovarsi nella versione Linux 1.16.0 o successiva.
- Se si eseguono cluster Windows, devono trovarsi nella versione di Windows 1.18.0 o successiva.
- Assicurarsi di aver completato le installazioni seguenti:
- Helm
kubectl
- L'ultima versione dell'interfaccia della riga di comando di Azure.
Accedere ai cluster usando kubectl
Eseguire il comando seguente per accedere al cluster usando kubectl
. Nel comando sostituire il valore di -name
con il nome del cluster esistente. Il nome del cluster usa il file del kubeconfig
cluster specificato come file predefinito kubeconfig
per kubectl
:
Get-AksHciCredential -name mycluster
Installare il driver CSI dell'archivio segreti
Per installare il driver CSI dell'archivio segreti, eseguire il comando Helm seguente:
helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
Il comando seguente installa sia il driver CSI dell'archivio segreti che il provider di Azure Key Vault:
helm install csi csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --namespace kube-system
Nota
È necessario installare il driver CSI dell'archivio segreti e il provider di Azure Key Vault nello spazio dei kube-system
nomi . Questa guida usa lo kube-system
spazio dei nomi per tutte le istanze.
Verificare che il driver CSI dell'archivio segreti e il provider di Azure Key Vault siano installati correttamente
Controllare i pod in esecuzione per assicurarsi che il driver CSI dell'archivio segreti e il provider di Azure Key Vault siano installati eseguendo i comandi seguenti:
Per verificare che il driver CSI dell'archivio segreti sia installato, eseguire questo comando:
kubectl get pods -l app=secrets-store-csi-driver -n kube-system
Output di esempio:
NAME READY STATUS RESTARTS AGE secrets-store-csi-driver-spbfq 3/3 Running 0 3h52m
Per verificare che il provider di Azure Key Vault sia installato, eseguire questo comando:
kubectl get pods -l app=csi-secrets-store-provider-azure -n kube-system
Output di esempio:
NAME READY STATUS RESTARTS AGE csi-csi-secrets-store-provider-azure-tpb4j 1/1 Running 0 3h52m
Aggiungere segreti in un insieme di credenziali delle chiavi di Azure
È necessaria una risorsa di Azure Key Vault che contiene i dati segreti. È possibile usare una risorsa di Azure Key Vault esistente o crearne una nuova.
Se è necessario creare una risorsa di Azure Key Vault, eseguire il comando seguente. Assicurarsi di aver eseguito l'accesso az login
con le credenziali di Azure. Modificare quindi i valori seguenti nell'ambiente:
az keyvault create -n <keyvault-name> -g <resourcegroup-name> -l eastus
Azure Key Vault può archiviare chiavi, segreti e certificati. Nell'esempio seguente viene configurato un segreto di testo normale denominato ExampleSecret
:
az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSHCIExampleSecret
Creare un'identità in Azure
Usare un'entità servizio per accedere all'istanza di Azure Key Vault creata nel passaggio precedente. È consigliabile registrare gli output quando si eseguono i comandi seguenti. I passaggi successivi usano sia il segreto client che l'ID client.
Specificare il segreto client eseguendo il comando seguente:
az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription-id> --name http://secrets-store-test --query 'password' -otsv
Specificare l'ID client eseguendo il comando seguente:
az ad sp show --id http://secrets-store-test --query 'appId' -otsv
Fornire l'identità per accedere all'insieme di credenziali delle chiavi di Azure
Usare i valori del passaggio precedente per impostare le autorizzazioni come illustrato nel comando seguente:
az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <client-id>
Creare il segreto Kubernetes con le credenziali
Per creare il segreto Kubernetes con le credenziali dell'entità servizio, eseguire il comando seguente. Sostituire i valori seguenti con l'ID client e il segreto client appropriati del passaggio precedente:
kubectl create secret generic secrets-store-creds --from-literal clientid=<client-id> --from-literal clientsecret=<client-secret>
Per impostazione predefinita, il provider dell'archivio segreti ha filtrato l'espressione di controllo abilitata per i segreti. È possibile consentire al comando di trovare il segreto nella configurazione predefinita aggiungendo l'etichetta secrets-store.csi.k8s.io/used=true
al segreto:
kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
Creare e applicare un oggetto SecretProviderClass personalizzato
Per usare e configurare il driver CSI dell'archivio segreti per il cluster Kubernetes, creare una SecretProviderClass
risorsa personalizzata. Verificare che la objects
matrice corrisponda agli oggetti archiviati nell'istanza di Azure Key Vault:
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
name: <keyvault-name> # The name of the Azure Key Vault
namespace: kube-system
spec:
provider: azure
parameters:
keyvaultName: "<keyvault-name>" # The name of the Azure Key Vault
useVMManagedIdentity: "false"
userAssignedIdentityID: "false"
cloudName: "" # [OPTIONAL for Azure] if not provided, Azure environment defaults to AzurePublicCloud
objects: |
array:
- |
objectName: <secret-name> # In this example, 'ExampleSecret'
objectType: secret # Object types: secret, key or cert
objectVersion: "" # [OPTIONAL] object versions, default to latest if empty
tenantId: "<tenant-id>" # the tenant ID containing the Azure Key Vault instance
Applicare SecretProviderClass al cluster
Per distribuire l'oggetto SecretProviderClass
creato nel passaggio precedente, usare il comando seguente:
kubectl apply -f ./new-secretproviderclass.yaml
Aggiornare e applicare il file YAML di distribuzione del cluster
Per assicurarsi che il cluster usi la nuova risorsa personalizzata, aggiornare il file YAML di distribuzione. Ad esempio:
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: "<keyvault-name>"
nodePublishSecretRef: # Only required when using service principal mode
name: secrets-store-creds # Only required when using service principal mode
Applicare quindi il file YAML di distribuzione aggiornato al cluster:
kubectl apply -f ./my-deployment.yaml
Convalidare la distribuzione dell'archivio segreti
Per visualizzare i segreti contenuti in secrets-store
, eseguire il comando seguente:
kubectl exec busybox-secrets-store-inline --namespace kube-system -- ls /mnt/secrets-store/
L'output dovrebbe mostrare il nome del segreto. In questo esempio viene visualizzato l'output seguente:
ExampleSecret
Per visualizzare il segreto di test mantenuto in secrets-store
, eseguire il comando seguente:
kubectl exec busybox-secrets-store-inline --namespace kube-system -- cat /mnt/secrets-store/ExampleSecret
L'output dovrebbe mostrare il valore del segreto. In questo esempio viene illustrato l'output seguente:
MyAKSHCIExampleSecret