Använda Azure RBAC i Azure Arc-aktiverade Kubernetes-kluster

Kubernetes ClusterRoleBinding- och RoleBinding-objekttyper hjälper till att definiera auktorisering i Kubernetes internt. Med den här funktionen kan du använda Microsoft Entra-ID och rolltilldelningar i Azure för att kontrollera auktoriseringskontroller i klustret. Med Azure-rolltilldelningar kan du detaljstyra vilka användare som kan läsa, skriva och ta bort Kubernetes-objekt som distribution, podd och tjänst.

En konceptuell översikt över den här funktionen finns i Azure RBAC på Azure Arc-aktiverade Kubernetes.

Förutsättningar

  • Installera eller uppgradera Azure CLI till den senaste versionen.

  • Installera den senaste versionen av connectedk8s Azure CLI-tillägget:

    az extension add --name connectedk8s
    

    connectedk8s Om tillägget redan är installerat kan du uppdatera det till den senaste versionen med hjälp av följande kommando:

    az extension update --name connectedk8s
    
  • Anslut ett befintligt Azure Arc-:aktiverat Kubernetes-kluster:

Kommentar

Azure RBAC är inte tillgängligt för Red Hat OpenShift eller hanterade Kubernetes-erbjudanden där användaråtkomsten till API-servern är begränsad (t.ex. Amazon Elastic Kubernetes Service (EKS), Google Kubernetes Engine (GKE)).

Azure RBAC stöder för närvarande inte Kubernetes-kluster som arbetar med ARM64-arkitektur. Använd Kubernetes RBAC för att hantera åtkomstkontroll för ARM64-baserade Kubernetes-kluster.

För AKS-kluster (Azure Kubernetes Service) är den här funktionen tillgänglig internt och kräver inte att AKS-klustret är anslutet till Azure Arc.

För Azure Kubernetes Service-kluster (AKS) som aktiveras av Azure Arc på Azure Stack HCI 23H2 stöds aktivering av Azure RBAC för närvarande endast när Kubernetes-kluster skapas. Om du vill skapa ett AKS-kluster som aktiverats av Azure Arc med Azure RBAC aktiverat följer du auktoriseringsguiden Använd Azure RBAC för Kubernetes. Observera att Azure RBAC inte stöds för Azure Stack HCI, version 22H2.

Aktivera Azure RBAC i klustret

  1. Hämta klustrets MSI-identitet genom att köra följande kommando:

    az connectedk8s show -g <resource-group> -n <connected-cluster-name>
    
  2. Hämta ID :t (identity.principalId) från utdata och kör följande kommando för att tilldela rollen Ansluten klusterhanterad identitet CheckAccess Reader till klustrets MSI:

    az role assignment create --role "Connected Cluster Managed Identity CheckAccess Reader" --assignee "<Cluster MSI ID>" --scope <cluster ARM ID>
    
  3. Aktivera rollbaserad åtkomstkontroll i Azure (RBAC) i ditt Azure Arc-aktiverade Kubernetes-kluster genom att köra följande kommando:

    az connectedk8s enable-features -n <clusterName> -g <resourceGroupName> --features azure-rbac
    

    Kommentar

    Innan du kör föregående kommando kontrollerar du att kubeconfig filen på datorn pekar på klustret där du aktiverar Azure RBAC-funktionen.

    Använd --skip-azure-rbac-list med föregående kommando för en kommaavgränsad lista över användarnamn, e-postmeddelanden och OpenID-anslutningar som genomgår auktoriseringskontroller med kubernetes native ClusterRoleBinding och RoleBinding objekt i stället för Azure RBAC.

