Připojení zprostředkovatele identity Azure do ovladače CSI úložiště tajných kódů služby Azure Key Vault ve službě Azure Kubernetes Service (AKS)

Ovladač rozhraní CSI (Secrets Store Container Storage Interface) ve službě Azure Kubernetes Service (AKS) poskytuje různé metody přístupu na základě identit ke službě Azure Key Vault. Tento článek popisuje tyto metody a osvědčené postupy pro použití modelů zabezpečení na základě role (RBAC) nebo OpenID Připojení (OIDC) pro přístup k trezoru klíčů a clusteru AKS.

Můžete použít jednu z následujících metod přístupu:

Požadavky pro ovladač CSI

Přístup pomocí ID úloh Microsoft Entra

ID úloh Microsoft Entra je identita, kterou aplikace spuštěná na podu používá k ověření vůči jiným službám Azure, jako jsou úlohy v softwaru. Ovladač CSI úložiště tajných kódů se integruje s nativními funkcemi Kubernetes pro federaci s externími zprostředkovateli identit.

V tomto modelu zabezpečení funguje cluster AKS jako vystavitel tokenu. Id Microsoft Entra pak pomocí OIDC vyhledá veřejné podpisové klíče a před výměnou tokenu účtu služby ověří pravost tokenu účtu služby. Aby vaše úloha vyměnit token účtu služby promítaný na jeho svazek pro token Microsoft Entra, potřebujete klientskou knihovnu Azure Identity v sadě Azure SDK nebo knihovně Microsoft Authentication Library (MSAL).

Poznámka:

  • Tato metoda ověřování nahrazuje identitu spravovanou podem Microsoft Entra (Preview). Open source identita spravovaná podem Microsoft Entra (Preview) ve službě Azure Kubernetes Service je od 24. 10. 2022 zastaralá.
  • ID úloh Microsoft Entra podporuje clustery s Windows i Linuxem.

Konfigurace identity úloh

  1. Nastavte své předplatné pomocí az account set příkazu.

    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. Vytvořte spravovanou identitu pomocí az identity create příkazu.

    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. Vytvořte přiřazení role, které udělí identitě úlohy oprávnění pro přístup k tajným klíčům trezoru klíčů, přístupovým klíčům a certifikátům pomocí az role assignment create příkazu.

    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. Pomocí příkazu získejte adresu URL vystavitele clusteru az aks show AKS OIDC.

    Poznámka:

    Tento krok předpokládá, že máte existující cluster AKS s povolenou adresou URL vystavitele OIDC. Pokud ho nemáte povolený, přečtěte si téma Aktualizace clusteru AKS s vystavitelem OIDC, abyste ho povolili.

    export AKS_OIDC_ISSUER="$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query "oidcIssuerProfile.issuerUrl" -o tsv)"
    echo $AKS_OIDC_ISSUER
    
  5. Vytvořte přihlašovací údaje federované identity mezi aplikací Microsoft Entra, vystavitelem účtu služby a předmětem. Pomocí následujících příkazů získejte ID objektu aplikace Microsoft Entra. Nezapomeňte aktualizovat hodnoty pro serviceAccountName a serviceAccountNamespace s názvem účtu služby Kubernetes a jeho oborem názvů.

    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. Pomocí příkazu vytvořte přihlašovací údaje federované identity mezi spravovanou identitou, vystavitelem účtu služby a předmětem az identity federated-credential create .

    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. SecretProviderClass Nasaďte příkaz pomocí kubectl apply příkazu a následující skript 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
    

    Poznámka:

    Pokud místo toho objectNamepoužijete objectAlias , aktualizujte skript YAML tak, aby ho zohlednil.

    Poznámka:

    Aby funkce SecretProviderClass fungovala správně, nezapomeňte před odkazem na ně v objects části naplnit službu Azure Key Vault tajnými klíči, klíči nebo certifikáty.

  8. Pomocí příkazu a následujícího skriptu YAML nasaďte ukázkový pod kubectl apply .

    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
    

Přístup pomocí spravované identity

Spravované ID Microsoft Entra je identita, kterou správce používá k ověření vůči jiným službám Azure. Spravovaná identita používá RBAC k federaci s externími zprostředkovateli identit.

V tomto modelu zabezpečení můžete udělit přístup k prostředkům clusteru členům týmu nebo tenantům, kteří sdílejí spravovanou roli. U role se kontroluje obor pro přístup ke klíči a dalším přihlašovacím údajům. Když jste ve svém clusteru AKS povolili zprostředkovatele služby Azure Key Vault pro ovladač CSI úložiště tajných kódů, vytvořil identitu uživatele.

