Azure Otomasyonu hesabı için kullanıcı tarafından atanan yönetilen kimlik kullanma

Bu makalede, bir Azure Otomasyonu hesabı için kullanıcı tarafından atanan yönetilen kimliğin nasıl ekleneceği ve diğer kaynaklara erişmek için nasıl kullanılacağı gösterilmektedir. Yönetilen kimliklerin Azure Otomasyonu ile nasıl çalıştığı hakkında daha fazla bilgi için bkz. Yönetilen kimlikler.

Dekont

Otomasyon Hesabı için bir Yönetilen Kimlik (Sistem veya Kullanıcı tarafından atanmış) oluşturulduğunda Karma Runbook Çalışanı üzerinde Kullanıcı Tarafından Atanan Yönetilen Kimlik kullanmak mümkün değildir. Yönetilen Kimlik Otomasyon Hesabına atanmamışsa, vm'nin Sistem veya Kullanıcı Tarafından Atanan Yönetilen Kimliğini atanan yönetilen kimliklere sahip bir Azure VM olan Karma Runbook Çalışanı üzerinde kullanmak mümkündür.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Ön koşullar

Azure Otomasyonu hesabı için kullanıcı tarafından atanan yönetilen kimlik ekleme

Azure portalını, PowerShell'i, Azure REST API'sini veya ARM şablonunu kullanarak Azure Otomasyonu hesabı için kullanıcı tarafından atanan yönetilen kimlik ekleyebilirsiniz. PowerShell ile ilgili örnekler için önce Bağlan-AzAccount cmdlet'ini kullanarak Azure'da etkileşimli olarak oturum açın ve yönergeleri izleyin.

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

Ardından, örnekler boyunca kullanılacak bir dizi değişken başlatın. Aşağıdaki değerleri düzeltin ve ardından yürütebilirsiniz"

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

Azure portalını kullanarak ekleme

Aşağıdaki adımları gerçekleştirin:

  1. Azure Portal oturum açın.

  2. Azure portalında Otomasyon hesabınıza gidin.

  3. Hesap Ayarları’nın altında Kimlik'i seçin.

  4. Kullanıcı tarafından atanan sekmesini ve ardından Ekle'yi seçin.

  5. Kullanıcı tarafından atanan mevcut yönetilen kimliğinizi ve ardından Ekle'yi seçin. Ardından Kullanıcı tarafından atanan sekmesine geri dönersiniz.

    Output from Portal.

PowerShell kullanarak ekleme

Kullanıcı tarafından atanan yönetilen kimlikleri eklemek için Set-AzAutomationAccount PowerShell cmdlet'ini kullanın. Öncelikle sistem tarafından atanan yönetilen kimliğin mevcut olup olmadığını göz önünde bulundurmanız gerekir. Aşağıdaki örnek, mevcut otomasyon hesabına mevcut kullanıcı tarafından atanan iki yönetilen kimlik ekler ve varsa sistem tarafından atanan yönetilen kimliği devre dışı bırakır.

$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

Sistem tarafından atanan mevcut bir yönetilen kimliği korumak için aşağıdakileri kullanın:

$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

Çıkış aşağıdakine benzer görünmelidir:

Output from Set-AzAutomationAccount command.

Ek çıkış için şunu yürütür: $output.identity | ConvertTo-Json.

REST API kullanarak ekleme

Söz dizimi ve örnek adımlar aşağıda verilmiştır.

Sözdizimi

Aşağıdaki örnek gövde söz dizimi, henüz etkinleştirilmemişse sistem tarafından atanan yönetilen kimliği etkinleştirir ve mevcut Otomasyon hesabına mevcut kullanıcı tarafından atanan iki yönetilen kimlik atar.

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

API'nin söz dizimi aşağıdaki gibidir:

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 

Örnek

Aşağıdaki adımları gerçekleştirin.

  1. Yukarıdaki gövdenin söz dizimini adlı body_ua.jsonbir dosyada düzeltin. Dosyayı yerel makinenize veya bir Azure depolama hesabına kaydedin.

  2. Aşağıdaki değişken değerini düzeltin ve yürütür.

    $file = "path\body_ua.json"
    
  3. Bu örnekte, Patch isteğini Otomasyon hesabınıza göndermek için Invoke-RestMethod PowerShell cmdlet'i kullanılır.

    # 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
    

    Çıkış aşağıdakine benzer görünmelidir:

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

ARM şablonu kullanarak ekleme

Söz dizimi ve örnek adımlar aşağıda verilmiştır.

Şablon söz dizimi

Aşağıdaki örnek şablon söz dizimi, henüz etkinleştirilmemişse sistem tarafından atanan yönetilen kimliği etkinleştirir ve mevcut Otomasyon hesabına mevcut kullanıcı tarafından atanan iki yönetilen kimlik atar.

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

Örnek

Aşağıdaki adımları gerçekleştirin.

  1. Şablonu kopyalayıp adlı template_ua.jsonbir dosyaya yapıştırın. Dosyayı yerel makinenize veya bir Azure depolama hesabına kaydedin.

  2. Aşağıdaki değişken değerini düzeltin ve yürütür.

    $templateFile = "path\template_ua.json"
    
  3. Şablonu dağıtmak için New-AzResourceGroupDeployment PowerShell cmdlet'ini kullanın.

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

    Komut bir çıkış oluşturmaz; ancak aşağıdaki kodu kullanarak şunları doğrulayabilirsiniz:

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

    Çıktı, yukarıdaki REST API örneği için gösterilen çıkışa benzer olacaktır.

Kullanıcı tarafından atanan yönetilen kimliğe rol atayın

Otomasyon hesabı, Kullanıcı tarafından atanan yönetilen kimliğini kullanarak Azure Key Vault gibi Microsoft Entra Id ile korunan diğer kaynaklara erişmek için belirteçler alabilir. Bu belirteçler uygulamanın belirli bir kullanıcısını temsil etmez. Bunun yerine, kaynağa erişen uygulamayı temsil ederler. Bu durumda, örneğin belirteç bir Otomasyon hesabını temsil eder.

Kimlik doğrulaması için kullanıcı tarafından atanan yönetilen kimliğinizi kullanabilmeniz için önce, kimliği kullanmayı planladığınız Azure kaynağında bu kimliğe erişim ayarlayın. Bu görevi tamamlamak için hedef Azure kaynağında bu kimliğe uygun rolü atayın.

En az ayrıcalık sorumlusunu izleyin ve yalnızca runbook'unuzu yürütmek için gereken izinleri dikkatli bir şekilde atayın. Örneğin, Otomasyon hesabının yalnızca bir Azure VM’i başlatmak veya durdurmak için gerekli olması durumunda, Farklı Çalıştır hesabına veya yönetilen kimliğe atanan izinlerin yalnızca VM’i başlatmak veya durdurmak için olması gerekir. Benzer şekilde, runbook blob storage’dan okuyorsa, salt okunur izinler atayın.

Bu örnek, abonelikteki Katkıda Bulunan rolünün hedef Azure kaynağına nasıl atanacaklarını göstermek için Azure PowerShell'i kullanır. Katkıda Bulunan rolü örnek olarak kullanılır ve sizin örneğinizde gerekli olabilir veya olmayabilir. Alternatif olarak, rolü Azure portalında hedef Azure kaynağına da atayabilirsiniz.

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

Kullanıcı tarafından yönetilen kimliğe rol atamasını doğrulama

Otomasyon hesabının kullanıcı tarafından atanan yönetilen kimliğine rol doğrulamak için şu adımları izleyin:

  1. Azure Portal oturum açın.

  2. Otomasyon hesabınıza gidin.

  3. Hesap Ayarlar altında Kimlik, Kullanıcı atandı'yı seçin.

  4. Kullanıcı tarafından atanan kimlik adı'ne tıklayın.

    Assigning role in user-assigned identity in Azure portal.

    Roller seçili kullanıcı tarafından atanan yönetilen kimliğe zaten atanmışsa rol atamalarının listesini görebilirsiniz. Bu liste, okuma izninizin olduğu tüm rol atamalarını içerir.

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

  5. Aboneliği değiştirmek için Abonelik açılan listesine tıklayın ve uygun aboneliği seçin.

  6. Rol ataması ekle (Önizleme) seçeneğine tıklayın

  7. Açılan listede rol atamasının uyguladığı kaynak kümesini seçin: Abonelik, Kaynak grubu, Rol ve Kapsam.
    Rol atamanız yoksa, seçili kapsamın yazma izinlerini satır içi ileti olarak görüntüleyebilirsiniz.

  8. Rol açılan listesinde Sanal Makine Katkıda Bulunanı olarak bir rol seçin.

  9. Kaydet'e tıklayın.

    Add a role assignment in Azure portal.

Birkaç dakika sonra yönetilen kimliğe seçilen kapsamda rol atanır.

Kullanıcı tarafından atanan yönetilen kimlikle erişimin kimliğini doğrulama

Otomasyon hesabınız için kullanıcı tarafından atanan yönetilen kimliği etkinleştirdikten ve hedef kaynağa bir kimlik erişimi verdikten sonra, yönetilen kimliği destekleyen kaynaklara karşı runbook'larda bu kimliği belirtebilirsiniz. Kimlik desteği için Az cmdlet Connect-AzAccount kullanın.

# 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

Azure cmdlet'lerini kullanmadan erişim belirteci oluşturma

HTTP Uç Noktaları için aşağıdakilerden emin olun.

  • Meta veri üst bilgisi mevcut olmalı ve "true" olarak ayarlanmalıdır.
  • Kaynak istekle birlikte, GET isteği için sorgu parametresi olarak ve POST isteği için form verileri olarak geçirilmelidir.
  • IDENTITY_HEADER ortam değişkeninin değerini X-IDENTITY-HEADER olarak ayarlayın.
  • Gönderi isteğinin İçerik Türü olmalıdır application/x-www-form-urlencoded.

HTTP Get kullanarak kullanıcı tarafından atanan yönetilen kimlik için Erişim belirteci alma

$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 

HTTP Post kullanarak kullanıcı tarafından atanan yönetilen kimlik için Erişim belirteci alma

$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 

Azure PowerShell'de kullanıcı tarafından atanan yönetilen kimliği kullanma

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)  
} 

Python Runbook'ta kullanıcı tarafından atanan yönetilen kimliği kullanma

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

Sonraki adımlar