Używanie tożsamości zarządzanej przypisanej przez użytkownika dla konta Azure Automation

W tym artykule pokazano, jak dodać tożsamość zarządzaną przypisaną przez użytkownika dla konta Azure Automation i jak używać go do uzyskiwania dostępu do innych zasobów. Aby uzyskać więcej informacji na temat sposobu pracy tożsamości zarządzanych z Azure Automation, zobacz Managed identities.

Uwaga

Nie można użyć tożsamości zarządzanej przypisanej przez użytkownika w hybrydowym procesie roboczym elementu Runbook, gdy tożsamość zarządzana (system lub przypisany przez użytkownika) została utworzona dla konta usługi Automation. Jeśli tożsamość zarządzana nie została przypisana do konta usługi Automation, można użyć tożsamości zarządzanej systemowej lub przypisanej przez użytkownika maszyny wirtualnej na hybrydowym agencie Runbook, który jest maszyną wirtualną Azure, która ma przypisane tożsamości zarządzane.

Jeśli nie masz subskrypcji Azure, przed rozpoczęciem utwórz konto free.

Wymagania wstępne

  • Konto Azure Automation. Aby uzyskać instrukcje, zobacz Tworzenie konta Azure Automation.

  • Tożsamość zarządzana przypisana użytkownika oraz docelowe zasoby Azure, którymi zarządza runbook przy użyciu tej tożsamości, mogą znajdować się w różnych subskrypcjach Azure.

  • Najnowsza wersja modułów konta Azure. Obecnie jest to wersja 2.2.8. (Zobacz Az.Accounts zawiera szczegółowe informacje o tej wersji).

  • Zasób Azure, do którego chcesz uzyskać dostęp z poziomu runbooka w usłudze Automation. Aby umożliwić runbookowi usługi Automation uwierzytelnienie dostępu do zasobu, ten zasób musi mieć zdefiniowaną rolę dla tożsamości zarządzanej przypisanej przez użytkownika. Aby dodać role, musisz posiadać status właściciela zasobu w odpowiedniej dzierżawie Microsoft Entra.

  • Aby przypisać rolę Azure, musisz mieć uprawnienia Microsoft.Authorization/roleAssignments/write, takie jak User Access Administrator lub Owner.

Dodawanie tożsamości zarządzanej przypisanej przez użytkownika dla konta Azure Automation

Tożsamość zarządzaną przypisaną przez użytkownika można dodać dla konta Azure Automation przy użyciu portalu Azure, programu PowerShell, interfejsu API REST Azure lub szablonu usługi ARM. W przykładach dotyczących programu PowerShell najpierw zaloguj się do Azure interaktywnie przy użyciu polecenia cmdlet Connect-AzAccount i postępuj zgodnie z instrukcjami.

# Sign in to your Azure subscription
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"

Następnie zainicjuj zestaw zmiennych, które będą używane w różnych przykładach. Popraw poniższe wartości, a następnie wykonaj"

$subscriptionID = "subscriptionID"
$resourceGroup = "resourceGroupName"
$automationAccount = "automationAccountName"
$userAssignedOne = "userAssignedIdentityOne"
$userAssignedTwo = "userAssignedIdentityTwo"

Dodawanie przy użyciu portalu Azure

Wykonaj następujące kroki:

  1. Zaloguj się do portalu Azure.

  2. W portalu Azure przejdź do swojego konta usługi Automation.

  3. W obszarze Ustawienia konta wybierz pozycję Tożsamość.

  4. Wybierz kartę Użytkownik przypisany , a następnie wybierz pozycję Dodaj.

  5. Wybierz istniejącą tożsamość zarządzaną przypisaną przez użytkownika, a następnie wybierz pozycję Dodaj. Następnie nastąpi powrót do zakładki Przypisane użytkownikowi.

    Dane wyjściowe z portalu.

Dodawanie przy użyciu programu PowerShell

Użyj polecenia cmdlet programu PowerShell Set-AzAutomationAccount aby dodać przypisane przez użytkownika zarządzane tożsamości. Najpierw należy rozważyć, czy istnieje tożsamość zarządzana przypisana przez system. W poniższym przykładzie dwie istniejące tożsamości zarządzane przypisane przez użytkownika są dodawane do istniejącego konta usługi Automation, co spowoduje wyłączenie tożsamości zarządzanej przypisanej przez system, jeśli taka istnieje.

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignUserIdentity "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedOne", `
        "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedTwo"

$output

Aby zachować istniejącą tożsamość zarządzaną przypisaną przez system, użyj:

$output = Set-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount `
    -AssignUserIdentity "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedOne", `
        "/subscriptions/$subscriptionID/resourcegroups/$resourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$userAssignedTwo" `
    -AssignSystemIdentity

$output

Dane wyjściowe powinny wyglądać mniej więcej tak:

Dane wyjściowe z polecenia Set-AzAutomationAccount.

Aby uzyskać dodatkowe dane wyjściowe, wykonaj polecenie: $output.identity | ConvertTo-Json.

Dodawanie przy użyciu interfejsu API REST

Poniżej podano składnię i przykładowe kroki.

Składnia

Poniższa przykładowa składnia treści umożliwia przypisaną przez system tożsamość zarządzaną, jeśli nie została jeszcze włączona i przypisuje dwie istniejące tożsamości zarządzane przypisane przez użytkownika do istniejącego konta usługi Automation.

łatka

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00a000aa-00a0-00aa-00aa-0a0aa000aa00/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
      "/subscriptions/00a000aa-00a0-00aa-00aa-0a0aa000aa00/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
    }
  }
}

Składnia API jest następująca:

https://management.azure.com/subscriptions/00a000aa-00a0-00aa-00aa-0a0aa000aa00/resourceGroups/resource-group-name/providers/Microsoft.Automation/automationAccounts/automation-account-name?api-version=2020-01-13-preview 

Przykład

Wykonaj następujące kroki.

  1. Popraw składnię treści powyżej do pliku o nazwie body_ua.json. Zapisz plik na komputerze lokalnym lub na koncie magazynu Azure.

  2. Popraw wartość zmiennej poniżej, a następnie wykonaj polecenie .

    $file = "path\body_ua.json"
    
  3. W tym przykładzie użyto polecenia cmdlet Programu PowerShell Invoke-RestMethod , aby wysłać żądanie PATCH do konta usługi Automation.

    # build URI
    $URI = "https://management.azure.com/subscriptions/$subscriptionID/resourceGroups/$resourceGroup/providers/Microsoft.Automation/automationAccounts/$automationAccount`?api-version=2020-01-13-preview"
    
    # build body
    $body = Get-Content $file
    
    # obtain access token
    $azContext = Get-AzContext
    $azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
    $profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
    $token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
    $authHeader = @{
        'Content-Type'='application/json'
        'Authorization'='Bearer ' + $token.AccessToken
    }
    
    # Invoke the REST API
    $response = Invoke-RestMethod -Uri $URI -Method PATCH -Headers $authHeader -Body $body
    
    # Review output
    $response.identity | ConvertTo-Json
    

    Dane wyjściowe powinny wyglądać mniej więcej tak:

    {
    "type": "SystemAssigned, UserAssigned",
    "principalId": "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
    "tenantId": "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
    "userAssignedIdentities":  {
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1":  {
                "PrincipalId":  "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
                "ClientId":  "00001111-aaaa-2222-bbbb-3333cccc4444"
                    },
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2":  {
                "PrincipalId":  "00a000aa-00a0-00aa-00aa-0a0aa000aa00",
                "ClientId":  "00001111-aaaa-2222-bbbb-3333cccc4444"
                    }
        }
    }
    

Dodawanie przy użyciu szablonu ARM

Poniżej podano składnię i przykładowe kroki.

Składnia szablonu

Poniższa przykładowa składnia szablonu umożliwia przypisaną przez system tożsamość zarządzaną, jeśli nie została jeszcze włączona i przypisuje dwie istniejące tożsamości zarządzane przypisane przez użytkownika do istniejącego konta usługi Automation.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "automationAccountName": {
     "defaultValue": "YourAutomationAccount",
      "type": "String",
      "metadata": {
        "description": "Automation account name"
      }
    },
    "userAssignedOne": {
     "defaultValue": "userAssignedOne",
      "type": "String",
      "metadata": {
        "description": "User-assigned managed identity"
      }
	  },
    "userAssignedTwo": {
     "defaultValue": "userAssignedTwo",
      "type": "String",
      "metadata": {
        "description": "User-assigned managed identity"
      }
	  }
   },
  "resources": [
    {
      "type": "Microsoft.Automation/automationAccounts",
      "apiVersion": "2020-01-13-preview",
      "name": "[parameters('automationAccountName')]",
      "location": "[resourceGroup().location]",
      "identity": {
        "type": "SystemAssigned, UserAssigned",
        "userAssignedIdentities": {
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('userAssignedOne'))]": {},
          "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('userAssignedTwo'))]": {}
        }
      },
      "properties": {
        "sku": {
          "name": "Basic"
        },
        "encryption": {
          "keySource": "Microsoft.Automation",
          "identity": {}
        }
      }
    }
  ]
}

