Sdílet prostřednictvím


Připojení zprostředkovatele identity Azure k ovladači CSI úložiště tajných klíčů 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 Connect (OIDC) pro přístup k trezoru klíčů a clusteru AKS.

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

  • Service Connector se spravovanou identitou
  • ID úloh
  • Spravovaná identita přiřazená uživatelem

Zjistěte, jak se připojit ke službě Azure Key Vault pomocí ovladače CSI úložiště tajných kódů v clusteru Azure Kubernetes Service (AKS) pomocí konektoru služby. V tomto článku dokončíte následující úlohy:

  • Vytvořte cluster AKS a Azure Key Vault.
  • Vytvořte připojení mezi clusterem AKS a službou Azure Key Vault pomocí konektoru služby.
  • SecretProviderClass Vytvořte CRD a zprostředkovatele Pod CSI, který využívá k otestování připojení.
  • Vyčistěte prostředky.

Důležité

Funkce AKS ve verzi Preview jsou k dispozici na samoobslužné bázi. Verze Preview jsou poskytovány "tak, jak jsou" a "dostupné", a jsou vyloučené ze smluv o úrovni služeb a omezené záruky. Verze Preview AKS jsou částečně pokryty zákaznickou podporou na základě maximálního úsilí. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

Požadavky

Počáteční nastavení

  1. Pokud konektor service connector používáte poprvé, spusťte příkaz az provider register a zaregistrujte poskytovatele prostředků služby a konfigurace Kubernetes.

    az provider register -n Microsoft.ServiceLinker
    
    az provider register -n Microsoft.KubernetesConfiguration
    

    Tip

    Spuštěním příkazů az provider show -n "Microsoft.ServiceLinker" --query registrationState az provider show -n "Microsoft.KubernetesConfiguration" --query registrationStatea můžete zkontrolovat, jestli už jsou tito poskytovatelé prostředků zaregistrovaní.

  2. Volitelně můžete pomocí příkazu Azure CLI získat seznam podporovaných cílových služeb pro cluster AKS.

    az aks connection list-support-types --output table
    

Vytvoření zdrojů Azure

  1. Pomocí příkazu vytvořte skupinu az group create prostředků.

    az group create \
        --name <resource-group-name> \
        --location <location>
    
  2. Pomocí příkazu vytvořte cluster az aks create AKS. Následující příklad vytvoří cluster AKS s jedním uzlem s povolenou spravovanou identitou.

    az aks create \
        --resource-group <resource-group-name> \
        --name <cluster-name> \
        --enable-managed-identity \
        --node-count 1
    
  3. Připojte se ke clusteru az aks get-credentials pomocí příkazu.

    az aks get-credentials \
        --resource-group <resource-group-name> \
        --name <cluster-name>
    
  4. Pomocí příkazu vytvořte trezor az keyvault create klíčů Azure.

    az keyvault create \
        --resource-group <resource-group-name> \  
        --name <key-vault-name> \
        --location <location>
    
  5. Pomocí příkazu vytvořte v trezoru az keyvault secret set klíčů tajný klíč.

    az keyvault secret set \
        --vault-name <key-vault-name> \
        --name <secret-name> \
        --value <secret-value>
    

Vytvoření připojení služby v AKS pomocí konektoru service (Preview)

Připojení služby ke službě Azure Key Vault můžete vytvořit pomocí webu Azure Portal nebo Azure CLI.

  1. Na webu Azure Portal přejděte k prostředku clusteru AKS.

  2. V nabídce služby v části Nastavení vyberte Konektor služby (Preview)>Vytvořit.

  3. Na stránce Vytvořit připojení nakonfigurujte na kartě Základy následující nastavení:

    • Obor názvů Kubernetes: Vyberte výchozí.
    • Typ služby: Vyberte Službu Key Vault a zaškrtnutím políčka povolte zprostředkovatele CSI služby Azure Key Vault.
    • Název připojení: Zadejte název připojení.
    • Předplatné: Vyberte předplatné, které obsahuje trezor klíčů.
    • Trezor klíčů: Vyberte trezor klíčů, který jste vytvořili.
    • Typ klienta: Vyberte Žádné.
  4. Vyberte Zkontrolovat a vytvořit a pak vyberte Vytvořit a vytvořte připojení.

Test připojení

