Använd Microsoft Entra ID-auktorisering för Kubernetes API i Azure Kubernetes Service (AKS)

Gäller för: ✔️ AKS Automatic ✔️ AKS Standard

Den här artikeln visar hur du auktoriserar anrop till Kubernetes API i Azure Kubernetes Service (AKS) med hjälp av Microsoft Entra ID identiteter. Microsoft Entra ID auktorisering för Kubernetes API använder Azure RBAC-rolltilldelningar för att bevilja åtkomst till Kubernetes-resurser. För inbyggda Kubernetes-resurser tilldelar du en av de inbyggda AKS-rollerna (till exempel Azure Kubernetes Service RBAC Reader) på kluster- eller namnområdesnivå. För anpassade resurser (CRD) tilldelar du en anpassad roll med Azure ABAC-villkor som anger vilka CRD-grupper eller typer som tilldelningsmottagaren kan komma åt. De två rolltilldelningarna består: en ger åtkomst till Kubernetes-standardresurser och den andra beviljar villkorlig åtkomst till specifika anpassade resurser.

För de flesta produktionsarbetsbelastningar är AKS Automatic den rekommenderade produktionsklara standardinställningen för AKS. AKS Automatic-kluster är förkonfigurerade med Azure RBAC för Kubernetes-behörighetshantering, så att du kan fokusera på att tilldela rätt Microsoft Entra-rolltilldelningar till användare, grupper och tjänsthuvudnamn.

En konceptuell översikt över tillgängliga Alternativ för Kubernetes API-auktorisering i AKS finns i Begrepp för klusterauktorisering.

Note

När du använder integrerad autentisering mellan Microsoft Entra ID och AKS kan du använda Microsoft Entra-användare, grupper eller tjänstens huvudnamn som ämnen i Kubernetes rollbaserad åtkomstkontroll (Kubernetes RBAC). Genom att använda Microsoft Entra ID auktorisering behöver du inte separat hantera användaridentiteter och autentiseringsuppgifter för Kubernetes. Du måste dock fortfarande konfigurera och hantera Microsoft Entra ID rolltilldelningar och alla Kubernetes RBAC-bindningar separat.

Note

AKS Automatiska kluster är förkonfigurerade för att använda Azure RBAC för Kubernetes-auktorisering. Du behöver inte aktivera --enable-azure-rbac på AKS-automatiska kluster. I AKS Standard kan du aktivera eller inaktivera Azure RBAC baserat på klusterkonfigurationen.

Prerequisites

  • Du behöver Azure CLI version 2.24.0 eller senare installerad och konfigurerad. Kör az --version för att hitta versionen. Om du behöver installera eller uppgradera, se Installera Azure CLI.
  • Du behöver kubectl, med en lägsta version av 1.18.3.
  • Du behöver hanterad Microsoft Entra integrering aktiverat i klustret innan du kan lägga till Microsoft Entra ID auktorisering för Kubernetes-API:et. Om du behöver aktivera hanterad Microsoft Entra-integrering kan du läsa Använda Microsoft Entra-ID i AKS.
  • Nya rolltilldelningar kan ta upp till fem minuter att sprida och uppdateras av auktoriseringsservern.
  • Microsoft Entra ID auktorisering för Kubernetes-API:et kräver att den Microsoft Entra klientorganisation som konfigurerats för autentisering är samma som klientorganisationen för prenumerationen som innehåller AKS-klustret.

Beteende för AKS-klusterläge

Klusterläge Azure RBAC för Kubernetes-auktorisering
AKS Automatisk Förkonfigurerad (aktiverad som standard)
AKS Standard Valfritt (aktivera med --enable-azure-rbac)

Skapa ett nytt AKS-kluster med hanterad Microsoft Entra integrering och Microsoft Entra ID auktorisering

För nya produktionsarbetsbelastningar använder du AKS Automatic. Azure RBAC för Kubernetes-auktorisering är förkonfigurerat i AKS Automatiska kluster.

  1. Skapa ett AKS-automatiskt kluster genom att följa Skapa ett Azure Kubernetes Service (AKS) automatiskt kluster.

  2. Valfritt: kontrollera att Azure RBAC för Kubernetes-auktorisering är aktiverat i klustret med hjälp av az aks show kommandot .

    # 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. Skapa en Azure resursgrupp med kommandot az group create.

    export RESOURCE_GROUP=<resource-group-name>
    export LOCATION=<azure-region>
    
    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Skapa ett AKS Standard-kluster med hanterad Microsoft Entra integrering och Microsoft Entra ID auktorisering med kommandot az aks create .

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

    Ditt resultat ska likna följande exempelresultat:

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

