Menggunakan identitas terkelola yang ditetapkan pengguna untuk akun Azure Automation

Artikel ini menunjukkan cara menambahkan identitas terkelola yang ditetapkan pengguna untuk akun Azure Automation dan cara menggunakannya untuk mengakses sumber daya lainnya. Untuk informasi selengkapnya tentang cara kerja identitas terkelola dengan Azure Automation, lihat Identitas terkelola.

Catatan

Tidak dimungkinkan untuk menggunakan Identitas Terkelola yang Ditetapkan Pengguna pada Hybrid Runbook Worker ketika Identitas Terkelola (baik Sistem atau Pengguna yang ditetapkan) telah dibuat untuk Akun Automation. Jika Identitas Terkelola belum ditetapkan ke Akun Automation, maka dimungkinkan untuk menggunakan Sistem VM atau Identitas Terkelola yang Ditetapkan Pengguna pada Hybrid Runbook Worker yang merupakan Azure VM dengan identitas terkelola yang ditetapkan.

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Prasyarat

Tambahkan identitas terkelola yang ditetapkan pengguna untuk akun Azure Automation

Anda dapat menambahkan identitas terkelola yang ditetapkan pengguna untuk akun Azure Automation menggunakan portal Microsoft Azure, PowerShell, Azure REST API, atau template ARM. Untuk contoh yang melibatkan PowerShell, pertama-tama masuk ke Azure secara interaktif menggunakan cmdlet Connect-AzAccount dan ikuti instruksi.

# 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>"

Kemudian inisialisasi satu set variabel yang akan digunakan di seluruh contoh. Revisi nilai-nilai di bawah ini dan kemudian jalankan"

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

Tambahkan menggunakan portal Microsoft Azure

Lakukan langkah-langkah berikut:

  1. Masuk ke portal Azure.

  2. Di portal Microsoft Azure, buka akun Automation Anda.

  3. Pada Pengaturan Akun, harap pilih Identitas.

  4. Pilih tab Ditetapkan pengguna, lalu pilih Tambahkan.

  5. Pilih identitas terkelola yang ditetapkan pengguna yang ada, lalu pilih Tambahkan. Anda kemudian akan dikembalikan ke tab Ditetapkan pengguna.

    Output from Portal.

Tambahkan menggunakan PowerShell

Gunakan cmdlet PowerShell Set-AzAutomationAccount untuk menambahkan identitas terkelola yang ditetapkan pengguna. Anda harus terlebih dahulu mempertimbangkan apakah ada identitas terkelola yang ditetapkan sistem yang ada. Contoh di bawah ini menambahkan dua identitas terkelola yang ditetapkan pengguna yang ada ke akun Automasi yang ada, dan akan menonaktifkan identitas terkelola yang ditetapkan sistem jika ada.

$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

Untuk mempertahankan identitas terkelola yang ditetapkan sistem yang ada, gunakan yang berikut ini:

$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

Output akan terlihat mirip dengan contoh berikut:

Output from Set-AzAutomationAccount command.

Untuk output tambahan, jalankan: $output.identity | ConvertTo-Json.

Tambahkan menggunakan REST API

Sintaks dan langkah-langkah contoh tersedia di bawah ini.

Sintaks

Sintaks isi contoh di bawah ini mengaktifkan identitas terkelola yang ditetapkan sistem jika belum diaktifkan dan menetapkan dua identitas terkelola yang ditetapkan pengguna yang ada ke akun Automasi yang ada.

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": {}
    }
  }
}

Sintaks API nya adalah sebagai berikut:

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 

Contoh

Lakukan langkah berikut.

  1. Revisi sintaks isi di atas menjadi file bernama body_ua.json. Simpan file di mesin lokal Anda atau di akun penyimpanan Azure.

  2. Revisi nilai variabel di bawah ini dan kemudian jalankan.

    $file = "path\body_ua.json"
    
  3. Contoh ini menggunakan cmdlet PowerShell Invoke-RestMethod untuk mengirim permintaan PATCH ke akun Automation Anda.

    # 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
    

    Output akan terlihat mirip dengan contoh berikut:

    {
    "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"
                    }
        }
    }
    

Tambahkan menggunakan template ARM

Sintaks dan langkah-langkah contoh tersedia di bawah ini.

Sintaks templat

Contoh sintaks template di bawah ini mengaktifkan identitas terkelola yang ditetapkan sistem jika belum diaktifkan dan menetapkan dua identitas terkelola yang ditetapkan pengguna yang ada ke akun Automasi yang ada.

{
  "$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": {}
        }
      }
    }
  ]
}

Contoh

Lakukan langkah berikut.

  1. Salin dan tempel kerangka tersebut ke dalam berkas bernama template_ua.json. Simpan file di mesin lokal Anda atau di akun penyimpanan Azure.

  2. Revisi nilai variabel di bawah ini dan kemudian jalankan.

    $templateFile = "path\template_ua.json"
    
  3. Gunakan cmdlet PowerShell New-AzResourceGroupDeployment untuk menyebarkan template.

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

    Perintah tidak akan menghasilkan output; namun, Anda dapat menggunakan kode di bawah ini untuk memverifikasi:

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

    Outputnya akan terlihat mirip dengan output yang ditunjukkan untuk contoh REST API, di atas.

