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
- Než začnete, ujistěte se, že dokončíte kroky v části Použití zprostředkovatele služby Azure Key Vault pro ovladač CSI úložiště tajných kódů v clusteru Azure Kubernetes Service (AKS), abyste v clusteru AKS povolili ovladač CSI úložiště tajných kódů služby Azure Key Vault.
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
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
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)
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
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
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
aserviceAccountNamespace
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
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}
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
objectName
použijeteobjectAlias
, aktualizujte skript YAML tak, aby ho zohlednil.Poznámka:
Aby funkce
SecretProviderClass
fungovala správně, nezapomeňte před odkazem na ně vobjects
části naplnit službu Azure Key Vault tajnými klíči, klíči nebo certifikáty.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
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 identituclientId
, 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
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
Vytvořte
SecretProviderClass
následující YAML. Nezapomeňte použít vlastní hodnoty prouserAssignedIdentityID
,keyvaultName
tenantId
a 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
objectName
použijeteobjectAlias
, nezapomeňte aktualizovat skript YAML.Poznámka:
Aby funkce
SecretProviderClass
fungovala správně, nezapomeňte před odkazem na ně vobjects
části naplnit službu Azure Key Vault tajnými klíči, klíči nebo certifikáty.Použijte ho v
SecretProviderClass
clusterukubectl apply
pomocí příkazu.kubectl apply -f secretproviderclass.yaml
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"
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íč.
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/
Pomocí následujícího příkazu zobrazte tajný kód v úložišti. Tento ukázkový příkaz ukazuje tajný kód
ExampleSecret
testu .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:
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-addons
azure-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.