Aktivera Microsoft Entra ID auktorisering i ett befintligt AKS-kluster

För befintliga AKS Standard-kluster aktiverar du Microsoft Entra ID-auktorisering för Kubernetes-API:et med kommandot az aks update och flaggan --enable-azure-rbac.

# 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 Automatiska kluster har redan Azure RBAC för Kubernetes-auktorisering förkonfigurerad. Du behöver inte köra --enable-azure-rbac för AKS Automatic.

Inbyggda AKS-roller

AKS tillhandahåller följande inbyggda roller:

Befattning Description
RBAC-läsare för Azure Kubernetes Service Tillåter läsåtkomst för att se de flesta objekt i en namnrymd. Det tillåter inte visning av roller eller rollbindningar. Den här rollen tillåter inte visning Secretseftersom läsning av innehållet i Hemligheter ger åtkomst till ServiceAccount-autentiseringsuppgifter i namnområdet, vilket skulle tillåta API-åtkomst som alla ServiceAccount i namnområdet (en form av eskalering av privilegier).
Azure Kubernetes Service RBAC-skribent Tillåter läs-/skrivåtkomst till de flesta objekt i ett namnområde. Den här rollen tillåter inte visning eller ändring av roller eller rollbindningar. Den här rollen tillåter dock åtkomst till Secrets och körning av poddar som alla ServiceAccount i namnområdet, så att den kan användas för att få API-åtkomstnivåerna för alla ServiceAccount i namnområdet.
RBAC-administratör för Azure Kubernetes Service Tillåter administratörsåtkomst, avsedd att beviljas inom ett namnområde. Tillåter läs-/skrivåtkomst till de flesta resurser i ett namnområde (eller klusteromfång), inklusive möjligheten att skapa roller och rollbindningar i namnområdet. Den här rollen tillåter inte skrivåtkomst till resurskvoten eller till själva namnområdet.
RBAC-klusteradministratör för Azure Kubernetes Service Tillåter superanvändaråtkomst för att utföra alla åtgärder på alla resurser. Den ger fullständig kontroll över varje resurs i klustret och i alla namnområden.

Skapa rolltilldelningar för klusteråtkomst

  1. Hämta ditt AKS-resurs-ID med hjälp av az aks show kommandot .

    # 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. Skapa en rolltilldelning med kommandot az role assignment create . <AAD-ENTITY-ID> kan vara ett användarnamn eller klient-ID för en tjänstprincipal. I följande exempel skapas en rolltilldelning för rollen Azure Kubernetes Service RBAC-administratör.

    # 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

    Du kan skapa rolltilldelningarna Azure Kubernetes Service RBAC Reader och Azure Kubernetes Service RBAC Writer som är begränsade till ett specifikt namnområde i klustret med hjälp av az role assignment create kommandot och ange omfånget till önskat namnområde.

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

Skapa definitioner för anpassade roller

För inbyggda Kubernetes-resurser refererar anpassade rolldefinitioner till motsvarande API-gruppåtgärd under Microsoft.ContainerService/managedClusters/. I följande exempel kan en användare bara läsa distributioner och inget annat. En fullständig lista över möjliga åtgärder finns i Microsoft.ContainerService-åtgärder.

För anpassade resurser måste den anpassade rollen bevilja den tillämpliga anpassade resursdataåtgärden, till exempel Microsoft.ContainerService/managedClusters/customresources/read. Enbart en anpassad roll filtrerar inte åtkomsten efter en crd-grupp (anpassad resursdefinition) eller typ. Om du vill tillämpa filtreringen lägger du till ett Azure ABAC-villkor i rolltilldelningen. Den fullständiga proceduren finns i Begränsa åtkomst till anpassade resurser med hjälp av ABAC-villkor.

  1. Om du vill skapa egna anpassade rolldefinitioner kopierar du följande fil, ersätter <YOUR-SUBSCRIPTION-ID> med ditt eget prenumerations-ID och sparar den sedan som 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. Skapa rolldefinitionen az role definition create med kommandot och ange --role-definition till den deploy-view.json fil som du skapade i föregående steg.

    az role definition create --role-definition @deploy-view.json 
    
  3. Tilldela rolldefinitionen till en användare eller annan identitet med kommandot 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
    

Begränsa anpassad resursåtkomst med hjälp av ABAC-villkor (förhandsversion)

Viktigt!