Przykład

Wykonaj następujące kroki.

  1. Skopiuj i wklej szablon do pliku o nazwie template_ua.json. Zapisz plik na komputerze lokalnym lub na koncie magazynu Azure.

  2. Popraw wartość zmiennej poniżej, a następnie wykonaj polecenie .

    $templateFile = "path\template_ua.json"
    
  3. Użyj polecenia cmdlet programu PowerShell New-AzResourceGroupDeployment , aby wdrożyć szablon.

    New-AzResourceGroupDeployment `
        -Name "UserAssignedDeployment" `
        -ResourceGroupName $resourceGroup `
        -TemplateFile $templateFile `
        -automationAccountName $automationAccount `
        -userAssignedOne $userAssignedOne `
        -userAssignedTwo $userAssignedTwo
    

    Polecenie nie spowoduje wygenerowania danych wyjściowych; Możesz jednak użyć poniższego kodu, aby sprawdzić:

    (Get-AzAutomationAccount `
    -ResourceGroupName $resourceGroup `
    -Name $automationAccount).Identity | ConvertTo-Json
    

    Dane wyjściowe będą wyglądać podobnie do danych wyjściowych przedstawionych dla przykładu interfejsu API REST powyżej.

Przypisywanie roli do tożsamości zarządzanej przypisanej przez użytkownika

Konto usługi Automation może używać przypisanej przez użytkownika tożsamości zarządzanej do uzyskiwania tokenów w celu uzyskania dostępu do innych zasobów chronionych przez Microsoft Entra ID, takich jak Azure Key Vault. Te tokeny nie reprezentują żadnego konkretnego użytkownika aplikacji. Reprezentują aplikację, która uzyskuje dostęp do zasobu. W tym przykładzie token reprezentuje konto usługi Automation.

Aby można było użyć tożsamości zarządzanej przypisanej przez użytkownika do uwierzytelniania, skonfiguruj dostęp dla tej tożsamości w zasobie Azure, w którym planujesz używać tożsamości. Aby wykonać to zadanie, przypisz odpowiednią rolę do tej tożsamości w zasobie Azure docelowym.

Postępuj zgodnie z zasadą najniższego wymaganego poziomu uprawnień i przypisz tylko uprawnienia wymagane do wykonania elementu runbook. Jeśli na przykład konto usługi Automation jest wymagane tylko do uruchomienia lub zatrzymania maszyny wirtualnej Azure, uprawnienia przypisane do konta Uruchom jako lub tożsamości zarządzanej muszą być tylko do uruchamiania lub zatrzymywania maszyny wirtualnej. Podobnie jeśli element runbook odczytuje dane z magazynu obiektów blob, przypisz uprawnienia tylko do odczytu.

W tym przykładzie użyto Azure PowerShell, aby pokazać, jak przypisać rolę Współautor w subskrypcji do zasobu docelowego Azure. Rola Współautor jest używana jako przykład i może nie być wymagana w Twoim przypadku. Możesz również przypisać rolę do zasobu docelowego Azure w portalu Azure.

