Aracılığıyla paylaş


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.

Not

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.

Önkoş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 Connect-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’ında oturum açın.

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

  3. Hesap Ayarları 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.

    Portaldan çıktı.

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 mevcut bir yönetilen kimlik olup olmadığını göz önünde bulundurmanız gerekir. Aşağıdaki örnek, mevcut bir 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:

Set-AzAutomationAccount komutundan çıktı.

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/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/firstIdentity": {},
      "/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/resourceGroups/resource-group-name/providers/Microsoft.ManagedIdentity/userAssignedIdentities/secondIdentity": {}
    }
  }
}

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

https://management.azure.com/subscriptions/ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0/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": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
    "tenantId": "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
    "userAssignedIdentities":  {
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI1":  {
                "PrincipalId":  "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
                "ClientId":  "00001111-aaaa-2222-bbbb-3333cccc4444"
                    },
        "/subscriptions/ContosoID/resourcegroups/ContosoLab/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ContosoUAMI2":  {
                "PrincipalId":  "ffffffff-eeee-dddd-cccc-bbbbbbbbbbb0",
                "ClientId":  "00001111-aaaa-2222-bbbb-3333cccc4444"
                    }
        }
    }
    

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 atama

Otomasyon hesabı, Azure Key Vault gibi Microsoft Entra ID tarafından korunan diğer kaynaklara erişmek için belirteçleri almak için kullanıcı tarafından atanan yönetilen kimliğini kullanabilir. 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’ında oturum açın.

  2. Otomasyon hesabınıza gidin.

  3. Hesap Ayarları bölümünde Kimlik, Kullanıcı tarafından atanan seçeneğini belirleyin.

  4. Kullanıcı tarafından atanan kimlik adı seçeneğine tıklayın.

    Azure portalında kullanıcı tarafından atanan kimlikte rol atama.

    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.

    Azure portalında izniniz olan rol atamalarını görüntüleyin.

  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.

    Azure portalında rol ataması ekleyin.

Rol birkaç dakika sonra yönetilen kimliğe seçilen kapsamda 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