Generiskt kluster där ingen avstämning körs på specifikationen apiserver

  1. SSH till varje huvudnod i klustret och utför följande steg:

    Om din kube-apiserver är en statisk podd:

    1. Hemligheten azure-arc-guard-manifests kube-system i namnområdet innehåller två filer: guard-authn-webhook.yaml och guard-authz-webhook.yaml. Kopiera dessa filer till /etc/guard nodens katalog.

      sudo mkdir -p /etc/guard
      kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authn-webhook.yaml"' | base64 -d > /etc/guard/guard-authn-webhook.yaml
      kubectl get secrets azure-arc-guard-manifests -n kube-system -o json | jq -r '.data."guard-authz-webhook.yaml"' | base64 -d > /etc/guard/guard-authz-webhook.yaml
      
    2. Öppna manifestet apiserver i redigeringsläge:

      sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
      
    3. Lägg till följande specifikation under volumes:

      - hostPath
          path: /etc/guard
          type: Directory
      name: azure-rbac
      
    4. Lägg till följande specifikation under volumeMounts:

      - mountPath: /etc/guard
          name: azure-rbac
          readOnly: true
      

    Om din kube-apiserver inte är en statisk podd:

    1. Öppna manifestet apiserver i redigeringsläge:

      sudo vi /etc/kubernetes/manifests/kube-apiserver.yaml
      
    2. Lägg till följande specifikation under volumes:

      - name: azure-rbac
          secret:
          secretName: azure-arc-guard-manifests
      
    3. Lägg till följande specifikation under volumeMounts:

      - mountPath: /etc/guard
          name: azure-rbac
          readOnly: true
      
  2. Lägg till följande apiserver argument:

    - --authentication-token-webhook-config-file=/etc/guard/guard-authn-webhook.yaml
    - --authentication-token-webhook-cache-ttl=5m0s
    - --authorization-webhook-cache-authorized-ttl=5m0s
    - --authorization-webhook-config-file=/etc/guard/guard-authz-webhook.yaml
    - --authorization-webhook-version=v1
    - --authorization-mode=Node,RBAC,Webhook
    

    Om Kubernetes-klustret är version 1.19.0 eller senare måste du också ange följande apiserver argument:

    - --authentication-token-webhook-version=v1
    
  3. Spara och stäng redigeraren för att uppdatera apiserver podden.

Kluster som skapats med hjälp av kluster-API

  1. Kopiera skyddshemligheten som innehåller webhookskonfigurationsfiler för autentisering och auktorisering från arbetsbelastningsklustret till datorn:

    kubectl get secret azure-arc-guard-manifests -n kube-system -o yaml > azure-arc-guard-manifests.yaml
    
  2. Ändra fältet namespace i filen azure-arc-guard-manifests.yaml till namnområdet i hanteringsklustret där du använder de anpassade resurserna för att skapa arbetsbelastningskluster.

  3. Använd det här manifestet:

    kubectl apply -f azure-arc-guard-manifests.yaml
    
  4. Redigera objektet KubeadmControlPlane genom att köra kubectl edit kcp <clustername>-control-plane:

    1. Lägg till följande kodfragment under files:

      - contentFrom:
          secret:
            key: guard-authn-webhook.yaml
            name: azure-arc-guard-manifests
        owner: root:root
        path: /etc/kubernetes/guard-authn-webhook.yaml
        permissions: "0644"
      - contentFrom:
          secret:
            key: guard-authz-webhook.yaml
            name: azure-arc-guard-manifests
        owner: root:root
        path: /etc/kubernetes/guard-authz-webhook.yaml
        permissions: "0644"
      
    2. Lägg till följande kodfragment under apiServer>extraVolumes:

      - hostPath: /etc/kubernetes/guard-authn-webhook.yaml
          mountPath: /etc/guard/guard-authn-webhook.yaml
          name: guard-authn
          readOnly: true
      - hostPath: /etc/kubernetes/guard-authz-webhook.yaml
          mountPath: /etc/guard/guard-authz-webhook.yaml
          name: guard-authz
          readOnly: true
      
    3. Lägg till följande kodfragment under apiServer>extraArgs:

      authentication-token-webhook-cache-ttl: 5m0s
      authentication-token-webhook-config-file: /etc/guard/guard-authn-webhook.yaml
      authentication-token-webhook-version: v1
      authorization-mode: Node,RBAC,Webhook
      authorization-webhook-cache-authorized-ttl: 5m0s
      authorization-webhook-config-file: /etc/guard/guard-authz-webhook.yaml
      authorization-webhook-version: v1
      
    4. Spara och stäng för att uppdatera objektet KubeadmControlPlane . Vänta tills ändringarna visas i arbetsbelastningsklustret.