New-AzRoleAssignment `
    -ObjectId <automation-Identity-object-id> `
    -Scope "/subscriptions/<subscription-id>" `
    -RoleDefinitionName "Contributor"

Weryfikowanie przypisania roli do tożsamości zarządzanej przez użytkownika

Aby zweryfikować rolę przypisanej przez użytkownika tożsamości zarządzanej konta usługi Automation, wykonaj następujące czynności:

  1. Zaloguj się do portalu Azure.

  2. Przejdź do konta usługi Automation.

  3. W obszarze Ustawienia konta wybierz pozycję Tożsamość, Przypisana przez użytkownika.

  4. Kliknij Nazwa tożsamości przypisanej przez użytkownika.

    Przypisania roli w tożsamości przypisanej przez użytkownika w portalu Azure.

    Jeśli przypisano już role do wybranej tożsamości zarządzanej przypisanej przez użytkownika, będzie widoczna lista przypisań ról. Ta lista zawiera wszystkie przypisania ról, do których masz uprawnienia do odczytu.

    Zobacz przypisania ról, do których masz uprawnienia w portalu Azure.

  5. Aby zmienić subskrypcję, kliknij listę rozwijaną Subskrypcja i wybierz odpowiednią subskrypcję.

  6. Kliknij pozycję Dodaj przypisanie roli (wersja zapoznawcza)

  7. Z listy rozwijanej wybierz zestaw zasobów, które ma zastosowanie przypisanie roli — subskrypcja, grupa zasobów, rola i zakres.
    Jeśli nie masz przypisanej roli, możesz wyświetlić uprawnienia do zapisu dla wybranego zakresu jako wiadomość wbudowaną.

  8. Z listy rozwijanej Rola wybierz rolę Kontrybutor maszyn wirtualnych.

  9. Kliknij przycisk Zapisz.

    Dodaj przypisanie roli w portalu Azure.

Po kilku minutach do tożsamości zarządzanej zostanie przypisana rola w wybranym zakresie.

Uwierzytelnianie dostępu za pomocą tożsamości zarządzanej przypisanej przez użytkownika

Po włączeniu tożsamości zarządzanej przypisanej przez użytkownika dla konta usługi Automation i nadaniu jej dostępu do zasobu docelowego można wskazać tę tożsamość w runbookach dla zasobów obsługiwanych przez tożsamość zarządzaną. Aby uzyskać wsparcie dotyczące tożsamości, użyj polecenia cmdlet Az Connect-AzAccount.

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with user-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity -AccountId <user-assigned-identity-ClientId>).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

Generowanie tokenu dostępu bez używania poleceń cmdlet Azure

W przypadku punktów końcowych HTTP upewnij się, że spełniają one następujące wymagania.

  • Nagłówek metadanych musi być obecny i powinien być ustawiony na wartość "true".
  • Zasób musi zostać przekazany wraz z żądaniem, jako parametr zapytania dla żądania GET i jako dane formularza dla żądania POST.
  • Ustaw wartość zmiennej środowiskowej IDENTITY_HEADER na X-IDENTITY-HEADER.
  • Typ zawartości dla żądania Post musi mieć wartość application/x-www-form-urlencoded.

Uzyskaj token dostępu do tożsamości zarządzanej przypisanej przez użytkownika za pomocą zapytania HTTP GET.

$resource= "?resource=https://management.azure.com/"
$client_id="&client_id=<ClientId of USI>"
$url = $env:IDENTITY_ENDPOINT + $resource + $client_id 
$Headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"  
$Headers.Add("Metadata", "True")
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$accessToken = Invoke-RestMethod -Uri $url -Method 'GET' -Headers $Headers
Write-Output $accessToken.access_token 

Uzyskiwanie tokenu dostępu dla tożsamości zarządzanej przypisanej przez użytkownika za pomocą żądania POST HTTP

$url = $env:IDENTITY_ENDPOINT
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Metadata", "True")
$headers.Add("X-IDENTITY-HEADER", $env:IDENTITY_HEADER) 
$body = @{'resource'='https://management.azure.com/' 
'client_id'='<ClientId of USI>'}
$accessToken = Invoke-RestMethod $url -Method 'POST' -Headers $headers -ContentType 'application/x-www-form-urlencoded' -Body $body
Write-Output $accessToken.access_token 

Używanie tożsamości zarządzanej przypisanej przez użytkownika w Azure PowerShell

Write-Output "Connecting to azure via  Connect-AzAccount -Identity -AccountId <ClientId of USI>"  
Connect-AzAccount -Identity -AccountId <ClientId of USI> 
Write-Output "Successfully connected with Automation account's Managed Identity"  
Write-Output "Trying to fetch value from key vault using User Assigned Managed identity. Make sure you have given correct access to Managed Identity"  
$secret = Get-AzKeyVaultSecret -VaultName '<KVname>' -Name '<KeyName>'  
$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret.SecretValue)  
try {  
  $secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)  
    Write-Output $secretValueText  
} finally {  
    [System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)  
} 

Używanie tożsamości zarządzanej przypisanej przez użytkownika w Python runbook

#!/usr/bin/env python3  
import os  
import requests   

resource = "?resource=https://management.azure.com/" 
client_id = "&client_id=<ClientId of USI>" 
endPoint = os.getenv('IDENTITY_ENDPOINT')+ resource +client_id 
identityHeader = os.getenv('IDENTITY_HEADER') 
payload={}  
headers = {  
  'X-IDENTITY-HEADER': identityHeader,
  'Metadata': 'True' 
}  
response = requests.request("GET", endPoint, headers=headers, data=payload)  
print(response.text) 

Następne kroki