Dela via


Distribuera och konfigurera arbetsbelastningsidentitet på en AKS som aktiveras av Azure Arc-kluster (förhandsversion)

Gäller för: Azure Local, version 23H2

Med arbetsbelastningsidentitetsfederation kan du konfigurera en användartilldelad hanterad identitet eller appregistrering i Microsoft Entra-ID för att lita på token från en extern identitetsprovider (IdP), till exempel Kubernetes, vilket ger åtkomst till resurser som skyddas av Microsoft Entra, till exempel Azure Key Vault eller Azure Blob Storage.

Azure Kubernetes Service (AKS) som aktiveras av Azure Arc är en hanterad Kubernetes-tjänst som gör att du enkelt kan distribuera arbetsbelastningsidentitetsaktiverade Kubernetes-kluster. I den här artikeln beskrivs hur du utför följande uppgifter:

  • Skapa ett AKS Arc-kluster med arbetsbelastningsidentitet aktiverat (förhandsversion).
  • Skapa ett Kubernetes-tjänstkonto och binda det till den hanterade Azure-identiteten.
  • Skapa en federerad autentiseringsuppgift för den hanterade identiteten för att lita på OIDC-utfärdaren.
  • Distribuera ditt program.
  • Exempel: Bevilja en podd i klustret åtkomst till hemligheter i ett Azure-nyckelvalv.

Viktigt!

De här förhandsversionsfunktionerna är tillgängliga via självbetjäning och opt-in. Förhandsversioner tillhandahålls "som är" och "som tillgängliga", och de undantas från serviceavtalen och den begränsade garantin. Azure Kubernetes Service, som aktiveras av Förhandsversioner av Azure Arc, omfattas delvis av kundsupport på bästa sätt.

Kommentar

I offentlig förhandsversion stöder AKS på Azure Stack HCI aktivering av arbetsbelastningsidentitet när AKS-kluster skapas. Det går dock inte att aktivera arbetsbelastningsidentiteten när klustret har skapats eller inaktiverats efteråt.

Förutsättningar

Innan du distribuerar ett Kubernetes-kluster med Azure Arc aktiverat måste du ha följande förutsättningar:

  • Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.
  • Den här artikeln kräver version 1.4.23 eller senare av Azure CLI. Om du använder Azure Cloud Shell är den senaste versionen redan installerad.

Exportera miljövariabler

För att förenkla stegen för att konfigurera de identiteter som krävs definierar följande kommandon miljövariabler som refereras i exemplen i den här artikeln. Ersätt följande värden med dina egna:

$AZSubscriptionID = "00000000-0000-0000-0000-000000000000" 
$Location = "westeurope" 
$resource_group_name = "myResourceGroup" 

$aks_cluster_name = "myAKSCluster" 

$SERVICE_ACCOUNT_NAMESPACE = "default" 
$SERVICE_ACCOUNT_NAME = "workload-identity-sa" 

$FedIdCredentialName = "myFedIdentity" 
$MSIName = "myIdentity" 

# To access key vault secrets from a pod in the cluster, include these variables:
$KVName = "KV-workload-id" 
$KVSecretName= "KV-secret"

Ange den aktiva prenumerationen

Börja med att ange din prenumeration som den aktuella aktiva prenumerationen. Kör kommandot az account set med ditt prenumerations-ID:

az login  
az account set -s $AZSubscriptionID

Skapa en resursgrupp

En Azure-resursgrupp är en logisk grupp där Azure-resurser distribueras och hanteras. När du skapar en resursgrupp uppmanas du att ange en plats. Den här platsen är lagringsplatsen för dina resursgruppsmetadata och där dina resurser körs i Azure om du inte anger en annan region när du skapar resurser.

Du kan skapa en resursgrupp med hjälp av kommandot az group create:

az group create --name $resource_group_name --location $Location

Följande exempelutdata visar hur en resursgrupp har skapats:

{ 
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup", 
  "location": "westeurope", 
  "managedBy": null, 
  "name": "$resource_group_name", 
  "properties": { 
    "provisioningState": "Succeeded" 
  }, 
  "tags": null 
}