Skapa rolltilldelningar för användare för åtkomst till klustret

Ägare av Den Azure Arc-aktiverade Kubernetes-resursen kan använda antingen inbyggda roller eller anpassade roller för att ge andra användare åtkomst till Kubernetes-klustret.

Inbyggda roller

Roll beskrivning
Azure Arc Kubernetes Viewer Tillåter skrivskyddad åtkomst för att se de flesta objekt i ett namnområde. Den här rollen tillåter inte visning av hemligheter eftersom read behörighet för hemligheter skulle ge åtkomst till ServiceAccount autentiseringsuppgifter i namnområdet. Dessa autentiseringsuppgifter skulle i sin tur tillåta API-åtkomst via det ServiceAccount värdet (en form av behörighetseskalering).
Azure Arc Kubernetes Writer 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 hemligheter och poddar som valfritt ServiceAccount värde i namnområdet, så den kan användas för att få API-åtkomstnivåerna för valfritt ServiceAccount värde i namnområdet.
Azure Arc Kubernetes-administratör Tillåter administratörsåtkomst. Det är avsett att beviljas inom ett namnområde via RoleBinding. Om du använder den i RoleBindingtillåter den läs-/skrivåtkomst till de flesta resurser i ett namnområde, 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.
Azure Arc Kubernetes-klusteradministratör Tillåter superanvändaråtkomst för att köra alla åtgärder på alla resurser. När du använder den i ClusterRoleBindingger den fullständig kontroll över varje resurs i klustret och i alla namnområden. När du använder den i RoleBindingger den fullständig kontroll över varje resurs i rollbindningens namnområde, inklusive själva namnområdet.

Du kan skapa rolltilldelningar som är begränsade till Det Azure Arc-aktiverade Kubernetes-klustret i fönstret Azure Portal i fönstret Åtkomstkontroll (IAM) i klusterresursen. Du kan också använda följande Azure CLI-kommandon:

az role assignment create --role "Azure Arc Kubernetes Cluster Admin" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID

I dessa kommandon kan vara ett användarnamn (till exempel testuser@mytenant.onmicrosoft.com) eller till och med värdet för appId tjänstens AZURE-AD-ENTITY-ID huvudnamn.

Här är ett annat exempel på hur du skapar en rolltilldelning som är begränsad till ett specifikt namnområde i klustret:

az role assignment create --role "Azure Arc Kubernetes Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>

Kommentar

Du kan skapa rolltilldelningar som är begränsade till klustret med hjälp av antingen Azure Portal eller Azure CLI. Endast Azure CLI kan dock användas för att skapa rolltilldelningar som är begränsade till namnområden.

Anpassade roller

Du kan välja att skapa en egen rolldefinition för användning i rolltilldelningar.

Gå igenom följande exempel på en rolldefinition som gör att en användare endast kan läsa distributioner. Mer information finns i den fullständiga listan över dataåtgärder som du kan använda för att konstruera en rolldefinition.

Kopiera följande JSON-objekt till en fil med namnet custom-role.json. <subscription-id> Ersätt platshållaren med det faktiska prenumerations-ID:t. Den anpassade rollen använder en av dataåtgärderna och låter dig visa alla distributioner i omfånget (kluster eller namnområde) där rolltilldelningen skapas.

{
    "Name": "Arc Deployment Viewer",
    "Description": "Lets you view all deployments in cluster/namespace.",
    "Actions": [],
    "NotActions": [],
    "DataActions": [
        "Microsoft.Kubernetes/connectedClusters/apps/deployments/read"
    ],
    "NotDataActions": [],
    "assignableScopes": [
        "/subscriptions/<subscription-id>"
    ]
}
  1. Skapa rolldefinitionen genom att köra följande kommando från mappen där du sparade custom-role.json:

    az role definition create --role-definition @custom-role.json
    
  2. Skapa en rolltilldelning med den här anpassade rolldefinitionen:

    az role assignment create --role "Arc Deployment Viewer" --assignee <AZURE-AD-ENTITY-ID> --scope $ARM_ID/namespaces/<namespace-name>
    

Konfigurera kubectl med användarautentiseringsuppgifter

Det finns två sätt att hämta kubeconfig-filen som du behöver för att komma åt klustret:

  • Du använder funktionen cluster Connect (az connectedk8s proxy) i Det Azure Arc-aktiverade Kubernetes-klustret.
  • Klusteradministratören delar kubeconfig-filen med alla andra användare.

Använda klusteranslutning

Kör följande kommando för att starta proxyprocessen:

az connectedk8s proxy -n <clusterName> -g <resourceGroupName>

När proxyprocessen har körts kan du öppna en annan flik i konsolen för att börja skicka dina begäranden till klustret.

Använda en delad kubeconfig-fil

Att använda en delad kubeconfig kräver lite olika steg beroende på din Kubernetes-version.

  1. Kör följande kommando för att ange användarens autentiseringsuppgifter. Ange serverApplicationId som 6256c85f-0aad-4d50-b960-e6e9b21efe35 och clientApplicationId som 3f4439ff-e698-4d6d-84fe-09c9d574f06b:

    kubectl config set-credentials <testuser>@<mytenant.onmicrosoft.com> \
    --auth-provider=azure \
    --auth-provider-arg=environment=AzurePublicCloud \
    --auth-provider-arg=client-id=<clientApplicationId> \
    --auth-provider-arg=tenant-id=<tenantId> \
    --auth-provider-arg=apiserver-id=<serverApplicationId>
    
  2. Öppna kubeconfig-filen som du skapade tidigare. Under contextskontrollerar du att kontexten som är associerad med klustret pekar på de användarautentiseringsuppgifter som du skapade i föregående steg. Om du vill ange den aktuella kontexten till dessa användarautentiseringsuppgifter kör du följande kommando:

    kubectl config set-context --current=true --user=<testuser>@<mytenant.onmicrosoft.com>
    
  3. Lägg till konfigurationslägesinställningen under user>config:

    name: testuser@mytenant.onmicrosoft.com
    user:
        auth-provider:
        config:
            apiserver-id: $SERVER_APP_ID
            client-id: $CLIENT_APP_ID
            environment: AzurePublicCloud
            tenant-id: $TENANT_ID
            config-mode: "1"
        name: azure
    

    Kommentar

    Exec-plugin-programmet är en Kubernetes-autentiseringsstrategi som gör det möjligt kubectl att köra ett externt kommando för att ta emot användarautentiseringsuppgifter som ska skickas till apiserver. Från och med Kubernetes version 1.26 ingår inte längre standardprogrammet för Azure-auktorisering i client-go och kubectl. För att kunna använda exec-plugin-programmet för att ta emot autentiseringsuppgifter för användare måste du använda Azure Kubelogin, ett client-go plugin-program för autentiseringsuppgifter (exec) som implementerar Azure-autentisering.

  4. Installera Azure Kubelogin:

    • För Windows eller Mac följer du installationsanvisningarna för Azure Kubelogin.

    • För Linux eller Ubuntu laddar du ned den senaste versionen av kubelogin och kör sedan följande kommandon:

      curl -LO https://github.com/Azure/kubelogin/releases/download/"$KUBELOGIN_VERSION"/kubelogin-linux-amd64.zip 
      
      unzip kubelogin-linux-amd64.zip 
      
      sudo mv bin/linux_amd64/kubelogin /usr/local/bin/ 
      
      sudo chmod +x /usr/local/bin/kubelogin 
      
  5. Kubelogin kan användas för att autentisera med Azure Arc-aktiverade kluster genom att begära en poP-token (proof-of-possession). Konvertera kubeconfig med kubelogin för att använda lämpligt inloggningsläge. För inloggning med enhetskod med en Microsoft Entra-användare skulle kommandona till exempel vara följande:

    export KUBECONFIG=/path/to/kubeconfig
    
    kubelogin convert-kubeconfig --pop-enabled --pop-claims 'u=<ARM ID of cluster>"
    

Skicka begäranden till klustret

  1. Kör valfritt kubectl kommando. Till exempel:

    • kubectl get nodes
    • kubectl get pods
  2. När du har tillfrågats om webbläsarbaserad autentisering kopierar du url:en för enhetsinloggning (https://microsoft.com/devicelogin) och öppnar den i webbläsaren.

  3. Ange koden som skrivs ut på konsolen. Kopiera och klistra in koden i terminalen i kommandotolken för indata för enhetsautentisering.

  4. Ange användarnamnet (testuser@mytenant.onmicrosoft.com) och det associerade lösenordet.

  5. Om du ser ett felmeddelande som det här innebär det att du inte har åtkomst till den begärda resursen:

    Error from server (Forbidden): nodes is forbidden: User "testuser@mytenant.onmicrosoft.com" cannot list resource "nodes" in API group "" at the cluster scope: User doesn't have access to the resource in Azure. Update role assignment to allow access.
    

    En administratör måste skapa en ny rolltilldelning som ger användaren åtkomst till resursen.

Använda villkorlig åtkomst med Microsoft Entra-ID

När du integrerar Microsoft Entra-ID med ditt Azure Arc-aktiverade Kubernetes-kluster kan du också använda villkorsstyrd åtkomst för att styra åtkomsten till klustret.

Kommentar

Villkorsstyrd åtkomst för Microsoft Entra är en Microsoft Entra ID P2-funktion.

Så här skapar du ett exempel på en princip för villkorsstyrd åtkomst som ska användas med klustret:

  1. Överst i Azure Portal söker du efter och väljer Microsoft Entra-ID.

  2. På menyn för Microsoft Entra-ID till vänster väljer du Företagsprogram.

  3. På menyn för företagsprogram till vänster väljer du Villkorlig åtkomst.

  4. På menyn för Villkorlig åtkomst till vänster väljer du Principer>Ny princip.

    Skärmbild som visar hur du lägger till en princip för villkorlig åtkomst i Azure Portal.

  5. Ange ett namn för principen, till exempel arc-k8s-policy.

  6. Välj Användare och grupper. Under Inkludera väljer du Välj användare och grupper. Välj sedan de användare och grupper där du vill tillämpa principen. I det här exemplet väljer du samma Microsoft Entra-grupp som har administrativ åtkomst till klustret.

    Skärmbild som visar hur du väljer användare eller grupper för att tillämpa principen för villkorsstyrd åtkomst.

  7. Välj Molnappar eller åtgärder. Under Inkludera väljer du Välj appar. Sök sedan efter och välj det serverprogram som du skapade tidigare.

    Skärmbild som visar hur du väljer ett serverprogram i Azure Portal.

  8. Under Åtkomstkontroller väljer du Bevilja. Välj Bevilja åtkomst>Kräv att enheten markeras som kompatibel.

    Skärmbild som visar hur du endast tillåter kompatibla enheter i Azure Portal.

  9. Under Aktivera princip väljer du >Skapa.

    Skärmbild som visar hur du aktiverar en princip för villkorlig åtkomst i Azure Portal.

Få åtkomst till klustret igen. Kör till exempel kubectl get nodes kommandot för att visa noder i klustret:

kubectl get nodes

Följ anvisningarna för att logga in igen. Ett felmeddelande anger att du har loggat in, men administratören kräver att enheten som begär åtkomst hanteras av Microsoft Entra-ID för att få åtkomst till resursen. Följ de här stegen:

  1. I Azure Portal går du till Microsoft Entra-ID.

  2. Välj Företagsprogram. Under Aktivitet väljer du Inloggningar.

  3. En post högst upp visar Misslyckades för Status och Lyckades för villkorsstyrd åtkomst. Välj posten och välj sedan Villkorsstyrd åtkomst i Information. Observera att principen för villkorsstyrd åtkomst visas.

    Skärmbild som visar en misslyckad inloggningspost i Azure Portal.

Konfigurera just-in-time-klusteråtkomst med Microsoft Entra-ID

Ett annat alternativ för klusteråtkomstkontroll är att använda Privileged Identity Management (PIM) för just-in-time-begäranden.

Kommentar

Microsoft Entra PIM är en Microsoft Entra ID P2-funktion. Mer information om SKU:er för Microsoft Entra-ID finns i prisguiden.

Utför följande steg för att konfigurera just-in-time-åtkomstbegäranden för klustret:

  1. Överst i Azure Portal söker du efter och väljer Microsoft Entra-ID.

  2. Anteckna klientorganisations-ID:t. För resten av dessa instruktioner refererar vi till det ID:t som <tenant-id>.

    Skärmbild som visar Information om Microsoft Entra-ID i Azure Portal.

  3. På menyn för Microsoft Entra-ID till vänster går du till Hantera och väljer Grupper>Ny grupp.

  4. Kontrollera att Säkerhet har valts för Grupptyp. Ange ett gruppnamn, till exempel myJITGroup. Under Microsoft Entra-roller kan tilldelas till den här gruppen (förhandsversion) väljer du Ja. Välj slutligen Skapa.

    Skärmbild som visar information om den nya gruppen i Azure Portal.

  5. Du kommer tillbaka till sidan Grupper . Välj den nyligen skapade gruppen och anteckna objekt-ID:t. För resten av dessa instruktioner refererar vi till det här ID:t som <object-id>.

    Skärmbild som visar objekt-ID för den nya gruppen i Azure Portal.

  6. I Azure Portal går du till menyn för Aktivitet till vänster och väljer Privilegierad åtkomst (förhandsversion). Välj sedan Aktivera privilegierad åtkomst.

    Skärmbild som visar val för att aktivera privilegierad åtkomst i Azure Portal.

  7. Välj Lägg till tilldelningar för att börja bevilja åtkomst.

    Skärmbild som visar hur du lägger till aktiva tilldelningar i Azure Portal.

  8. Välj rollen Medlem och välj de användare och grupper som du vill bevilja klusteråtkomst till. En gruppadministratör kan när som helst ändra dessa tilldelningar. När du är redo att gå vidare väljer du Nästa.

    Skärmbild som visar hur du lägger till tilldelningar i Azure Portal.

  9. Välj en tilldelningstyp av Aktiv, välj önskad varaktighet och ange en motivering. När du är redo att fortsätta väljer du Tilldela. Mer information om tilldelningstyper finns i Tilldela berättigande för en privilegierad åtkomstgrupp (förhandsversion) i Privileged Identity Management.

    Skärmbild som visar tilldelningsegenskaper i Azure Portal.

När du har gjort tilldelningarna kontrollerar du att just-in-time-åtkomst fungerar genom att komma åt klustret. Använd kubectl get nodes till exempel kommandot för att visa noder i klustret:

kubectl get nodes

Observera autentiseringskravet och följ stegen för att autentisera. Om autentiseringen lyckas bör du se utdata som liknar följande:

To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AAAAAAAAA to authenticate.

NAME      STATUS   ROLES    AGE      VERSION
node-1    Ready    agent    6m36s    v1.18.14
node-2    Ready    agent    6m42s    v1.18.14
node-3    Ready    agent    6m33s    v1.18.14

Nästa steg