Używanie tożsamości zarządzanej przypisanej przez użytkownika w przypadku konta usługi Azure Automation

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

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 przypisanej przez system lub użytkownika maszyny wirtualnej w hybrydowym procesie roboczym elementu Runbook, który jest maszyną wirtualną platformy Azure z przypisanymi tożsamościami zarządzanymi.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

Wymagania wstępne

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

  • Tożsamość zarządzana przypisana przez użytkownika i docelowe zasoby platformy Azure zarządzane przez element Runbook mogą znajdować się w różnych subskrypcjach platformy Azure.

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

  • Zasób platformy Azure, do którego chcesz uzyskać dostęp z poziomu elementu Runbook usługi Automation. Ten zasób musi mieć rolę zdefiniowaną dla tożsamości zarządzanej przypisanej przez użytkownika, która ułatwia elementowi Runbook usługi Automation uwierzytelnianie dostępu do zasobu. Aby dodać role, musisz być właścicielem zasobu w odpowiedniej dzierżawie firmy Microsoft Entra.

  • Aby przypisać rolę platformy Azure, musisz mieć Microsoft.Authorization/roleAssignments/write uprawnienia, takie jak Administracja istrator dostępu użytkowników lub właściciel.

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

Tożsamość zarządzaną przypisaną przez użytkownika można dodać dla konta usługi Azure Automation przy użyciu witryny Azure Portal, programu PowerShell, interfejsu API REST platformy Azure lub szablonu usługi ARM. W przykładach dotyczących programu PowerShell najpierw zaloguj się do platformy Azure interaktywnie przy użyciu polecenia cmdlet Połączenie-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 witryny Azure Portal

Wykonaj następujące kroki:

  1. Zaloguj się w witrynie Azure Portal.

  2. W witrynie Azure Portal 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 karty Przypisane przez użytkownika.

    Output from Portal.

Dodawanie przy użyciu programu PowerShell

Użyj polecenia cmdlet programu PowerShell Set-AzAutomationAccount , aby dodać tożsamości zarządzane przypisane przez użytkownika. Najpierw należy rozważyć, czy istnieje tożsamość zarządzana przypisana przez system. Poniższy przykład dodaje dwie istniejące tożsamości zarządzane przypisane przez użytkownika do istniejącego konta usługi Automation i wyłączy tożsamość zarządzaną przypisaną przez system, jeśli 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 następujących elementów:

$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:

Output from Set-AzAutomationAccount command.

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.

PATCH

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
    }
  }
}

Składnia interfejsu API jest następująca:

https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/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 usługi Azure Storage.

  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": "00000000-0000-0000-0000-000000000000",
    "tenantId": "00000000-0000-0000-0000-000000000000",
    "userAssignedIdentities":  {
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1":  {
                "PrincipalId":  "00000000-0000-0000-0000-000000000000",
                "ClientId":  "00000000-0000-0000-0000-000000000000"
                    },
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2":  {
                "PrincipalId":  "00000000-0000-0000-0000-000000000000",
                "ClientId":  "00000000-0000-0000-0000-000000000000"
                    }
        }
    }
    

Dodawanie przy użyciu szablonu usługi 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 usługi Azure Storage.

  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.

Przypisz rolę 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 identyfikator entra firmy Microsoft, takich jak usługa 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.

Zanim będzie można korzystać z tożsamości zarządzanej przypisanej przez użytkownika na potrzeby uwierzytelniania, należy skonfigurować dla tej tożsamości dostęp do zasobu platformy Azure, z którym będziesz jej używać. W tym celu przypisz do tej tożsamości odpowiednią rolę w kontekście docelowego zasobu platformy Azure.

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 wymaga tylko możliwości uruchamiania lub zatrzymywania maszyny wirtualnej platformy Azure, do konta Uruchom jako lub do tożsamości zarządzanej powinny być przypisane tylko uprawnienia 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 programu Azure PowerShell, aby pokazać, jak przypisać rolę Współautor w subskrypcji do docelowego zasobu platformy Azure. Rola Współautor jest używana jako przykład i może być wymagana w Twoim przypadku lub może nie być wymagana. Alternatywnie możesz również przypisać rolę do docelowego zasobu platformy Azure w witrynie Azure Portal.

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ę w witrynie Azure Portal.

  2. Przejdź do konta usługi Automation.

  3. W obszarze Konto Ustawienia wybierz pozycję Tożsamość, Przypisano użytkownika.

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

    Assigning role in user-assigned identity in Azure portal.

    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.

    View role-assignments that you have permission in Azure portal.

  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 przypisania roli, możesz wyświetlić uprawnienia do zapisu dla wybranego zakresu jako komunikat wbudowany.

  8. Z listy rozwijanej Rola wybierz rolę Współautor maszyny wirtualnej.

  9. Kliknij przycisk Zapisz.

    Add a role assignment in Azure portal.

Po kilku minutach tożsamość zarządzana zostanie przypisana do roli 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 zezwoleniu tej tożsamości na dostęp do zasobu docelowego można wskazać tę tożsamość w elementach runbook dla zasobów, które obsługują tożsamość zarządzaną. Aby sprawdzić obsługę tożsamości zarządzanej, użyj polecenia cmdlet modułu 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 platformy Azure

W przypadku punktów końcowych HTTP upewnij się, że są następujące.

  • 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.

Uzyskiwanie tokenu dostępu dla tożsamości zarządzanej przypisanej przez użytkownika przy użyciu protokołu 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 przy użyciu wpisu 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 programie 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 elemecie Runbook języka Python

#!/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

  • Jeśli elementy Runbook nie kończą się pomyślnie, zapoznaj się z tematem Rozwiązywanie problemów z tożsamością zarządzaną usługi Azure Automation.

  • Jeśli musisz wyłączyć tożsamość zarządzaną, zobacz Wyłączanie tożsamości zarządzanej konta usługi Azure Automation.

  • Aby zapoznać się z omówieniem zabezpieczeń konta usługi Azure Automation, zobacz Omówienie uwierzytelniania konta usługi Automation.