Steg 1: Skapa ett AKS Arc-kluster med arbetsbelastningsidentitet aktiverad

För att skapa ett AKS Arc-kluster behöver du både $customlocation_ID värdena och $logicnet_Id .

  • $customlocation_ID: Azure Resource Manager-ID för den anpassade platsen. Den anpassade platsen konfigureras under distributionen av Azure Stack HCI-kluster. Infrastrukturadministratören bör ge dig Resource Manager-ID:t för den anpassade platsen. Du kan också hämta Resource Manager-ID:t med , $customlocation_ID = $(az customlocation show --name "<your-custom-location-name>" --resource-group $resource_group_name --query "id" -o tsv)om infrastrukturadministratören tillhandahåller ett anpassat platsnamn och resursgruppsnamn.
  • $logicnet_Id: Azure Resource Manager-ID:t för det lokala logiska Azure-nätverket som skapats enligt dessa steg. Infrastrukturadministratören bör ge dig Resource Manager-ID:t för det logiska nätverket. Du kan också hämta Resource Manager-ID:t med , $logicnet_Id = $(az stack-hci-vm network lnet show --name "<your-lnet-name>" --resource-group $resource_group_name --query "id" -o tsv)om infrastrukturadministratören tillhandahåller ett logiskt nätverksnamn och resursgruppsnamn.

Kör kommandot az aksarc create med parametern --enable-oidc-issuer --enable-workload-identity . Ange dina entra-admin-group-object-ids och se till att du är medlem i administratörsgruppen för Microsoft Entra-ID för åtkomst till proxyläge:

az aksarc create  
-n $aks_cluster_name -g $resource_group_name  
--custom-location $customlocation_ID --vnet-ids $logicnet_Id  
--aad-admin-group-object-ids <entra-admin-group-object-ids> 
--generate-ssh-keys  
--enable-oidc-issuer --enable-workload-identity

Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret.

Det kan ta lite tid innan arbetsbelastningsidentitetstillägget distribueras när ett etablerat kluster har skapats. Använd följande kommando för att kontrollera status för arbetsbelastningsidentitetstillägget:

az connectedk8s show -n $aks_cluster_name -g $resource_group_name
# agentState = "Succeeded" 
"agentPublicKeyCertificate": "", 
  "agentVersion": "1.21.10", 
  "arcAgentProfile": { 
    "agentAutoUpgrade": "Enabled", 
    "agentErrors": [], 
    "agentState": "Succeeded", 
    "desiredAgentVersion": "", 
    "systemComponents": null 

# oidcIssuerProfile "enabled": true and "issuerUrl" present 

"oidcIssuerProfile": { 
    "enabled": true, 
    "issuerUrl": "https://oidcdiscovery-{location}-endpoint-1111111111111111.000.azurefd.net/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/"}

I Azure Portal kan du visa wiextension-tillägget under avsnittet Egenskaper i kubernetes-klustret.

Viktigt!

Som en del av säkerhetsförbättringen för AKS Arc-kluster utlöser arbetsbelastningsidentitetsaktivering två ändringar. För det första roteras signeringsnyckeln för Kubernetes-tjänstkontot automatiskt var 45:e dag och förblir giltig i 90 dagar. --service-account-extend-token-expiration För det andra är flaggan inaktiverad, vilket minskar tokens giltighet från ett år till högst 24 timmar.

Spara OIDC-utfärdarens URL till en miljövariabel

När AKS-klustret har skapats kan du hämta URL:en för OIDC-utfärdaren och spara den i en miljövariabel. Kör följande kommando:

$SERVICE_ACCOUNT_ISSUER =$(az connectedk8s show --n $aks_cluster_name --resource-group $resource_group_name --query "oidcIssuerProfile.issuerUrl" --output tsv)

Steg 2: Skapa ett Kubernetes-tjänstkonto och binda det till den hanterade Azure-identiteten

Skapa först en hanterad identitet. Kör kommandot az identity create:

az identity create --name $MSIName --resource-group $resource_group_name --location $Location --subscription $AZSubscriptionID

Skapa sedan variabler för den hanterade identitetens klient-ID:

$MSIId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'clientId' --output tsv)
$MSIPrincipalId=$(az identity show --resource-group $resource_group_name --name $MSIName --query 'principalId' --output tsv)

Skapa ett Kubernetes-tjänstkonto

Skapa ett Kubernetes-tjänstkonto och kommentera det med klient-ID:t för den hanterade identiteten som skapades i föregående steg:

az connectedk8s proxy -n $aks_cluster_name -g $resource_group_name

Öppna ett nytt fönster. Kopiera och klistra in följande CLI-kommandon:

$yaml = @" apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: $MSIId name: $SERVICE_ACCOUNT_NAME namespace: $SERVICE_ACCOUNT_NAMESPACE "@ $yaml = $yaml -replace '\$MSIId', $MSIId ` -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE $yaml | kubectl apply -f -

Följande utdata visar hur tjänstkontot har skapats:

serviceaccount/workload-identity-sa created

Steg 3: Skapa en federerad autentiseringsuppgift för den hanterade identiteten för att lita på OIDC-utfärdaren

Skapa först en federerad identitetsautentiseringsuppgift. Anropa kommandot az identity federated-credential create för att skapa den federerade identitetsautentiseringsuppgiften mellan den hanterade identiteten, utfärdaren av tjänstkontot och ämnet. Mer information om federerade identitetsuppgifter i Microsoft Entra finns i Översikt över federerade identitetsautentiseringsuppgifter i Microsoft Entra-ID.

# Create a federated credential 

az identity federated-credential create --name $FedIdCredentialName --identity-name $MSIName --resource-group $resource_group_name --issuer $SERVICE_ACCOUNT_ISSUER --subject "system:serviceaccount:${SERVICE_ACCOUNT_NAMESPACE}:${SERVICE_ACCOUNT_NAME}" 

# Show the federated credential 

az identity federated-credential show --name $FedIdCredentialName --resource-group $resource_group_name --identity-name $MSIName

Kommentar

När du har lagt till en federerad identitetsautentiseringsuppgift tar det några sekunder att sprida. Tokenbegäranden som görs omedelbart efteråt kan misslyckas tills cachen uppdateras. Du kan förhindra det här problemet genom att lägga till en kort fördröjning när du har skapat den federerade identitetsautentiseringsuppgiften.

Steg 4: Distribuera ditt program

När du distribuerar programpoddar bör manifestet referera till tjänstkontot som skapades i steget Skapa Kubernetes-tjänstkonto . Följande manifest visar hur du refererar till kontot, särskilt metadata\namespace egenskaperna och spec\serviceAccountName . Se till att ange en avbildning för image och ett containernamn för containerName:

$image = "<image>"  # Replace <image> with the actual image name 
$containerName = "<containerName>"  # Replace <containerName> with the actual container name 

$yaml = @" 
apiVersion: v1 
kind: Pod 
metadata: 
  name: sample-quick-start 
  namespace: $SERVICE_ACCOUNT_NAMESPACE 
  labels: 
    azure.workload.identity/use: "true" # Required. Only pods with this label can use workload identity. 
spec: 
  serviceAccountName: $SERVICE_ACCOUNT_NAME 
  containers: 
    - image: $image 
      name: $containerName 
"@ 

# Replace variables within the YAML content 
$yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME 

# Apply the YAML configuration 
$yaml | kubectl apply -f - 

Viktigt!

Kontrollera att programpoddarna som använder arbetsbelastningsidentiteten innehåller etiketten azure.workload.identity/use: "true" i poddspecifikationen. Annars misslyckas poddarna när de startas om.

Exempel: Bevilja behörigheter för åtkomst till Azure Key Vault

Anvisningarna i det här steget beskriver hur du kommer åt hemligheter, nycklar eller certifikat i ett Azure-nyckelvalv från podden. Exemplen i det här avsnittet konfigurerar åtkomst till hemligheter i nyckelvalvet för arbetsbelastningsidentiteten, men du kan utföra liknande steg för att konfigurera åtkomst till nycklar eller certifikat.

I följande exempel visas hur du använder azure-behörighetsmodellen för rollbaserad åtkomstkontroll (Azure RBAC) för att ge podden åtkomst till nyckelvalvet. Mer information om Azure RBAC-behörighetsmodellen för Azure Key Vault finns i Bevilja behörighet till program för åtkomst till ett Azure-nyckelvalv med Hjälp av Azure RBAC.

  1. Skapa ett nyckelvalv med rensningsskydd och RBAC-auktorisering aktiverat. Du kan också använda ett befintligt nyckelvalv om det är konfigurerat för både rensningsskydd och RBAC-auktorisering:

    az keyvault create --name $KVName --resource-group $resource_group_name --location $Location --enable-purge-protection --enable-rbac-authorization
    
    # retrieve the key vault ID for role assignment
    $KVId=$(az keyvault show --resource-group $resource_group_name --name $KVName --query id --output tsv)
    
  2. Tilldela rollen RBAC Key Vault Secrets Officer till dig själv så att du kan skapa en hemlighet i det nya nyckelvalvet. Nya rolltilldelningar kan ta upp till fem minuter att sprida och uppdateras av auktoriseringsservern.

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets Officer" --scope $KVId --assignee-principal-type ServicePrincipal
    
  3. Skapa en hemlighet i nyckelvalvet:

    az keyvault secret set --vault-name $KVName --name $KVSecretName --value "Hello!"
    
  4. Tilldela rollen Key Vault Secrets User till den användartilldelade hanterade identiteten som du skapade tidigare. Det här steget ger den hanterade identiteten behörighet att läsa hemligheter från nyckelvalvet:

    az role assignment create --assignee-object-id $MSIPrincipalId --role "Key Vault Secrets User" --scope $KVId --assignee-principal-type ServicePrincipal
    
  5. Skapa en miljövariabel för nyckelvalvs-URL:en:

    $KVUrl=$(az keyvault show --resource-group $resource_group_name --name $KVName --query properties.vaultUri --output tsv)
    
  6. Distribuera en podd som refererar till tjänstkontot och key vault-URL:en:

    $yaml = @" 
    apiVersion: v1 
    kind: Pod 
    metadata: 
      name: sample-quick-start 
      namespace: $SERVICE_ACCOUNT_NAMESPACE 
      labels: 
        azure.workload.identity/use: "true" 
    spec: 
      serviceAccountName: $SERVICE_ACCOUNT_NAME 
      containers: 
        - image: ghcr.io/azure/azure-workload-identity/msal-go 
          name: oidc 
          env: 
          - name: KEYVAULT_URL 
            value: $KVUrl 
          - name: SECRET_NAME 
            value: $KVSecretName 
      nodeSelector: 
        kubernetes.io/os: linux 
    "@ 
    
    # Replace variables within the YAML content 
    $yaml = $yaml -replace '\$SERVICE_ACCOUNT_NAMESPACE', $SERVICE_ACCOUNT_NAMESPACE ` 
                    -replace '\$SERVICE_ACCOUNT_NAME', $SERVICE_ACCOUNT_NAME ` 
                    -replace '\$KVUrl', $KVUrl ` 
                    -replace '\$KVSecretName', $KVSecretName 
    
    # Apply the YAML configuration 
    $yaml | kubectl --kubeconfig $aks_cluster_name apply -f -
    

Nästa steg

I den här artikeln distribuerade du ett Kubernetes-kluster och konfigurerade det att använda en arbetsbelastningsidentitet inför programarbetsbelastningar för att autentisera med den autentiseringsuppgiften. Nu är du redo att distribuera ditt program och konfigurera det så att det använder arbetsbelastningsidentiteten med den senaste versionen av Azure Identity-klientbiblioteket.