Menetapkan peran ke identitas terkelola yang ditetapkan pengguna

Akun Automation dapat menggunakan identitas terkelola yang ditetapkan pengguna untuk mendapatkan token guna mengakses sumber daya lain yang dilindungi oleh ID Microsoft Entra, seperti Azure Key Vault. Token ini tidak mewakili pengguna aplikasi tertentu. Sebaliknya, mereka mewakili aplikasi yang mengakses sumber daya. Dalam hal ini, misalnya, token mewakili akun Otomatisasi.

Sebelum Anda dapat menggunakan identitas terkelola yang ditetapkan pengguna untuk autentikasi, siapkan akses untuk identitas tersebut di sumber daya Azure tempat Anda berencana menggunakan identitas tersebut. Untuk menyelesaikan tugas ini, tetapkan peran yang sesuai untuk identitas tersebut pada sumber daya Azure target.

Ikuti prinsip hak istimewa paling rendah dan dengan hati-hati tetapkan izin yang hanya diperlukan untuk menjalankan runbook Anda. Misalnya, jika akun Azure Automation hanya diperlukan untuk memulai atau menghentikan Azure VM, maka izin yang ditetapkan ke akun Run As atau identitas terkelola hanya untuk memulai atau menghentikan mesin virtual. Demikian pula, jika runbook dibaca dari penyimpanan gumpalan, maka tetapkan izin baca saja.

Contoh ini menggunakan Azure PowerShell untuk memperlihatkan cara menetapkan peran Kontributor dalam langganan ke sumber daya Azure target. Peran Kontributor digunakan sebagai contoh dan mungkin atau mungkin tidak diperlukan dalam kasus Anda. Atau, Anda juga dapat menetapkan peran ke sumber daya Azure target di portal Azure.

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

Memverifikasi penetapan peran ke identitas yang dikelola pengguna

Untuk memverifikasi peran pada identitas terkelola yang ditetapkan pengguna dari akun Automation, ikuti langkah berikut ini:

  1. Masuk ke portal Azure.

  2. Buka akun Automasi Anda.

  3. Di bawah Pengaturan Akun, pilih Identitas, Ditetapkan pengguna.

  4. Klik Nama identitas yang ditetapkan pengguna.

    Assigning role in user-assigned identity in Azure portal.

    Jika peran sudah ditetapkan pada identitas terkelola yang ditetapkan sistem yang dipilih, Anda akan melihat daftar penetapan peran. Daftar ini mencakup semua penetapan peran yang Anda dapat baca.

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

  5. Untuk mengubah langganan, klik daftar drop-down Langganan dan pilih langganan yang sesuai.

  6. Klik Tambahkan penetapan peran (Pratinjau)

  7. Di daftar drop-down, pilih kumpulan sumber daya yang diterapkan penetapan peran - Langganan, Grup sumber daya, Peran, dan Cakupan.
    Jika Anda tidak memiliki penetapan peran, Anda dapat melihat izin tulis untuk cakupan yang dipilih sebagai pesan sebaris.

  8. Di daftar drop-down Peran, pilih peran sebagai Kontributor Komputer Virtual.

  9. Klik Simpan.

    Add a role assignment in Azure portal.

Setelah beberapa menit, identitas terkelola diberi peran pada cakupan yang dipilih.

Autentikasi akses dengan identitas terkelola yang ditetapkan pengguna

Setelah Anda mengaktifkan identitas terkelola yang ditetapkan pengguna untuk akun Automasi Anda dan memberikan akses identitas ke sumber daya target, Anda dapat menentukan identitas itu di runbook terhadap sumber daya yang mendukung identitas terkelola. Untuk dukungan identitas, gunakan Connect-AzAccount Az cmdlet.

# 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

Hasilkan token akses tanpa menggunakan cmdlet Azure

Untuk Titik Akhir HTTP, pastikan hal berikut ini.

  • Header metadata harus ada dan harus disetel ke "true".
  • Sumber daya harus diteruskan bersama dengan permintaan, sebagai parameter kueri untuk permintaan GET dan sebagai data formulir untuk permintaan POST.
  • Atur nilai variabel lingkungan IDENTITY_HEADER ke X-IDENTITY-HEADER.
  • Jenis Konten untuk permintaan Pos harus application/x-www-form-urlencoded.

Dapatkan token Akses untuk identitas terkelola yang ditetapkan pengguna menggunakan 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 

Dapatkan token Akses untuk identitas terkelola yang ditetapkan pengguna menggunakan HTTP Post

$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 

Menggunakan identitas terkelola yang ditetapkan pengguna di 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)  
} 

Menggunakan identitas terkelola yang ditetapkan pengguna di 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) 

Langkah berikutnya