Azure Kubernetes Service (AKS)'da Kubernetes API'sinde Microsoft Entra ID yetkilendirmeyi kullanma

Şunlar için geçerlidir: ✔️ AKS Otomatik ✔️ AKS Standart

Bu makalede, Microsoft Entra ID kimliklerini kullanarak Azure Kubernetes Service (AKS)'da Kubernetes API'sine çağrıları yetkilendirme gösterilmektedir. Kubernetes API'sine yönelik Microsoft Entra ID yetkilendirme, Kubernetes kaynaklarına erişim vermek için Azure RBAC rol atamalarını kullanır. Yerleşik Kubernetes kaynakları için küme veya ad alanı kapsamında AKS yerleşik rollerinden birini (Azure Kubernetes Service RBAC Okuyucusu gibi) atayın. Özel kaynaklar (CRD) için, atananın erişebileceği CRD gruplarını veya türlerini belirten Azure ABAC koşullarıyla özel bir rol atayın. İki rol ataması oluşturur: biri standart Kubernetes kaynaklarına erişim, diğeri ise belirli özel kaynaklara koşullu erişim verir.

Çoğu üretim iş yükü için AKS Otomatik, AKS için önerilen üretime hazır varsayılan değerdir. AKS Otomatik kümeleri Kubernetes yetkilendirmesi için Azure RBAC ile önceden yapılandırılmıştır, böylece kullanıcılara, gruplara ve hizmet sorumlularına doğru Microsoft Entra rol atamalarını atamaya odaklanabilirsiniz.

AKS'de kullanılabilir Kubernetes API yetkilendirme seçeneklerine kavramsal genel bakış için bkz. Küme yetkilendirme kavramları.

Note

Microsoft Entra Id ile AKS arasında tümleşik kimlik doğrulaması kullandığınızda, Kubernetes rol tabanlı erişim denetiminde (Kubernetes RBAC) konu olarak Microsoft Entra kullanıcılarını, gruplarını veya hizmet sorumlularını kullanabilirsiniz. Microsoft Entra ID yetkilendirmesini kullanarak Kubernetes için kullanıcı kimliklerini ve kimlik bilgilerini ayrı ayrı yönetmeniz gerekmez. Ancak yine de Microsoft Entra ID rol atamalarını ve tüm Kubernetes RBAC bağlamalarını ayrı olarak ayarlamanız ve yönetmeniz gerekir.

Note

AKS Otomatik kümeleri, Kubernetes yetkilendirmesi için Azure RBAC kullanacak şekilde önceden yapılandırılmıştır. AKS Automatic kümelerinde --enable-azure-rbac etkinleştirmeniz gerekmez. AKS Standard'da, küme yapılandırmanıza bağlı olarak Azure RBAC'yi etkinleştirebilir veya devre dışı bırakabilirsiniz.

Prerequisites

  • Azure CLI sürüm 2.24.0 veya üzerinin yüklü ve yapılandırılmış olması gerekir. Sürümü bulmak için az --version komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekiyorsa bkz. Azure CLI'yı yükleme.
  • sürümünün, en az 1.18.3 olması gerekiyor.>
  • Kubernetes API'sine Microsoft Entra ID yetkilendirme ekleyebilmeniz için önce kümenizde yönetilen Microsoft Entra tümleştirmesinin etkinleştirilmesi gerekir. Yönetilen Microsoft Entra tümleştirmesini etkinleştirmeniz gerekiyorsa bkz. AKS'de Microsoft Entra Kimliğini kullanma.
  • Yeni rol atamalarının yayılması beş dakika kadar sürebilir ve yetkilendirme sunucusu tarafından güncelleştirilebilir.
  • Kubernetes API'sinin Microsoft Entra ID yetkilendirmesi, kimlik doğrulaması için yapılandırılan Microsoft Entra kiracısının AKS kümenizi barındıran aboneliğin kiracısı ile aynı olmasını gerektirir.

AKS küme modu davranışı

Küme modu Kubernetes yetkilendirmesi için RBAC Azure
AKS Otomatik Önceden yapılandırılmış (varsayılan olarak etkin)
AKS Standard İsteğe bağlı (ile --enable-azure-rbacetkinleştir )

Yönetilen Microsoft Entra tümleştirmesi ve Microsoft Entra ID yetkilendirmesi ile yeni bir AKS kümesi oluşturma

