Použití aplikačního objektu se službou Azure Kubernetes Service (AKS)

Clustery Azure Kubernetes Service (AKS) vyžadují buď služební objekt Microsoft Entra; nebo spravovanou identitu k dynamickému vytváření a správě dalších prostředků Azure. Tento článek popisuje, jak vytvořit instanční objekt Microsoft Entra a použít ho s clusterem AKS.

Poznámka:

Pro zajištění optimálního zabezpečení a snadného použití doporučujeme používat spravované identity místo instančních objektů k autorizaci přístupu z clusteru AKS k jiným prostředkům v Azure. Spravovaná identita je speciální typ služebního hlavního objektu, který můžete použít k získání přihlašovacích údajů pro Microsoft Entra bez nutnosti spravovat a zabezpečit tyto údaje. Další informace najdete v tématu Použití spravované identity v AKS.

Požadavky

  • Potřebujete Azure CLI verze 2.0.59 nebo vyšší. Pomocí příkazu najděte svoji verzi az --version . Pokud potřebujete instalovat nebo upgradovat, podívejte se na Install Azure CLI.
  • Pokud používáte Azure PowerShell, potřebujete Azure PowerShell verze 5.0.0 nebo vyšší. Najděte svou verzi pomocí rutiny Get-InstalledModule -Name Az (cmdlet). Pokud potřebujete nainstalovat nebo upgradovat, přečtěte si téma Instalace modulu Azure Az PowerShell.
  • Potřebujete oprávnění k registraci aplikace u tenanta Microsoft Entra a k přiřazení aplikace k roli ve vašem předplatném. Pokud nemáte potřebná oprávnění, musíte požádat správce Microsoft Entra ID nebo správce předplatného, aby přiřadil potřebná oprávnění nebo vytvořil služební principál pro vás.

Úvahy o používání služebního účtu

Při používání služebního principálu Microsoft Entra s AKS mějte na paměti následující skutečnosti:

  • Službový principál pro Kubernetes je součástí konfigurace clusteru, ale tuto identitu nepoužívejte k nasazení clusteru. Místo toho nejprve vytvořte instanční objekt a pak tento instanční objekt použijte k vytvoření clusteru AKS.
  • Každý principál služby je přidružený k aplikaci Microsoft Entra. Instanční objekt pro cluster Kubernetes můžete přidružit k libovolnému platnému názvu aplikace Microsoft Entra (například: https://www.contoso.org/example). Adresa URL aplikace nemusí být skutečným koncovým bodem.
  • Když zadáte ID klienta služebního principálu, použijte hodnotu ID aplikace (appId pro Azure CLI nebo ApplicationId pro Azure PowerShell).
  • Na virtuálních počítačích v uzlech agenta v clusteru AKS jsou přihlašovací údaje zástupce služby uloženy v souboru /etc/kubernetes/azure.json.
  • Při odstranění clusteru AKS, který jste vytvořili pomocí příkazu az aks create nebo rutiny New-AzAksCluster, se služební hlavní objekt vytvořený během procesu automaticky neodstraní. Podívejte se na kroky k odstranění entity zabezpečení.
  • Pokud používáte službu principal z jiného tenanta Microsoft Entra, je třeba zvážit jiné aspekty oprávnění dostupné při nasazování clusteru. Možná nemáte příslušná oprávnění ke čtení a zápisu informací o adresáři. Další informace naleznete v tématu Jaké jsou výchozí uživatelská oprávnění v Microsoft Entra ID?

Vytvořte služebního principála

  1. Vytvořte objekt služby pomocí příkazu az ad sp create-for-rbac.

    # Set environment variable
    SERVICE_PRINCIPAL_NAME=<your-service-principal-name>
    
    # Create the service principal
    az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME
    

    Výstup by se měl podobat následujícímu příkladu výstupu:

    {
      "appId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "displayName": "myAKSClusterServicePrincipal",
      "name": "http://myAKSClusterServicePrincipal",
      "password": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "tenant": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    }
    
  2. Zkopírujte hodnoty pro appId a password z výstupu, které se mají použít při vytváření clusteru AKS.

  1. Vytvořte objekt služby pomocí příkazu New-AzADServicePrincipal.

    # Set environment variable
    $SpName = <your-service-principal-name>
    
    # Create the service principal
    New-AzADServicePrincipal -DisplayName $SpName -OutVariable sp
    

    Výstup by se měl podobat následujícímu příkladu výstupu:

    Secret                : System.Security.SecureString
    ServicePrincipalNames : {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, http://myAKSClusterServicePrincipal}
    ApplicationId         : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    ObjectType            : ServicePrincipal
    DisplayName           : myAKSClusterServicePrincipal
    Id                    : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    Type                  :
    

    Hodnoty se ukládají do proměnné, kterou použijete při vytváření clusteru AKS.

  2. Dešifrujte hodnotu uloženou v zabezpečeném řetězci tajného klíče pomocí následujícího příkazu.

    $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
    [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
    

Vytvoření clusteru AKS s existujícím instančním objektem

  • Vytvořte cluster AKS s existující služební identitou pomocí příkazu az aks create s parametry --service-principal a --client-secret nastavenými na určení hodnot appId a password.

    # Set environment variables
    RESOURCE_GROUP=<your-resource-group-name>
    CLUSTER_NAME=<your-aks-cluster-name>
    APP_ID=<app-id>
    CLIENT_SECRET=<password-value>
    
    # Create the AKS cluster
    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --service-principal $APP_ID \
        --client-secret $CLIENT_SECRET \
        --generate-ssh-keys
    
  1. Pomocí následujícího příkazu převeďte instanční objekt ApplicationId a Secret na objekt PSCredential .

    $Cred = New-Object -TypeName System.Management.Automation.PSCredential ($sp.ApplicationId, $sp.Secret)
    
  2. Vytvořte cluster AKS s existujícím instančním objektem pomocí New-AzAksCluster rutiny a jako jeho hodnotu zadejte ServicePrincipalIdAndSecret parametr s objektem PSCredential .

    # Set environment variables
    $ResourceGroupName = <your-resource-group-name>
    $ClusterName = <your-aks-cluster-name>
    
    # Create the AKS cluster
    New-AzAksCluster -ResourceGroupName $ResourceGroupName -Name $ClusterName -ServicePrincipalIdAndSecret $Cred
    

Poznámka:

Pokud používáte existující service principal s přizpůsobeným heslem, ujistěte se, že heslo není delší než 190 bajtů.

Delegování přístupu k jiným prostředkům Azure

Aplikační identitu AKS clusteru můžete použít pro přístup k dalším prostředkům. Pokud například chcete cluster AKS nasadit do existující podsítě virtuální sítě Azure, připojit se k ACR nebo přistupovat k klíčům nebo tajným klíčům v trezoru klíčů z vašeho clusteru, musíte přístup k těmto prostředkům delegovat na instanční objekt. Pokud chcete delegovat přístup, přiřaďte k instančnímu objektu roli řízení přístupu na základě role (Azure RBAC).

Při přiřazování rolí určíte obor pro přiřazení role, například skupina prostředků nebo prostředek virtuální sítě. Přiřazení role určuje, jaká oprávnění má služební principal pro prostředek a v jakém rozsahu.

Důležité

Oprávnění udělená služebnímu principalu přidruženému ke clusteru může trvat až 60 minut, než se rozmnoží.

Vytvořte přiřazení role

Poznámka:

Rozsah prostředku musí být úplné ID prostředku, například /subscriptions/\<guid\>/resourceGroups/myResourceGroup nebo /subscriptions/\<guid\>/resourceGroups/myResourceGroupVnet/providers/Microsoft.Network/virtualNetworks/myVnet.

  • Vytvořte přiřazení role pomocí příkazu az role assignment create. Zadejte hodnotu ID aplikace pro parametr --assignee a rozsah přiřazení role pro parametr --scope. Následující příklad přiřadí služby aplikačního objektu oprávnění pro přístup k tajemstvím v Klíčovém trezoru:

    az role assignment create \
        --assignee <app-id> \
        --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" \
        --role "Key Vault Secrets User"
    
  • Vytvořte přiřazení role pomocí cmdletu New-AzRoleAssignment. Zadejte hodnotu ID aplikace instančního objektu pro parametr -ApplicationId a určete rozsah přiřazení role pro parametr -Scope. Následující příklad přiřadí aplikační identitě oprávnění pro přístup k tajemstvím v úložišti klíčů.

    New-AzRoleAssignment -ApplicationId <app-id> `
        -Scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.KeyVault/vaults/<vault-name>" `
        -RoleDefinitionName "Key Vault Secrets User"
    

Udělení přístupu ke službě Azure Container Registry

Pokud jako úložiště imagí kontejneru používáte Službu Azure Container Registry (ACR), musíte instančnímu objektu pro cluster AKS udělit oprávnění ke čtení a načítání imagí. Doporučujeme postupovat podle kroků v části Ověřování pomocí služby Azure Container Registry ze služby Azure Kubernetes Service k integraci s registrem a přiřazení odpovídající role pro služební objekt.

Udělení přístupu k síťovým prostředkům

Pokud používáte pokročilé sítě s virtuální sítí a podsítí nebo s veřejnými IP adresami umístěnými v jiné skupině prostředků, můžete přiřadit vestavěnou roli Přispěvatel sítě v podsíti v rámci virtuální sítě. Případně můžete vytvořit vlastní roli s oprávněními pro přístup k síťovým prostředkům v této skupině prostředků. Další informace najdete v tématu Oprávnění služby AKS.

Udělení přístupu k diskům úložiště

Pokud potřebujete získat přístup k existujícím prostředkům disku v jiné skupině prostředků, přiřaďte jednu z následujících sad oprávnění role:

Udělení přístupu ke službě Azure Container Instances

Pokud použijete virtuální kubelet k integraci s AKS a spuštění služby Azure Container Instances (ACI) ve skupině prostředků odděleně od clusteru AKS, musíte přiřadit oprávnění přispěvatele instančnímu objektu clusteru AKS pro skupinu prostředků ACI.

Odstranit objekt služby

  • Získejte ID klienta služebního principálu (servicePrincipalProfile.clientId) a odstraňte služebního principála pomocí příkazu az ad sp delete s parametrem --id. Příkaz [az aks show][az-aks-show] načte ID klienta pro zadaný cluster AKS.

    # Set environment variables
    RESOURCE_GROUP=<your-resource-group-name>
    CLUSTER_NAME=<your-aks-cluster-name>
    
    # Delete the service principal
    az ad sp delete --id $(az aks show \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --query servicePrincipalProfile.clientId \
        --output tsv)
    
  • Zadejte dotaz na ID klienta služebního hlavního objektu (ServicePrincipalProfile.ClientId) a odstraňte služební hlavní objekt pomocí rutiny Remove-AzADServicePrincipal s parametrem -ApplicationId. Příkaz cmdlet [Get-AzAksCluster][get-azakscluster] načte ID klienta pro zadaný cluster AKS.

    # Set environment variables
    $ResourceGroupName = <your-resource-group-name>
    $ClusterName = <your-aks-cluster-name>
    $ClientId = (Get-AzAksCluster -ResourceGroupName myResourceGroup -Name myAKSCluster ).ServicePrincipalProfile.ClientId
    
    # Delete the service principal
    Remove-AzADServicePrincipal -ApplicationId $ClientId
    

Řešení problémů s přihlašovacími údaji aplikačního objektu

Azure CLI ukládá přihlašovací údaje service principal do mezipaměti pro clustery AKS.

Azure PowerShell ukládá do mezipaměti přihlašovací údaje služebního principu pro clustery AKS.

Pokud platnost těchto přihlašovacích údajů vyprší, může dojít k chybám při nasazování clusteru AKS. Pokud dojde k problému s přihlašovacími údaji uloženými v mezipaměti, může se zobrazit chybová zpráva podobná následující chybové zprávě:

Operation failed with status: 'Bad Request'.
Details: The credentials in ServicePrincipalProfile were invalid. Please see https://aka.ms/aks-sp-help for more details.
Details: adal: Refresh request failed. Status Code = '401'.

Pomocí příkazu az ad app credential list s dotazem "[].endDateTime" můžete zkontrolovat datum vypršení platnosti přihlašovacích údajů objektu service principal. Výstup ukazuje hodnotu endDateTime vašich přihlašovacích údajů.

az ad app credential list \
    --id <app-id> \
    --query "[].endDateTime" \
    --output tsv
  • Pomocí rutiny Get-AzADAppCredential cmdlet zkontrolujte datum vypršení platnosti přihlašovacích údajů klientské hlavní identity. Výstup ukazuje hodnotu EndDate vašich přihlašovacích údajů.
Get-AzADAppCredential -ApplicationId <app-id> 

Výchozí doba vypršení platnosti přihlašovacích údajů hlavní služby je jeden rok. Pokud jsou vaše přihlašovací údaje starší než jeden rok, můžete stávající přihlašovací údaje resetovat nebo vytvořit nový instanční objekt.