Naklonujte ukázkové úložiště a nasaďte soubory manifestu.

  1. Naklonujte ukázkové úložiště pomocí git clone příkazu.

    git clone https://github.com/Azure-Samples/serviceconnector-aks-samples.git
    
  2. Změňte adresáře na ukázku zprostředkovatele CSI služby Azure Key Vault.

    cd serviceconnector-aks-samples/azure-keyvault-csi-provider
    
  3. secret_provider_class.yaml V souboru nahraďte následující zástupné symboly informacemi o službě Azure Key Vault:

    • Nahraďte <AZURE_KEYVAULT_NAME> názvem trezoru klíčů, který jste vytvořili a připojili.
    • Nahraďte <AZURE_KEYVAULT_TENANTID> ID tenanta trezoru klíčů.
    • Nahraďte <AZURE_KEYVAULT_CLIENTID> ID klienta identity doplňku azureKeyvaultSecretsProvider .
    • Nahraďte <KEYVAULT_SECRET_NAME> tajným kódem trezoru klíčů, který jste vytvořili. Například ExampleSecret.
  4. SecretProviderClass Nasaďte CRD pomocí kubectl apply příkazu.

    kubectl apply -f secret_provider_class.yaml
    
  5. Nasaďte soubor manifestu Pod kubectl apply pomocí příkazu.

    Příkaz vytvoří pod pojmenovaný sc-demo-keyvault-csi ve výchozím oboru názvů vašeho clusteru AKS.

    kubectl apply -f pod.yaml
    

Ověření připojení

  1. Pomocí příkazu ověřte, že se pod úspěšně kubectl get vytvořil.

    kubectl get pod/sc-demo-keyvault-csi
    

    Po spuštění podu je k dispozici připojený obsah v cestě svazku zadané v YAML nasazení.

  2. Pomocí příkazu zobrazte tajné kódy uložené v úložišti kubectl exec tajných kódů.

    kubectl exec sc-demo-keyvault-csi -- ls /mnt/secrets-store/
    
  3. Zobrazení tajného kubectl exec kódu pomocí příkazu

    Tento ukázkový příkaz ukazuje testovací tajný klíč s názvem ExampleSecret.

    kubectl exec sc-demo-keyvault-csi -- cat /mnt/secrets-store/ExampleSecret
    

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.

    Poznámka:

    Tento krok předpokládá, že máte existující cluster AKS s povolenou identitou úloh. Pokud ho nemáte povolené, přečtěte si téma Povolení identity úloh v existujícím clusteru AKS, abyste ji povolili.

    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)
    
  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.

    Důležité

    • Pokud je váš trezor klíčů nastavený --enable-rbac-authorization a používáte key nebo certificate zadáváte typ, přiřaďte Key Vault Certificate User roli k udělení oprávnění.
    • Pokud je váš trezor klíčů nastavený --enable-rbac-authorization a používáte secret typ, přiřaďte Key Vault Secrets User roli.
    • Pokud se váš trezor klíčů nenastaví--enable-rbac-authorization, můžete k udělení přístupu ke klíčům, certifikátům nebo tajným klíčům použít az keyvault set-policy příkaz , --key-permissions get--certificate-permissions getnebo --secret-permissions get parametr vytvořit zásadu trezoru klíčů. Příklad:
    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
    
  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
    

Požadavky pro ovladač CSI

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 --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
    

    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 --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
    
  2. Vytvořte přiřazení role, které udělí identitě 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.

    Důležité

    • Pokud je váš trezor klíčů nastavený --enable-rbac-authorization a používáte key nebo certificate zadáváte, přiřaďte Key Vault Certificate User roli.
    • Pokud je váš trezor klíčů nastavený --enable-rbac-authorization a používáte secret typ, přiřaďte Key Vault Secrets User roli.
    • Pokud se váš trezor klíčů nenastaví--enable-rbac-authorization, můžete k udělení přístupu ke klíčům, certifikátům nebo tajným klíčům použít az keyvault set-policy příkaz , --key-permissions get--certificate-permissions getnebo --secret-permissions get parametr vytvořit zásadu trezoru klíčů. Příklad:
    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
    
  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 objectType SecretProviderClass. Následující tabulka ukazuje, které objekty se mapují na různé prostředky přidružené k vašemu certifikátu:

Objekt 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-addons azure-keyvault-secrets-provider .

    az aks disable-addons --addons azure-keyvault-secrets-provider --resource-group myResourceGroup --name 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. Integrace konektoru služby pomáhá zjednodušit konfiguraci připojení pro úlohy AKS a backingové služby Azure. Bezpečně zpracovává konfiguraci ověřování a sítě a dodržuje osvědčené postupy pro připojení ke službám Azure. Další informace najdete v tématu Použití poskytovatele služby Azure Key Vault pro ovladač CSI úložiště tajných kódů v clusteru AKS a úvod ke konektoru služby.

Pokud chcete nakonfigurovat další možnosti konfigurace nebo provést řešení potíží, přečtěte si téma Možnosti konfigurace a řešení potíží pro poskytovatele služby Azure Key Vault s ovladačem CSI úložiště tajných kódů v AKS.