Yeni üretim iş yükleri için AKS Otomatik'i kullanın. Kubernetes yetkilendirmesi için Azure RBAC, AKS Otomatik kümelerinde önceden yapılandırılmıştır.

  1. Azure Kubernetes Service (AKS) Automatic kümesi oluşturma başlıklı makaledeki adımları izleyerek bir AKS Automatic kümesi oluşturun.

  2. İsteğe bağlı: komutunu kullanarak kümenizde Kubernetes yetkilendirmesi için Azure RBAC'nin az aks show etkinleştirildiğini doğrulayın.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    az aks show \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --query "aadProfile.enableAzureRbac" \
      --output tsv
    

AKS Standard

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

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=<azure-region>
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. az aks create komutunu kullanarak, yönetilen Microsoft Entra tümleştirmesi ve Microsoft Entra ID yetkilendirmesi ile bir Standart AKS kümesi oluşturun.

    export CLUSTER_NAME=<cluster-name>
    
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --enable-aad \
        --enable-azure-rbac \
        --generate-ssh-keys
    

    Çıkışınız aşağıdaki örnek çıkışa benzer olmalıdır:

    "AADProfile": {
        "adminGroupObjectIds": null,
        "clientAppId": null,
        "enableAzureRbac": true,
        "managed": true,
        "serverAppId": null,
        "serverAppSecret": null,
        "tenantId": "****-****-****-****-****"
    }
    

Mevcut aks kümesinde Microsoft Entra ID yetkilendirmeyi etkinleştirme

Mevcut AKS Standard kümeleri için, --enable-azure-rbac bayrağıyla birlikte az aks update komutunu kullanarak Kubernetes API'si için Microsoft Entra ID yetkilendirmesini etkinleştirin.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Enable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac

AKS Otomatik kümelerinde kubernetes yetkilendirmesi için önceden yapılandırılmış Azure RBAC zaten var. AKS Otomatik için çalıştırmanız --enable-azure-rbac gerekmez.

AKS yerleşik rolleri

AKS aşağıdaki yerleşik rolleri sağlar:

Rol Description
Azure Kubernetes Service RBAC Okuyucusu İsim alanındaki çoğu nesneyi görmek için salt okunur erişime izin verir. Rolleri veya rol bağlamalarını görüntülemeye izin vermez. Bu rol, Sırların içeriğini okumanın ad alanında ServiceAccount kimlik bilgilerine erişim sağlayarak API'ye herhangi bir ServiceAccount olarak erişim verilmesine yol açabileceği için, Secrets görüntülemeye izin vermez (bir tür ayrıcalık yükseltimi).
Azure Kubernetes Service RBAC Yazıcısı Ad alanı içindeki çoğu nesneye okuma/yazma erişimine izin verir. Bu rol, rollerin veya rol bağlamalarının görüntülenmesine veya değiştirilmesine izin vermez. Ancak, bu rol podlara ad alanında herhangi bir ServiceAccount olarak erişmeye Secrets ve çalıştırmaya izin verir, bu nedenle ad alanında herhangi bir ServiceAccount'ın API erişim düzeylerini kazanmak için kullanılabilir.
Azure Kubernetes Service RBAC Yöneticisi Yönetici erişimine izin verir, bir ad alanı içinde verilmesi amaçlanmıştır. Ad alanındaki (veya küme kapsamındaki) çoğu kaynağa okuma/yazma erişimi sağlar ve ad alanı içinde roller ve rol bağlamaları oluşturma yeteneği dahil. Bu rol, kaynak kotasına veya ad alanının kendisine yazma erişimine izin vermez.
Azure Kubernetes Service RBAC Kümesi Yöneticisi Süper kullanıcıya herhangi bir kaynaktaki tüm işlemleri yapabilme izni verir. Kümedeki ve tüm ad alanlarındaki her kaynak üzerinde tam denetim sağlar.

Küme erişimi için rol atamaları oluşturma

  1. komutunu kullanarak az aks show AKS kaynak kimliğinizi alın.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
  2. az role assignment create komutunu kullanarak bir rol ataması oluşturun. <AAD-ENTITY-ID> bir hizmet sorumlusunun kullanıcı adı veya istemci kimliği olabilir. Aşağıdaki örnek, Azure Kubernetes Service RBAC Yönetici rolü için bir rol ataması oluşturur.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the Azure Kubernetes Service RBAC Admin role
    az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

    Note

    komutunu kullanarak az role assignment create Azure Kubernetes Service RBAC Okuyucusu ve Azure Kubernetes Service RBAC Yazıcısı rol atamalarını küme içindeki belirli bir ad alanına göre oluşturabilir ve kapsamı istenen ad alanına ayarlayabilirsiniz.

    az role assignment create --role "Azure Kubernetes Service RBAC Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID/namespaces/<namespace-name>
    

Özel rol tanımları oluşturma

Yerleşik Kubernetes kaynakları için özel rol tanımlamaları, ilgili API grubu işlemi kapsamında Microsoft.ContainerService/managedClusters/'e başvurur. Aşağıdaki örnek, kullanıcının yalnızca dağıtımları okumasına izin verir ve başka bir şey okumaz. Olası eylemlerin tam listesi için bkz. Microsoft.ContainerService işlemleri. Belirli özel kaynak (CRD) gruplarına veya türlerine erişimi filtrelemek için bu makalenin devamında yer alan ABAC koşullarını kullanarak özel kaynak erişimini kısıtlama konusuna bakın.

  1. Kendi özel rol tanımlarınızı oluşturmak için aşağıdaki dosyayı kopyalayın, <YOUR-SUBSCRIPTION-ID> öğesini kendi abonelik kimliğinizle değiştirin ve ardından dosyayı deploy-view.json olarak kaydedin.

    {
        "Name": "AKS Deployment Reader",
        "Description": "Lets you view all deployments in cluster/namespace.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/apps/deployments/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. Komutunu az role definition create kullanarak rol tanımını oluşturun ve --role-definition öğesini, önceki adımda oluşturduğunuz deploy-view.json dosyasına ayarlayın.

    az role definition create --role-definition @deploy-view.json 
    
  3. komutunu kullanarak rol tanımını bir kullanıcıya veya başka bir kimliğe atayın az role assignment create .

        # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS Deployment Reader role
    az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

ABAC koşullarını kullanarak özel kaynak erişimini kısıtlama (önizleme)

Important

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "mevcut olduğu şekilde" sağlanmakta olup, hizmet seviyesi anlaşmalarına ve sınırlı garantilere dahil edilmemektedir. AKS önizlemeleri, müşteri desteği ekibi tarafından maksimum çaba gösterilerek kısmen ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

ABAC koşulları, küme başına Kubernetes RBAC Role ve RoleBinding bildirimleri yazmadan, Microsoft Entra ID’den merkezi olarak Microsoft Entra ID rol atamalarını belirli özel kaynak (CRD) grupları ve türleriyle filtrelemenizi sağlar. Azure ABAC'de arka plan için bkz. Azure rol atama koşulları nelerdir?

ABAC koşulları ne zaman kullanılır?

Şunları yapmak istediğinizde bu özelliği kullanın:

  • Atananların listeleyebileceği veya alabildiği CRD gruplarını veya türlerini kısıtlayın.
  • Kubernetes RBAC'yi Role ve RoleBinding her kümedeki nesneleri yönetmeden Microsoft Entra ID'den özel kaynak erişim sınırlarını merkezi olarak zorunlu tutma.
  • Farklı operatörler tarafından yayımlanan CRD'leri birbirinden ayırt edin (örneğin, secrets-store.csi.x-k8s.io izin verin sırasında security.istio.io engelleyin).

Kullanılabilir koşul öznitelikleri

Aks kümesinde Kubernetes API'sine yönelik koşullar yazarken aşağıdaki istek öznitelikleri kullanılabilir:

Özellik Description
Microsoft.ContainerService/managedClusters/customResources:group Erişilmekte olan özel kaynağın API grubu (örneğin, secrets-store.csi.x-k8s.io).
Microsoft.ContainerService/managedClusters/customResources:kind Erişilen özel kaynağın türü (örneğin, secretproviderclasses).

Rol atamasına ABAC koşulu ekleme

Aşağıdaki örnek, özel kaynaklara okuma erişimi veren bir AKS CRD Okuyucusu özel rolü oluşturur. Ardından, rolü secrets-store.csi.x-k8s.io grubundaki secretproviderclasses öğesine erişime yalnızca izin veren bir koşulla atar (Secrets Store CSI Driver için Azure Key Vault sağlayıcısının kullandığı CRD).

  1. Aşağıdaki rol tanımını crd-reader.json adlı bir dosyaya kaydedin ve <YOUR-SUBSCRIPTION-ID> öğesini kendi abonelik kimliğinizle değiştirin.

    {
        "Name": "AKS CRD Reader",
        "Description": "Lets you read custom resources in the cluster.",
        "Actions": [],
        "NotActions": [],
        "DataActions": [
            "Microsoft.ContainerService/managedClusters/customresources/read"
        ],
        "NotDataActions": [],
        "assignableScopes": [
            "/subscriptions/<YOUR-SUBSCRIPTION-ID>"
        ]
    }
    
  2. komutunu kullanarak az role definition create rol tanımını oluşturun.

    az role definition create --role-definition @crd-reader.json
    
  3. Aşağıdaki koşulu adlı abac-condition.txtbir dosyaya kaydedin. Koşul, özel olmayan kaynak okumalarının değişmeden geçmesine olanak tanır ve özel kaynak okumalarını belirli bir grup ve türle kısıtlar.

    (
     (
      !(ActionMatches{'Microsoft.ContainerService/managedClusters/customresources/read'})
     )
     OR
     (
      @Request[Microsoft.ContainerService/managedClusters/customResources:group] StringEqualsIgnoreCase 'secrets-store.csi.x-k8s.io'
      AND
      @Request[Microsoft.ContainerService/managedClusters/customResources:kind] StringEqualsIgnoreCase 'secretproviderclasses'
     )
    )
    
  4. Koşulu olan rol atamasını az role assignment create komutunu kullanarak oluşturun.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # Create a role assignment for the AKS CRD Reader role with an ABAC condition
    az role assignment create \
        --role "AKS CRD Reader" \
        --assignee <AAD-ENTITY-ID> \
        --scope $AKS_ID \
        --condition "$(cat abac-condition.txt)" \
        --condition-version "2.0" \
        --description "Allow reads on SecretProviderClass resources only"
    

Azure portalı aracılığıyla bir koşul da ekleyebilirsiniz. Rol ataması ekle sayfasında Koşullar sekmesini seçin, ardından Koşul ekle'yi seçin ve ifadeyi oluşturmak için görsel düzenleyiciyi kullanın.

Koşulu doğrula

Rol ataması yayıldıktan sonra (beş dakikaya kadar sürebilir), atanan olarak oturum açın ve yalnızca izin verilen CRD'leri okuyabildiğini, diğer CRD'leri ise okuyamadığını onaylayın.

  1. komutunu kullanarak az aks get-credentials küme kimlik bilgilerini alın.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the cluster credentials
    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. secretproviderclasses grubundan koşulun izin verdiği şekilde listeleyinsecrets-store.csi.x-k8s.io. Komutun başarılı olması ve mevcut kaynakları veya boş bir listeyi (veya CRD kümede yüklü değilse bulunamadı hatasını) döndürmesi gerekir.

    kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespaces
    
  3. Koşulun engellediği Istio authorizationpolicies grubundan listeleyinsecurity.istio.io. Komut, Microsoft Entra ID yetkilendirme web kancasından bir Forbidden hatayla başarısız olmalıdır (Istio CRD'nin kümede yüklü olduğu varsayılır; aksi takdirde kubectl API sunucusu yetkilendirme web kancası'na ulaşmadan önce bulunamadı hatası döndürür).

    kubectl get authorizationpolicies.security.istio.io --all-namespaces
    

Kaynakları temizle

Microsoft Entra ID yetkilendirmesini devre dışı bırakma

az aks update komutunu --disable-azure-rbac bayrağıyla kullanarak Microsoft Entra ID yetkilendirmesini kaldırın.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>
export CLUSTER_NAME=<cluster-name>

# Disable Microsoft Entra ID authorization for the Kubernetes API
az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac

Rol atamasını sil

  1. komutunu kullanarak rol atamalarını listeleyin az role assignment list .

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<cluster-name>
    
    # Get the AKS resource ID
    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
    # List role assignments for the AKS cluster
    az role assignment list --scope $AKS_ID --query [].id --output tsv
    
  2. komutunu kullanarak az role assignment delete rol atamalarını silin.

    az role assignment delete --ids <LIST OF ASSIGNMENT IDS>
    

Rol tanımını silme

komutunu kullanarak az role definition delete özel bir rol tanımını silin.

az role definition delete --name "AKS Deployment Reader"

Kaynak grubunu ve AKS kümesini silme

komutunu kullanarak az group delete kaynak grubunu (ve içerdiği AKS kümesini) silin.

# Set environment variables
export RESOURCE_GROUP=<resource-group-name>

# Delete the resource group and all resources in it
az group delete --name $RESOURCE_GROUP --yes --no-wait

AKS hakkında daha fazla bilgi edinmek için aşağıdaki makalelere bakın: