Použití autorizace Microsoft Entra ID pro rozhraní API Kubernetes v AKS

Tento článek ukazuje, jak autorizovat volání rozhraní Kubernetes API ve službě Azure Kubernetes Service (AKS) pomocí identit ID Microsoft Entra. Autorizace Entra ID pro rozhraní API Kubernetes používá přiřazení rolí Azure RBAC k udělení přístupu k prostředkům Kubernetes. U integrovaných prostředků Kubernetes přiřaďte jednu z předdefinovaných rolí AKS (například Čtenář RBAC služby Azure Kubernetes Service) v oboru clusteru nebo oboru názvů. Pro vlastní prostředky (CRDs) přiřaďte vlastní roli s podmínkami Azure ABAC, které určují, ke kterým skupinám nebo druhům CRD má přiřazený přístup. Vytvoří se dvě přiřazení rolí: jedno uděluje přístup ke standardním prostředkům Kubernetes a druhé zajišťuje podmíněný přístup ke specifickým vlastním prostředkům.

Koncepční přehled dostupných možností autorizace rozhraní API Kubernetes v AKS najdete v tématu Koncepty autorizace clusteru.

Note

Pokud používáte integrované ověřování mezi ID Microsoft Entra a AKS, můžete použít uživatele, skupiny nebo služební identifikátory Microsoftu jako subjekty v řízení přístupu na základě role Kubernetes (Kubernetes RBAC). S autorizací Entra ID nemusíte samostatně spravovat identity uživatelů a přihlašovací údaje pro Kubernetes. Stále však potřebujete nastavit a spravovat přiřazení rolí Entra ID a všechny vazby RBAC Kubernetes samostatně.

Než začnete

  • Potřebujete nainstalovanou a nakonfigurovanou verzi Azure CLI 2.24.0 nebo novější. Verzi zjistíte spuštěním příkazu az --version. Pokud potřebujete instalovat nebo upgradovat, podívejte se na Install Azure CLI.
  • Potřebujete kubectl, s minimální verzí 1.18.3.
  • Abyste mohli přidat autorizaci Id Entra pro rozhraní Kubernetes API, potřebujete spravovanou integraci Microsoft Entra ve vašem clusteru. Pokud potřebujete povolit spravovanou integraci Microsoft Entra, přečtěte si téma Použití ID Microsoft Entra v AKS.
  • Nová přiřazení rolí mohou trvat až pět minut, než se aktualizují na autorizačním serveru.
  • Autorizace Entra ID pro rozhraní API Kubernetes vyžaduje, aby tenant Microsoft Entra nakonfigurovaný pro ověřování byl stejný jako tenant pro předplatné, které obsahuje váš cluster AKS.

Vytvoření nového clusteru AKS se spravovanou integrací Microsoft Entra a autorizací ID Entra

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

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=<azure-region>
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Vytvořte pomocí příkazu az aks create cluster AKS se spravovanou integrací Microsoft Entra a autorizací Entra ID.

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

    Vaše výstupy by měly vypadat podobně jako následující příklad:

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

Povolení autorizace Entra ID v existujícím clusteru AKS

  • Povolte autorizaci Entra ID pro rozhraní API Kubernetes v existujícím clusteru AKS pomocí az aks update příkazu s příznakem --enable-azure-rbac .

    az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --enable-azure-rbac
    

Předdefinované role AKS

AKS poskytuje následující předdefinované role:

Úloha Description
Čtenář RBAC služby Azure Kubernetes Service Umožňuje přístup jen pro čtení k většině objektů v jmenném prostoru. Nepovoluje zobrazení rolí nebo přidružení rolí. Tato role neumožňuje prohlížení Secrets, protože čtení obsahu Secrets umožňuje přístup k přihlašovacím údajům ServiceAccount v rámci názvoslovného prostoru, což by dovolilo přístup k API jako kterýkoli ServiceAccount v tomto prostoru (forma eskalace oprávnění).
Azure Kubernetes Service RBAC Autor Umožňuje přístup pro čtení a zápis k většině objektů v jmenném prostoru. Tato role neumožňuje zobrazení nebo úpravy rolí nebo vazeb rolí. Tato role však umožňuje přístup k Secrets Podům jako kterýkoli ServiceAccount v oboru názvů, takže se dá použít k získání úrovní přístupu rozhraní API jakéhokoli ServiceAccount v oboru názvů.
Správce RBAC služby Azure Kubernetes Service Umožňuje přístup správce, který má být přidělen v konkrétním oboru názvů. Umožňuje přístup pro čtení a zápis k většině prostředků v oboru názvů (nebo oboru clusteru), včetně možnosti vytvářet role a vazby rolí v rámci oboru názvů. Tato role neumožňuje zapisovat do kvóty zdrojů ani k samotnému prostoru názvů.
Správce clusteru RBAC služby Azure Kubernetes Service Umožňuje superuživatelům přístup k provedení jakékoli akce u libovolného prostředku. Poskytuje úplnou kontrolu nad všemi prostředky v clusteru a ve všech jmenných prostorech.

Vytvoření přiřazení rolí pro přístup ke clusteru

  1. Získejte ID prostředku AKS pomocí příkazu az aks show.

    AKS_ID=$(az aks show --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --query id --output tsv)
    
  2. Vytvořte přiřazení role pomocí příkazu az role assignment create. <AAD-ENTITY-ID> může být uživatelské jméno nebo ID klienta hlavní služby. Následující příklad vytvoří přiřazení role pro roli správce RBAC služby Azure Kubernetes Service .

    az role assignment create --role "Azure Kubernetes Service RBAC Admin" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

    Note

    Můžete vytvořit přiřazení rolí Azure Kubernetes Service RBAC Reader a Azure Kubernetes Service RBAC Writer, které jsou omezeny na konkrétní obor názvů v rámci clusteru, pomocí příkazu az role assignment create a nastavením oboru na požadovaný obor názvů.

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

Vytváření definic vlastních rolí

U integrovaných prostředků Kubernetes odkazují definice vlastních rolí na odpovídající akci skupiny rozhraní API v části Microsoft.ContainerService/managedClusters/. Následující příklad umožňuje uživateli jen číst nasazení a nic jiného. Úplný seznam možných akcí najdete v tématu Operace Microsoft.ContainerService. Pokud chcete filtrovat přístup ke konkrétním skupinám nebo typům vlastních prostředků, přečtěte si část Omezení přístupu k vlastním prostředkům pomocí podmínek ABAC dále v tomto článku.

  1. Pokud chcete vytvořit vlastní definice rolí, zkopírujte následující soubor, nahraďte <YOUR SUBSCRIPTION ID> ho vlastním ID předplatného a uložte ho jako deploy-view.json.

    {
        "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. Vytvořte definici role pomocí příkazu az role definition create, a nastavte --role-definition na soubor deploy-view.json, který jste vytvořili v předchozím kroku.

    az role definition create --role-definition @deploy-view.json 
    
  3. Pomocí příkazu přiřaďte definici role uživateli nebo jiné identitě az role assignment create .

    az role assignment create --role "AKS Deployment Reader" --assignee <AAD-ENTITY-ID> --scope $AKS_ID
    

Omezení vlastního přístupu k prostředkům pomocí podmínek ABAC (Preview)

Important

Funkce AKS ve verzi Preview jsou k dispozici na bázi samoobsluhy a dobrovolného přihlášení. Verze Preview jsou poskytovány "tak, jak jsou" a "podle dostupnosti" a neplatí pro ně smlouvy o úrovni služeb ani omezená záruka. Předběžné verze AKS jsou částečně pokryty zákaznickou podporou podle možností. Proto tyto funkce nejsou určené pro produkční použití. Další informace najdete v následujících článcích podpory:

Podmínky ABAC umožňují filtrovat přiřazení rolí Entra ID ke konkrétním skupinám a typům vlastních prostředků (CRD) – centrálně prostřednictvím Microsoft Entra ID bez potřeby psát RBAC Role a RoleBinding manifesty pro jednotlivé Kubernetes clustery. Základní informace o Azure ABAC najdete v tématu Co jsou podmínky přiřazení rolí Azure?

Kdy použít podmínky ABAC

Tuto funkci použijte, pokud chcete:

  • Omezte, které skupiny CRD nebo druhy může určený uživatel vypsat nebo získat.
  • Centrálně vynucujte přístupová omezení k vlastním prostředkům z Microsoft Entra ID bez správy Kubernetes RBAC Role a RoleBinding objektů v každém clusteru.
  • Rozlišovat mezi CRD publikovanými různými operátory (například povolit secrets-store.csi.x-k8s.io při blokování security.istio.io).

Dostupné atributy stavu

Při vytváření podmínek pro rozhraní API Kubernetes v clusteru AKS jsou k dispozici následující atributy požadavku:

Vlastnost Description
Microsoft.ContainerService/managedClusters/customResources:group Skupina API vlastního prostředku, ke které se přistupuje (například secrets-store.csi.x-k8s.io).
Microsoft.ContainerService/managedClusters/customResources:kind Typ vlastního prostředku, ke který se přistupuje (například secretproviderclasses).

Přidejte podmínku ABAC k přiřazení role

Následující příklad vytvoří vlastní roli čtenáře AKS CRD, která uděluje přístup pro čtení k vlastním prostředkům, a pak ji přiřadí s podmínkou, která povoluje přístup pouze do konkrétní skupiny secretproviderclassessecrets-store.csi.x-k8s.io (CRD používaný Azure Key Vault providerem pro Secrets Store CSI Driver).

  1. Uložte následující definici role do souboru s názvem crd-reader.jsona nahraďte <YOUR SUBSCRIPTION ID> ho vlastním ID předplatného.

    {
        "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. Pomocí příkazu vytvořte definici az role definition create role.

    az role definition create --role-definition @crd-reader.json
    
  3. Uložte následující podmínku do souboru s názvem abac-condition.txt. Podmínka umožňuje, aby čtení neuživatelských prostředků prošlo beze změny, a omezuje čtení uživatelsky definovaných prostředků na konkrétní skupinu a druh.

    (
     (
      !(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. Pomocí příkazu vytvořte přiřazení role s podmínkou az role assignment create .

    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"
    

Podmínku můžete přidat také prostřednictvím webu Azure Portal. Na stránce Přidat přiřazení role vyberte kartu Podmínky , pak vyberte Přidat podmínku a pomocí editoru vizuálů sestavte výraz.

Ověřte podmínku

Po rozšíření přiřazení role (až pět minut) se přihlaste jako přiřazený a ověřte, že může číst povolené CRD, ale ne jiné CRD.

  1. Pomocí příkazu získejte přihlašovací údaje clusteru az aks get-credentials .

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. Seznam secretproviderclasses ze secrets-store.csi.x-k8s.io skupiny, kterou podmínka umožňuje. Příkaz by měl proběhnout úspěšně a vrátit existující prostředky nebo prázdný seznam (nebo chybu, která nebyla nalezena, pokud v clusteru není nainstalovaný CRD).

    kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespaces
    
  3. Seznam authorizationpolicies ze skupiny Istio security.istio.io, kterou blokuje podmínka. Příkaz by měl selhat s chybou Forbidden z webhooku autorizace Entra ID (za předpokladu, že istio CRD je nainstalovaný v clusteru; jinak kubectl vrátí chybu nenalezena dříve, než server rozhraní API dosáhne autorizačního webhooku).

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

Vyčistěte zdroje

Zakázání autorizace Entra ID

  • Odeberte autorizaci Entra ID pomocí příkazu az aks update s příznakem --disable-azure-rbac.

    az aks update --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --disable-azure-rbac
    

Odstranit přiřazení role

  1. Zobrazení seznamu přiřazení rolí pomocí az role assignment list příkazu

    az role assignment list --scope $AKS_ID --query [].id --output tsv
    
  2. Pomocí příkazu odstraňte přiřazení az role assignment delete rolí.

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

Odstranění definice role

  • Pomocí příkazu odstraňte vlastní definici az role definition delete role.

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

Odstranění skupiny prostředků a clusteru AKS

  • Pomocí příkazu az group delete odstraňte skupinu prostředků (a cluster AKS, který obsahuje).

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

Další kroky

Další informace o ověřování, autorizaci AKS, RBAC Kubernetes a Azure RBAC najdete tady: