Azure Kubernetes Service (AKS) kimlik bağlamalarını ayarlama

Azure Kubernetes Service (AKS) kümelerinizde, tek bir federasyon kimlik bilgisi (FIC) kullanarak kullanıcı tarafından atanan yönetilen kimliği (UAMI) birden fazla küme arasında eşlemek için kimlik bağlamalarını ayarlayın. Bu kurulum, FIC sınırlarına girmeden iş yükleri için Microsoft Entra kimlik doğrulamasını ölçeklendirmenize yardımcı olur.

Önkoşullar

  • Kimlik bağlamalarının nasıl çalıştığını anlamak için Kimlik bağlamaları kavramlarını gözden geçirin.
  • Azure CLI sürüm 2.73.0 veya üzeri. Sürümünüzü denetlemek için komutunu kullanın az version . Azure CLI'yı yüklemek veya güncelleştirmek için bkz. Azure CLI'yi yükleme.
  • Kimlik ve küme kapsamında aşağıdaki Azure izinlerine ihtiyacınız vardır: Microsoft.ManagedIdentity/userAssignedIdentities/federatedIdentityCredentials/write ve Microsoft.ContainerService/managedClusters/write.
  • Kubernetes küme yöneticisi (veya eşdeğeri) izinlerine sahip olmanız, ClusterRole ve ClusterRoleBinding kaynaklarını oluşturmanız için gereklidir.

Sınırlamalar

Test kaynakları oluşturma

  1. komutunu kullanarak az group create bir Azure kaynak grubu oluşturun.

    export RESOURCE_GROUP="ib-test"
    export LOCATION="westus2"
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. az aks create ve --enable-workload-identity seçeneklerini içeren komutu --enable-oidc-issuer kullanarak iş yükü kimliği ve OIDC sağlayıcısının etkinleştirildiği bir AKS kümesi oluşturun.

    export CLUSTER_NAME="ib-test-cluster"
    
    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --location $LOCATION --no-ssh-key --enable-workload-identity --enable-oidc-issuer
    
  3. komutunu kullanarak az identity create kullanıcı tarafından atanan bir yönetilen kimlik (UAMI) oluşturun.

    export MI_NAME="ib-test-mi"
    az identity create --resource-group $RESOURCE_GROUP --name $MI_NAME
    

UAMI kimliklerini alma

  • Aşağıdaki az identity show komutları kullanarak UAMI'nin kaynak, sorumlu, istemci ve kiracı kimliklerini alın ve ortam değişkenleri olarak ayarlayın:

    export MI_RESOURCE_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query id --output tsv)
    export MI_PRINCIPAL_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query principalId --output tsv)
    export MI_CLIENT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query clientId --output tsv)
    export MI_TENANT_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $MI_NAME --query tenantId --output tsv)
    

Kimlik bağlantısı oluşturma

  • UAMI'yi kimlik bağlama ile AKS kümesine az aks identity-binding create komutunu kullanarak eşleyin.

    az aks identity-binding create --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib" --managed-identity-resource-id $MI_RESOURCE_ID
    

    Uyarı

    Kimlik bağlaması oluşturduğunuzda AKS otomatik olarak UAMI altında adlı aks-identity-binding bir federasyon kimlik bilgisi (FIC) oluşturur. Bu kimlik bilgisi AKS tarafından yönetilir. Kimlik bağlamaları kullanılırken değiştirmeyin veya silmeyin. Kimlik bağlamaları için oluşturulan FIC, aynı UAMI'ye başvuran tüm kimlik bağlamalarında paylaşılır.

OIDC sağlayıcı URL'sini UAMI için alma

  • UAMI ile ilişkili OIDC sağlayıcı URL'sini elde etmek için kimlik bağlamasını incelemek amacıyla az aks identity-binding show komutunu kullanın.

    az aks identity-binding show --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name "${MI_NAME}-ib"
    

    Daraltılmış örnek çıktı:

    {
      "oidcIssuer": {
        "oidcIssuerUrl": "https://ib.oic.prod-aks.azure.com/<MI-tenant-id>/<MI-client-id>"
      }
    }
    

AKS kümesine bağlanma

  1. komutunu kullanarak az aks get-credentials AKS kümesi kimlik bilgilerini alın ve bunları ayrı bir kubeconfig dosyasına kaydedin:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME -a -f "${CLUSTER_NAME}.kubeconfig"
    
  2. Ortam değişkenini KUBECONFIG yeni kubeconfig dosyasına işaret eden şekilde ayarlayın:

    export KUBECONFIG="$(pwd)/${CLUSTER_NAME}.kubeconfig"
    

Ad alanlarını ve hizmet hesaplarını yetkilendirme

  • Belirli konulara kimlik bağlama yoluyla yönetilen kimliği kullanma izni vermek için, rol tabanlı erişim denetimini (RBAC) yapılandırın ve aşağıdaki bildirimi uygulamak için kubectl apply komutunu kullanın.

    Uyarı

    Aşağıdaki örnek, demo ad alanındaki demo hizmet hesabına açıkça başvurur. Belirli bir hizmet hesabına açıkça başvurmak bir seçenek olsa da, altında subjectsbir hizmet hesapları koleksiyonuna başvurmak da mümkündür. Daha fazla bilgi için Kubernetes belgelerindeki Konulara başvurma konusuna bakın.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Namespace
    metadata:
      name: demo
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: demo
      namespace: demo
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    rules:
      - verbs: ["use-managed-identity"]
        apiGroups: ["cid.wi.aks.azure.com"]
        resources: ["${MI_CLIENT_ID}"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: use-mi-${MI_CLIENT_ID}
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: use-mi-${MI_CLIENT_ID}
    subjects:
      - kind: ServiceAccount
        name: demo
        namespace: demo
    EOF
    

Temizleme koruması ve Azure RBAC yetkilendirmesi ile anahtar kasası oluşturma

  • az keyvault create komutunu ve --enable-purge-protection ile --enable-rbac-authorization bayraklarını kullanarak, temizleme koruması ve Azure RBAC yetkilendirmesi etkinleştirilmiş bir anahtar kasası oluşturun. Hem temizleme koruması hem de Azure RBAC yetkilendirmesi için yapılandırılmış olan mevcut bir anahtar kasasını da kullanabilirsiniz.

    export KEY_VAULT_NAME="ib-test"
    
    az keyvault create \
        --name $KEY_VAULT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --enable-purge-protection \
        --enable-rbac-authorization
    

Anahtar kasasının kaynak kimliğini ve URL'sini alın

  1. komutunu kullanarak az keyvault show anahtar kasasının kaynak kimliğini alın ve bir ortam değişkeni olarak ayarlayın:

    export KEY_VAULT_RESOURCE_ID=$(az keyvault show --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query id \
        --output tsv)
    
  2. komutunu kullanarak anahtar kasası URL'sini az keyvault show alın ve bir ortam değişkeni olarak ayarlayın:

    export KEYVAULT_URL="$(az keyvault show \
        --resource-group $RESOURCE_GROUP \
        --name $KEY_VAULT_NAME \
        --query properties.vaultUri \
        --output tsv)"
    

Anahtar kasası erişimini yapılandırma ve sır oluşturma

Aşağıdaki adımlar, Pod'dan Azure Key Vault'taki gizli dizilere, anahtarlara veya sertifikalara nasıl erişeceğini gösterir. Bu bölümdeki örnekler, iş yükü kimlikleri için anahtar deposunda gizli bilgilere erişimi yapılandırır, ancak anahtarlara veya sertifikalara erişimi yapılandırmak için benzer adımları gerçekleştirebilirsiniz.

Aşağıdaki örnekte, pod'a anahtar kasasına erişim vermek için Azure RBAC izin modelinin nasıl kullanılacağı gösterilmektedir. Azure Key Vault için Azure RBAC izin modeli hakkında daha fazla bilgi için bkz. Uygulamalara Azure RBAC kullanarak Azure Key Vault'a erişim izni verme.

  1. komutunu kullanarak az ad signed-in-user show oturum açmış kullanıcının nesne kimliğini alın ve bir ortam değişkeni olarak ayarlayın:

    export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id --output tsv)
    
  2. komutunu kullanarak anahtar kasasında kendinize Azure RBAC Key Vault Gizli Diziler Yetkilisi rolünü atayın.

    az role assignment create --assignee $CALLER_OBJECT_ID \
        --role "Key Vault Secrets Officer" \
        --scope $KEY_VAULT_RESOURCE_ID
    
  3. az keyvault secret set komutunu kullanarak anahtar kasasında bir gizli dizi oluşturun.

    export KEY_VAULT_SECRET_NAME="my-secret"
    
    az keyvault secret set \
        --vault-name $KEY_VAULT_NAME \
        --name $KEY_VAULT_SECRET_NAME \
        --value "Hello\!"
    
  4. komutunu kullanarak az role assignment create rolünü UAMI'ye atayın.

    az role assignment create \
        --assignee-object-id $MI_PRINCIPAL_ID \
        --role "Key Vault Secrets User" \
        --scope $KEY_VAULT_RESOURCE_ID \
        --assignee-principal-type ServicePrincipal
    

Hizmet hesabına açıklama ekleme

  1. kubectl annotate komutunu kullanarak yönetilen kimlik kiracı kimliği ile hizmet hesabını etiketleyin.

    kubectl annotate sa demo -n demo azure.workload.identity/tenant-id=$MI_TENANT_ID
    
  2. kubectl annotate komutunu kullanarak yönetilen kimlik istemci kimliğiyle hizmet hesabına açıklama ekleyin.

    kubectl annotate sa demo -n demo azure.workload.identity/client-id=$MI_CLIENT_ID
    

Örnek uygulamayı dağıtın

  • Aşağıdaki kubectl apply komutunu kullanarak yönetilen kimliğin Azure Key Vault'a erişebilmesi için bir erişim belirteci alacak şekilde kimlik bağlama özelliğini kullanan örnek pod'u dağıtın.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Pod
    metadata:
      name: demo
      namespace: demo
      labels:
        azure.workload.identity/use: "true"
      annotations:
        azure.workload.identity/use-identity-binding: "true"
    spec:
      serviceAccount: demo
      containers:
        - name: azure-sdk
          # source code: https://github.com/Azure/azure-workload-identity/blob/feature/custom-token-endpoint/examples/identitybinding-msal-go/main.go
          image: ghcr.io/bahe-msft/azure-workload-identity/identitybinding-msal-go:latest-linux-amd64
          env:
            - name: KEYVAULT_URL
              value: ${KEYVAULT_URL}
            - name: SECRET_NAME
              value: ${KEY_VAULT_SECRET_NAME}
      restartPolicy: Never
    EOF
    

Örnek uygulamadan anahtar kasasına erişimi doğrulama

  1. Pod'u açıklayın ve komutunu kullanarak kubectl describe pod ortam değişkenlerinin ve öngörülen belirteç birimi bağlamalarının mevcut olduğunu onaylayın.

    kubectl describe pod demo -n demo
    

    Beklenen çıktı AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_FEDERATED_TOKEN_FILE, AZURE_AUTHORITY_HOST ve AZURE_KUBERNETES_TOKEN_PROXY için değerler içermelidir. AZURE_KUBERNETES_SNI_NAME ve AZURE_KUBERNETES_CA_FILE.

  2. Pod'un bir belirteç alıp kubectl logs komutunu kullanarak kaynağa erişebildiğini doğrulayın.

    kubectl logs demo -n demo
    

    Başarılı olursa, çıktı aşağıdaki örneğe benzer olmalıdır:

    I1107 20:03:42.865180       1 main.go:77] "successfully got secret" secret="Hello!"
    

Kimlik bağlamalarını birden çok küme arasında ölçeklendirme

Kimlik bağlamaları, tek bir FIC kullanırken birden çok AKS kümesinin aynı UAMI'ye eşlenmesine olanak sağlar. Kimlik bağlamalarını birden çok küme arasında ölçeklendirmek için, aynı UAMI'ye eşlemek istediğiniz her ek küme için (küme başına yeni bir kimlik bağlaması oluşturma) örnek uygulamadan anahtar kasasına erişimi doğrulama yoluyla Kimlik bağlaması oluşturma adımlarını yineleyebilirsiniz.

Kaynakları temizle

Bu makalede oluşturduğunuz kaynaklara artık ihtiyacınız yoksa, gelecekteki maliyetleri önlemek için bunları temizleyebilirsiniz.

  1. kubectl delete pod komutunu kullanarak podu silin.

    kubectl delete pod demo -n demo
    
  2. komutunu kullanarak ad alanını kubectl delete ns silin.

    kubectl delete ns demo
    
  3. komutunu kullanarak az group delete kaynak grubunu ve tüm ilgili kaynakları silin.

    az group delete --name $RESOURCE_GROUP --yes --no-wait