AKS-förhandsversionsfunktioner är tillgängliga via självbetjäning och frivillig registrering. Förhandsversioner tillhandahålls "i befintligt skick" och "i mån av tillgång," och de är undantagna från servicenivåavtal och begränsad garanti. AKS-förhandsversioner stöds delvis av kundsupport efter bästa förmåga. Därför är dessa funktioner inte avsedda för produktionsanvändning. Mer information finns i följande supportartiklar:

Med ABAC-villkor kan du filtrera Microsoft Entra ID rolltilldelningar till specifika grupper och typer av anpassade resurser (CRD) – centralt, från Microsoft Entra ID, utan att skriva RBAC Role och RoleBinding manifest per kluster. Bakgrund om Azure ABAC finns i Vad är Azure rolltilldelningsvillkor?

När ABAC-villkor ska användas

Använd den här funktionen när du vill:

  • Begränsa vilka CRD-grupper eller typer som en tilldelare kan lista eller hämta.
  • Tillämpa åtkomstgränser för anpassade resurser centralt från Microsoft Entra-ID utan att hantera Kubernetes RBAC Role och RoleBinding objekt i varje kluster.
  • Skilja mellan CRD:erna som publicerats av olika operatörer (till exempel tillåt secrets-store.csi.x-k8s.io medan du blockerar security.istio.io).

Tillgängliga villkorsattribut

Följande begärandeattribut är tillgängliga när du skapar villkor för Kubernetes API i ett AKS-kluster:

Attribute Description
Microsoft.ContainerService/managedClusters/customResources:group API-gruppen för den anpassade resurs som används (till exempel secrets-store.csi.x-k8s.io).
Microsoft.ContainerService/managedClusters/customResources:kind Den typ av anpassad resurs som används (till exempel secretproviderclasses).

Lägga till ett ABAC-villkor i en rolltilldelning

I följande exempel skapas en anpassad roll för AKS CRD-läsare som ger läsbehörighet till anpassade resurser. Sedan tilldelas rollen med ett villkor som endast tillåter åtkomst till secretproviderclasses i gruppen secrets-store.csi.x-k8s.io (den CRD som används av Azure Key Vault-providern för Secrets Store CSI Driver).

  1. Spara följande rolldefinition i en fil med namnet crd-reader.jsonoch ersätt <YOUR-SUBSCRIPTION-ID> med ditt eget prenumerations-ID.

    {
        "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. Skapa rolldefinitionen az role definition create med kommandot .

    az role definition create --role-definition @crd-reader.json
    
  3. Spara följande villkor i en fil med namnet abac-condition.txt. Villkoret tillåter icke-anpassade resursläsningar att passera oförändrade och begränsar anpassade resursläsningar till en viss grupp och typ.

    (
     (
      !(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. Skapa rolltilldelningen med villkoret az role assignment create med kommandot .

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

Du kan också lägga till ett villkor via Azure-portalen. På sidan Lägg till rolltilldelning väljer du fliken Villkor , sedan Lägg till villkor och använder den visuella redigeraren för att skapa uttrycket.

Verifiera villkoret

När rolltilldelningen har spridits (upp till fem minuter) loggar du in som den tilldelade och bekräftar att de kan läsa den tillåtna CRD:n men inte andra CRD:er.

  1. Hämta autentiseringsuppgifterna för az aks get-credentials klustret med kommandot .

    # 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. Lista secretproviderclasses från gruppen secrets-store.csi.x-k8s.io , vilket villkoret tillåter. Kommandot ska lyckas och returnera antingen befintliga resurser eller en tom lista (eller ett fel som inte hittades om CRD inte är installerat i klustret).

    kubectl get secretproviderclasses.secrets-store.csi.x-k8s.io --all-namespaces
    
  3. Lista authorizationpolicies från Istio-gruppen security.istio.io, som blockeras av villkoret. Kommandot bör misslyckas med felet Forbidden från Microsoft Entra ID:s webhook för auktorisering (förutsatt att Istio CRD är installerat i klustret; annars returnerar kubectl ett fel om att resursen inte hittades innan API-servern når webhooken för auktorisering).

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

Rensa resurser

Inaktivera Microsoft Entra ID auktorisering

Ta bort Microsoft Entra ID-auktoriseringen med kommandot az aks update och flaggan --disable-azure-rbac.

# 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

Ta bort rolltilldelning

  1. Visa en lista över rolltilldelningar med kommandot 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. Ta bort rolltilldelningarna med kommandot az role assignment delete .

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

Ta bort rolldefinition

Ta bort en anpassad rolldefinition med kommandot az role definition delete .

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

Ta bort resursgrupp och AKS-kluster

Ta bort resursgruppen (och aks-klustret som den innehåller) med kommandot az group delete .

# 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

Mer information om AKS finns i följande artiklar: