Azure-identitásszolgáltató Csatlakozás az Azure Key Vault titkos kulcstárolójának CSI-illesztőprogramjához az Azure Kubernetes Service-ben (AKS)

Az Azure Kubernetes Service (AKS) Titkos tár tárolótároló-illesztője (CSI) illesztőprogramja különböző identitásalapú hozzáférést biztosít az Azure Key Vaulthoz. Ez a cikk ismerteti a kulcstartó és az AKS-fürt elérésére szolgáló szerepköralapú hozzáférés-vezérlési (RBAC) vagy OpenID Csatlakozás (OIDC) biztonsági modellek használatát.

A következő hozzáférési módszerek egyikét használhatja:

A CSI-illesztőprogram előfeltételei

Hozzáférés Microsoft Entra Számítási feladat ID

A Microsoft Entra Számítási feladat ID egy olyan identitás, amelyet egy podon futó alkalmazás más Azure-szolgáltatásokon, például a szoftverbeli számítási feladatokon való hitelesítésre használ. A Titkos tár CSI-illesztőprogramja integrálható a natív Kubernetes-képességekkel a külső identitásszolgáltatókkal való összevonáshoz.

Ebben a biztonsági modellben az AKS-fürt jogkivonat-kiállítóként működik. A Microsoft Entra ID ezután az OIDC használatával felderíti a nyilvános aláíró kulcsokat, és ellenőrzi a szolgáltatásfiók jogkivonatának hitelességét, mielőtt kicseréli azt egy Microsoft Entra-jogkivonatra. Ahhoz, hogy a számítási feladat egy Microsoft Entra-jogkivonatra előrejelzett szolgáltatásfiók-jogkivonatot cseréljen, szüksége lesz az Azure Identity ügyfélkódtárára az Azure SDK-ban vagy a Microsoft Authentication Libraryben (MSAL)

Feljegyzés

  • Ez a hitelesítési módszer felváltja a Microsoft Entra pod által felügyelt identitást (előzetes verzió). Az Azure Kubernetes Service nyílt forráskód Microsoft Entra pod által felügyelt identitása (előzetes verzió) 2022. 10. 24-én elavult.
  • Microsoft Entra Számítási feladat ID Windows- és Linux-fürtöket is támogat.

Számítási feladat identitásának konfigurálása

  1. Állítsa be az előfizetést a az account set paranccsal.

    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
    
  2. Felügyelt identitás létrehozása a az identity create paranccsal.

    az identity create --name $UAMI --resource-group $RESOURCE_GROUP
    
    export USER_ASSIGNED_CLIENT_ID="$(az identity show -g $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)
    
  3. Hozzon létre egy szerepkör-hozzárendelést, amely engedélyt ad a számítási feladat identitásának a kulcstartó titkos kulcsainak, hozzáférési kulcsainak és tanúsítványainak a az role assignment create parancs használatával való elérésére.

    export KEYVAULT_SCOPE=$(az keyvault show --name $KEYVAULT_NAME --query id -o tsv)
    
    az role assignment create --role "Key Vault Administrator" --assignee $USER_ASSIGNED_CLIENT_ID --scope $KEYVAULT_SCOPE
    
  4. Kérje le az AKS-fürt OIDC-kiállítójának URL-címét a az aks show paranccsal.

    Feljegyzés

    Ez a lépés feltételezi, hogy rendelkezik egy meglévő AKS-fürttel, amelyen engedélyezve van az OIDC-kiállító URL-címe. Ha nincs engedélyezve, az engedélyezéséhez tekintse meg az AKS-fürt OIDC-kiállítóval való frissítését.

    export AKS_OIDC_ISSUER="$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)"
    echo $AKS_OIDC_ISSUER
    
  5. Összevont identitás-hitelesítő adatok létrehozása a Microsoft Entra-alkalmazás, a szolgáltatásfiók-kiállító és a tulajdonos között. Kérje le a Microsoft Entra-alkalmazás objektumazonosítóját az alábbi parancsokkal. Mindenképpen frissítse a serviceAccountName Kubernetes-szolgáltatásfiók nevét és serviceAccountNamespace névterét.

    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
    
  6. Hozza létre az összevont identitás hitelesítő adatait a felügyelt identitás, a szolgáltatásfiók kiállítója és a tulajdonos között a az identity federated-credential create parancs használatával.

    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}
    
  7. Helyezzen üzembe egy SecretProviderClasskubectl apply parancsot és a következő YAML-szkriptet.

    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
    

    Feljegyzés

    Ha ahelyett objectNamehasználjaobjectAlias, frissítse a YAML-szkriptet, hogy elszámoljon vele.

    Feljegyzés

    A megfelelő működés érdekében SecretProviderClass a szakaszban való hivatkozás objects előtt mindenképpen töltse fel az Azure Key Vaultot titkos kulcsokkal, kulcsokkal vagy tanúsítványokkal.

  8. Helyezzen üzembe egy minta podot a kubectl apply parancs és a következő YAML-szkript használatával.

    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
    

Hozzáférés felügyelt identitással

A Microsoft Entra felügyelt azonosítója olyan identitás, amelyet a rendszergazda más Azure-szolgáltatásokon való hitelesítéshez használ. A felügyelt identitás RBAC-t használ a külső identitásszolgáltatókkal való összevonáshoz.

Ebben a biztonsági modellben hozzáférést adhat a fürt erőforrásaihoz a felügyelt szerepkörrel rendelkező csapattagoknak vagy bérlőknek. A rendszer ellenőrzi a szerepkör hatókörét a kulcsvaulthoz és más hitelesítő adatokhoz való hozzáféréshez. Amikor engedélyezte az Azure Key Vault-szolgáltatót a Titkos kulcstár CSI-illesztőprogramjához az AKS-fürtön, létrehozott egy felhasználói identitást.

Felügyelt identitás konfigurálása

  1. A kulcstartó elérése a az aks show bővítmény által létrehozott parancs és a felhasználó által hozzárendelt felügyelt identitás használatával. Le kell kérnie az identitásokat clientIdis, amelyeket a későbbi lépésekben fog használni egy SecretProviderClass.

    az aks show -g <resource-group> -n <cluster-name> --query addonProfiles.azureKeyvaultSecretsProvider.identity.objectId -o tsv
    az aks show -g <resource-group> -n <cluster-name> --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId -o tsv
    

    Másik lehetőségként létrehozhat egy új felügyelt identitást, és hozzárendelheti azt a virtuálisgép-méretezési csoporthoz vagy a rendelkezésre állási csoport egyes virtuálisgép-példányaihoz az alábbi parancsokkal.

    az identity create -g <resource-group> -n <identity-name>
    az vmss identity assign -g <resource-group> -n <agent-pool-vmss> --identities <identity-resource-id>
    az vm identity assign -g <resource-group> -n <agent-pool-vm> --identities <identity-resource-id>
    
    az identity show -g <resource-group> --name <identity-name> --query 'clientId' -o tsv
    
  2. Hozzon létre egy szerepkör-hozzárendelést, amely a parancs használatával az role assignment create hozzáférést biztosít a kulcstartó titkos kulcsaihoz, hozzáférési kulcsaihoz és tanúsítványaihoz.

    export IDENTITY_OBJECT_ID="$(az identity show -g <resource-group> --name <identity-name> --query 'principalId' -o tsv)"
    export KEYVAULT_SCOPE=$(az keyvault show --name <key-vault-name> --query id -o tsv)
    
    az role assignment create --role "Key Vault Administrator" --assignee $IDENTITY_OBJECT_ID --scope $KEYVAULT_SCOPE
    
  3. Hozzon létre egy SecretProviderClass elemet a következő YAML használatával. Ügyeljen arra, hogy a kulcstartóból lekérendő objektumokhoz userAssignedIdentityIDkeyvaultNametenantIdsaját értékeket használjon.

    # 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
    

    Feljegyzés

    Ha ahelyett objectNamehasználjaobjectAlias, frissítse a YAML-szkriptet.

    Feljegyzés

    A megfelelő működés érdekében SecretProviderClass a szakaszban való hivatkozás objects előtt mindenképpen töltse fel az Azure Key Vaultot titkos kulcsokkal, kulcsokkal vagy tanúsítványokkal.

  4. Alkalmazza a SecretProviderClass fürtöt a kubectl apply parancs használatával.

    kubectl apply -f secretproviderclass.yaml
    
  5. Hozzon létre egy podot a következő YAML használatával.

    # 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"
    
  6. Alkalmazza a podot a fürtre a kubectl apply parancs használatával.

    kubectl apply -f pod.yaml
    

Key Vault titkos kulcsok ellenőrzése

A pod elindítása után a csatlakoztatott tartalom az üzembe helyezési YAML-ben megadott kötetútvonalon érhető el. Az alábbi parancsokkal ellenőrizheti a titkos kulcsokat, és kinyomtathat egy teszttitkot.

  1. A titkos kulcstárban tárolt titkos kulcsok megjelenítése az alábbi paranccsal.

    kubectl exec busybox-secrets-store-inline-user-msi -- ls /mnt/secrets-store/
    
  2. Egy titkos kód megjelenítése az áruházban az alábbi paranccsal. Ez a példaparancs a teszttitkot ExampleSecretmutatja be.

    kubectl exec busybox-secrets-store-inline-user-msi -- cat /mnt/secrets-store/ExampleSecret
    

Tanúsítványok és kulcsok beszerzése

Az Azure Key Vault kialakítása éles különbségeket tesz a kulcsok, titkos kódok és tanúsítványok között. A Key Vault szolgáltatás tanúsítványfunkciói úgy vannak kialakítva, hogy kihasználják a kulcs- és titkos kulcsok képességeit. Kulcstartó-tanúsítvány létrehozásakor az azonos nevű címezhető kulcsot és titkos kulcsot hozza létre. Ez a kulcs lehetővé teszi a hitelesítési műveleteket, a titkos kód pedig lehetővé teszi a tanúsítvány értékének titkos kulcsként való lekérését.

A key vault-tanúsítvány nyilvános x509-tanúsítvány metaadatokat is tartalmaz. A kulcstartó titkosan tárolja a tanúsítvány nyilvános és privát összetevőit is. Az egyes összetevők beszerzéséhez adja meg a objectType következőt SecretProviderClass: Az alábbi táblázat azt mutatja be, hogy mely objektumok képeznek le a tanúsítványhoz társított különböző erőforrásokhoz:

Objektum Visszaadott érték Teljes tanúsítványláncot ad vissza
key A nyilvános kulcs adatvédelmi továbbfejlesztett levelek (PEM) formátumban. n/a
cert A tanúsítvány PEM formátumban. Nem
secret A titkos kulcs és a tanúsítvány PEM formátumban. Igen

Meglévő fürtök bővítményének letiltása

Feljegyzés

Mielőtt letiltja a bővítményt, győződjön meg arról, hogy nincsSecretProviderClass használatban. Ha letiltja a bővítményt, ha létezik, SecretProviderClass hiba jelenik meg.

  • Tiltsa le az Azure Key Vault-szolgáltató Titkos kulcstár CSI-illesztőprogram funkciójának letiltását egy meglévő fürtben a az aks disable-addonsazure-keyvault-secrets-provider bővítményt tartalmazó paranccsal.

    az aks disable-addons --addons azure-keyvault-secrets-provider -g myResourceGroup -n myAKSCluster
    

Feljegyzés

Ha letiltja a bővítményt, a meglévő számítási feladatoknak nem lehetnek problémáik, és nem láthatnak frissítéseket a csatlakoztatott titkos kódokban. Ha a pod újraindul, vagy egy új pod jön létre a vertikális felskálázási esemény részeként, a pod nem indul el, mert az illesztőprogram már nem fut.

Következő lépések

Ebben a cikkben megtanulta, hogyan hozhat létre és adhat meg identitást az Azure Key Vault eléréséhez. Ha további konfigurációs beállításokat szeretne konfigurálni vagy hibaelhárítást végezni, folytassa a következő cikkel.