Konfigurace spravované identity

  1. K trezoru az aks show klíčů se dostanete pomocí příkazu a spravované identity přiřazené uživatelem vytvořené doplňkem. Měli byste také načíst identitu clientId, kterou použijete v pozdějších krocích při vytváření 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
    

    Případně můžete vytvořit novou spravovanou identitu a přiřadit ji ke škálovací sadě virtuálních počítačů nebo ke každé instanci virtuálního počítače ve vaší skupině dostupnosti pomocí následujících příkazů.

    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. Vytvořte přiřazení role, které udělí identitě přístup k tajným klíčům trezoru klíčů, přístupovým klíčům a certifikátům pomocí az role assignment create příkazu.

    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. Vytvořte SecretProviderClass následující YAML. Nezapomeňte použít vlastní hodnoty pro userAssignedIdentityID, keyvaultNametenantIda objekty pro načtení z trezoru klíčů.

    # 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
    

    Poznámka:

    Pokud místo toho objectNamepoužijete objectAlias , nezapomeňte aktualizovat skript YAML.

    Poznámka:

    Aby funkce SecretProviderClass fungovala správně, nezapomeňte před odkazem na ně v objects části naplnit službu Azure Key Vault tajnými klíči, klíči nebo certifikáty.

  4. Použijte ho v SecretProviderClass clusteru kubectl apply pomocí příkazu.

    kubectl apply -f secretproviderclass.yaml
    
  5. Vytvořte pod pomocí následujícího 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"
    
  6. Použijte pod ve svém clusteru kubectl apply pomocí příkazu.

    kubectl apply -f pod.yaml
    

Ověření tajných kódů služby Key Vault

Po spuštění podu je k dispozici připojený obsah v cestě svazku zadané v YAML nasazení. Pomocí následujících příkazů ověřte tajné kódy a vytiskněte testovací tajný klíč.

  1. Pomocí následujícího příkazu zobrazte tajné kódy uložené v úložišti tajných kódů.

    kubectl exec busybox-secrets-store-inline-user-msi -- ls /mnt/secrets-store/
    
  2. Pomocí následujícího příkazu zobrazte tajný kód v úložišti. Tento ukázkový příkaz ukazuje tajný kód ExampleSecrettestu .

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

Získání certifikátů a klíčů

Návrh služby Azure Key Vault výrazně rozlišuje klíče, tajné kódy a certifikáty. Funkce certifikátů služby Key Vault jsou navržené tak, aby využívaly funkce klíčů a tajných kódů. Když vytvoříte certifikát trezoru klíčů, vytvoří se adresovatelný klíč a tajný klíč se stejným názvem. Tento klíč umožňuje operace ověřování a tajný klíč umožňuje načtení hodnoty certifikátu jako tajného klíče.

Certifikát trezoru klíčů obsahuje také veřejná metadata certifikátu x509. Trezor klíčů ukládá veřejné i privátní komponenty vašeho certifikátu do tajného kódu. Každou jednotlivou komponentu můžete získat zadáním in objectTypeSecretProviderClass. Následující tabulka ukazuje, které objekty se mapují na různé prostředky přidružené k vašemu certifikátu:

Object Vrácená hodnota Vrátí celý řetěz certifikátů.
key Veřejný klíč ve formátu PEM (Privacy Enhanced Mail).
cert Certifikát ve formátu PEM. No
secret Privátní klíč a certifikát ve formátu PEM. Ano

Zakázání doplňku u existujících clusterů

Poznámka:

Než doplněk zakážete, ujistěte se, že se nepoužíváSecretProviderClass . Pokus o zakázání doplňku v době, kdy SecretProviderClass existuje, dojde k chybě.

  • Pomocí příkazu s doplňkem zakažte zprostředkovatele služby Azure Key Vault pro funkci ovladače CSI úložiště tajných kódů v existujícím clusteru az aks disable-addonsazure-keyvault-secrets-provider .

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

Poznámka:

Když doplněk zakážete, stávající úlohy by neměly mít žádné problémy nebo by se v připojených tajných kódech neměly zobrazovat žádné aktualizace. Pokud se pod restartuje nebo se v rámci události vertikálního navýšení kapacity vytvoří nový pod, pod se nespustí, protože ovladač už není spuštěný.

Další kroky

V tomto článku jste se dozvěděli, jak vytvořit a poskytnout identitu pro přístup ke službě Azure Key Vault. Pokud chcete nakonfigurovat další možnosti konfigurace nebo provést řešení potíží, pokračujte dalším článkem.