共用方式為


使用 Azure Resource Manager 服務連線連線連線至 Azure

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

注意

我們正在推出新的 Azure 服務連線建立體驗。 在您的組織中接收它取決於各種因素,您仍然可能會看到較舊的用戶體驗。

Azure Resource Manager 服務連線可讓您從管線連線到 Azure 資源,例如 Azure 金鑰保存庫。 此連線可讓您使用管線來部署至 Azure 資源,例如 Azure App 服務 應用程式,而不需要每次進行驗證。

您有多個驗證選項,可透過 Azure Resource Manager 服務連線連線至 Azure。 我們建議使用 工作負載識別聯盟,並搭配應用程式註冊或受控識別。 工作負載身份聯盟不需要機密資訊或機密管理。

建議的選項:

注意

還有其他 Azure Resource Manager 服務連線驗證選項不使用工作負載身分識別同盟。 這些選項適用於回溯相容性和邊緣案例,不建議使用。 如果您是第一次設定服務連線,請使用工作負載身分識別同盟。 如果您有現有的服務連線,請嘗試先 將服務連線轉換成使用工作負載身分識別同盟

使用工作負載身分識別同盟建立應用程式註冊 (自動)

如果您的案例中下列所有專案都成立,您可以使用此方法:

  • 具備「擁有者」角色的 Azure 訂用帳戶。
  • 您未連線到 Azure StackAzure 美國政府 環境。
  • 您使用的任何 Marketplace 擴充功能工作都會更新,以支援工作負載身分識別同盟。

選取此選項后,Azure DevOps 會自動查詢您要連線的訂用帳戶、管理群組或 機器學習 工作區,並建立工作負載身分識別同盟以進行驗證。

  1. 在 Azure DevOps 專案中,移至 [項目設定>服務連線]。

    如需詳細資訊,請參閱 開啟項目設定

  2. 選取 [ 新增服務連線],然後選取 [Azure Resource Manager ] 和 [下一步]。

    顯示選擇 Azure Resource Manager 選取項目的螢幕快照。

  3. 選取 [應用程式註冊][自動] 與認證 [工作負載身分識別同盟]。

    應用程式註冊(自動)驗證方法選取的螢幕快照,其中已選取工作負載身分識別。

  4. 選取範圍 層級。 選取 [訂用帳戶]、[管理群組] 或 [機器學習 工作區]。 管理群組 是可協助您跨多個訂用帳戶管理存取、原則和合規性的容器。 機器學習 工作區可用來建立機器學習成品。

    • 針對 [ 訂用帳戶 ] 範圍,輸入下列參數:

      參數 描述
      訂用帳戶 必要。 選取 Azure 訂用帳戶。
      資源群組 選擇性。 選取 Azure 資源群組。
    • 針對 [ 管理群組 ] 範圍,選取 [Azure 管理群組]。

    • 針對 機器學習 工作區範圍,輸入下列參數:

      參數 描述
      訂用帳戶 必要。 選取 Azure 訂用帳戶。
      資源群組 必要。 選取包含工作區的資源群組。
      機器學習 工作區 必要。 選取 [Azure 機器學習 工作區]。
  5. 輸入服務連線名稱

  6. 或者,輸入服務連線的描述。

  7. 選取 [ 授與所有管線 的訪問許可權] 以允許所有管線使用此服務連線。 如果您未選取此選項,則必須手動授與使用此服務連線之每個管線的存取權。

  8. 選取儲存

建立現有的使用者指派受控身分識別的服務連線

使用此選項可自動建立現有使用者指派受控識別的工作負載身分識別認證。 開始之前,您必須擁有 現有的使用者指派受控識別

  1. 在 Azure DevOps 專案中,移至 [項目設定>服務連線]。

    如需詳細資訊,請參閱 開啟項目設定

  2. 選取 [ 新增服務連線],然後選取 [Azure Resource Manager ] 和 [下一步]。

    顯示選擇 Azure Resource Manager 選取項目的螢幕快照。

  3. 選取 [受控身分識別]

    顯示使用使用者指派身分識別選擇 Azure Resource Manager 選取受控識別的螢幕快照。

  4. 步驟 1:受控識別詳細數據中:

    1. 選取 [受控識別的訂用帳戶]。 這是包含受控識別的 Azure 訂用帳戶。
    2. 針對受控識別選取 [資源群組]。 這是包含受控識別的資源群組。
    3. 選取 [受控識別]。 這是您將用來存取資源的資源群組內的受控識別。
  5. 步驟 2:Azure 範圍

    1. 選取 [ 範圍層級]。 選取 [訂用帳戶]、[管理群組] 或 [機器學習 工作區]。 管理群組 是可協助您跨多個訂用帳戶管理存取、原則和合規性的容器。 機器學習 工作區可用來建立機器學習成品。

      • 針對 [ 訂用帳戶 ] 範圍,輸入下列參數:

        參數 描述
        服務連線的訂用帳戶 必要。 選取受控識別將存取的 Azure 訂用帳戶名稱。
        服務連線的資源群組 選擇性。 輸入 以限制一個資源群組的受控識別存取。
      • 針對 [ 管理群組 ] 範圍,輸入下列參數:

        參數 描述
        管理群組 必要。 選取 Azure 管理群組。
      • 針對 機器學習 工作區範圍,輸入下列參數:

        參數 描述
        訂用帳戶 必要。 選取 Azure 訂用帳戶名稱。
        服務連線的資源群組 選擇性。 選取包含工作區的資源群組。
        ML 工作區工作區 必要。 輸入現有 Azure 機器學習 工作區的名稱。
    2. 在 [ 步驟 3:服務連線詳細數據: ] 區段中,輸入或選取下列參數:

      參數 描述
      服務連線名稱 必要。 您用來在工作屬性中參考此服務連線的名稱。 不是 Azure 訂用帳戶的名稱。
      服務管理參考 選擇性。 ITSM 資料庫中的內容資訊。
      說明 選擇性。 輸入服務連線的描述。
    3. 在 [安全性]段中,選取 [授與所有管線的訪問許可權] 以允許所有管線使用此服務連線。 如果您未選取此選項,則必須手動授與使用此服務連線之每個管線的存取權。

    4. 選取 [ 儲存 ] 以驗證並建立服務連線。

將既有的服務連線轉換為使用工作負載身份聯合認證

您可以快速轉換現有的 Azure Resource Manager 服務連線,以使用工作負載身分識別同盟進行驗證,而不是秘密。 如果您的服務連線符合下列需求,您可以在 Azure DevOps 中使用服務連線轉換工具:

  • Azure DevOps 原本已建立服務連線。 如果您手動建立服務連線,就無法使用服務連線轉換工具來轉換服務連線,因為 Azure DevOps 沒有修改自己的認證的許可權。
  • 只有一個專案會使用服務連線。 您無法轉換跨 專案服務 連線

若要轉換服務連線:

  1. 在 Azure DevOps 專案中,移至 [項目設定>服務連線]。

    如需詳細資訊,請參閱 開啟項目設定

  2. 選取您想要轉換成使用工作負載身分識別的服務連線。

  3. 選取轉換

    顯示針對同盟認證選取 [轉換] 的螢幕快照。

    如果您有具有過期密碼的現有認證,您會看到不同的轉換選項。

    顯示當您有過期憑證時,要轉換成使用同盟認證的選項的螢幕快照。

  4. 再次選取 [轉換 ] 以確認您想要建立新的服務連線。

    轉換可能需要幾分鐘的時間。 如果您想要還原連線,您必須在七天內還原連線。

使用腳本轉換多個服務連線

使用腳本一次更新多個服務連線,現在使用工作負載身分識別同盟進行驗證。

此範例 PowerShell 腳稿需要兩個參數:Azure DevOps 組織(例如: https://dev.azure.com/fabrikam-tailspin) 和 Azure DevOps 專案(範例: Space game web agent。 然後,腳本會擷取 Azure DevOps 專案和組織的相關服務連線。

將服務連線轉換為使用工作負載身分識別同盟時,系統會提示您確認每個連線尚未使用該聯機的更新。 確認後,腳本會透過 Azure DevOps REST API 更新這些服務連線,以利用工作負載身分識別同盟。

腳本需要 PowerShell 7.3 或更新版本Azure CLI 才能執行。 將腳本儲存至 .ps1 檔案,並使用PowerShell 7加以執行。

#!/usr/bin/env pwsh
<# 
.SYNOPSIS 
    Convert multiple Azure Resource Manager service connection(s) to use Workload identity federation

.LINK
    https://aka.ms/azdo-rm-workload-identity-conversion

.EXAMPLE
    ./convert_azurerm_service_connection_to_oidc_simple.ps1 -Project <project> -OrganizationUrl https://dev.azure.com/<organization>
#> 

#Requires -Version 7.3

param ( 
    [parameter(Mandatory=$true,HelpMessage="Name of the Azure DevOps Project")]
    [string]
    [ValidateNotNullOrEmpty()]
    $Project,

    [parameter(Mandatory=$true,HelpMessage="Url of the Azure DevOps Organization")]
    [uri]
    [ValidateNotNullOrEmpty()]
    $OrganizationUrl
) 
$apiVersion = "7.1"
$PSNativeCommandArgumentPassing = "Standard" 

#-----------------------------------------------------------
# Log in to Azure
$azdoResource = "499b84ac-1321-427f-aa17-267ca6975798" # application id of Azure DevOps 
az login --allow-no-subscriptions --scope ${azdoResource}/.default
$OrganizationUrl = $OrganizationUrl.ToString().Trim('/')

#-----------------------------------------------------------
# Retrieve the service connection
$getApiUrl = "${OrganizationUrl}/${Project}/_apis/serviceendpoint/endpoints?authSchemes=ServicePrincipal&type=azurerm&includeFailed=false&includeDetails=true&api-version=${apiVersion}"
az rest --resource $azdoResource -u "${getApiUrl} " -m GET --query "sort_by(value[?authorization.scheme=='ServicePrincipal' && data.creationMode=='Automatic' && !(isShared && serviceEndpointProjectReferences[0].projectReference.name!='${Project}')],&name)" -o json `
        | Tee-Object -Variable rawResponse | ConvertFrom-Json | Tee-Object -Variable serviceEndpoints | Format-List | Out-String | Write-Debug
if (!$serviceEndpoints -or ($serviceEndpoints.count-eq 0)) {
    Write-Warning "No convertible service connections found"
    exit 1
}

foreach ($serviceEndpoint in $serviceEndpoints) {
    # Prompt user to confirm conversion
    $choices = @(
        [System.Management.Automation.Host.ChoiceDescription]::new("&Convert", "Converting service connection '$($serviceEndpoint.name)'...")
        [System.Management.Automation.Host.ChoiceDescription]::new("&Skip", "Skipping service connection '$($serviceEndpoint.name)'...")
        [System.Management.Automation.Host.ChoiceDescription]::new("&Exit", "Exit script")
    )
    $prompt = $serviceEndpoint.isShared ? "Convert shared service connection '$($serviceEndpoint.name)'?" : "Convert service connection '$($serviceEndpoint.name)'?"
    $decision = $Host.UI.PromptForChoice([string]::Empty, $prompt, $choices, $serviceEndpoint.isShared ? 1 : 0)

    if ($decision -eq 0) {

        Write-Host "$($choices[$decision].HelpMessage)"
    } elseif ($decision -eq 1) {
        Write-Host "$($PSStyle.Formatting.Warning)$($choices[$decision].HelpMessage)$($PSStyle.Reset)"
        continue 
    } elseif ($decision -ge 2) {
        Write-Host "$($PSStyle.Formatting.Warning)$($choices[$decision].HelpMessage)$($PSStyle.Reset)"
        exit 
    }

    # Prepare request body
    $serviceEndpoint.authorization.scheme = "WorkloadIdentityFederation"
    $serviceEndpoint.data.PSObject.Properties.Remove('revertSchemeDeadline')
    $serviceEndpoint | ConvertTo-Json -Depth 4 | Write-Debug
    $serviceEndpoint | ConvertTo-Json -Depth 4 -Compress | Set-Variable serviceEndpointRequest
    $putApiUrl = "${OrganizationUrl}/${Project}/_apis/serviceendpoint/endpoints/$($serviceEndpoint.id)?operation=ConvertAuthenticationScheme&api-version=${apiVersion}"
    # Convert service connection
    az rest -u "${putApiUrl} " -m PUT -b $serviceEndpointRequest --headers content-type=application/json --resource $azdoResource -o json `
            | ConvertFrom-Json | Set-Variable updatedServiceEndpoint

    $updatedServiceEndpoint | ConvertTo-Json -Depth 4 | Write-Debug
    if (!$updatedServiceEndpoint) {
        Write-Debug "Empty response"
        Write-Error "Failed to convert service connection '$($serviceEndpoint.name)'"
        exit 1
    }
    Write-Host "Successfully converted service connection '$($serviceEndpoint.name)'"
}

還原使用機密的現有服務連線

您可以使用其秘密還原已轉換的自動服務連線七天。 七天后,手動建立新的秘密。

如果您手動建立和轉換服務連線,就無法使用服務連線轉換工具來還原服務連線,因為 Azure DevOps 沒有修改自己的認證的許可權。

若要還原服務連線:

  1. 在 Azure DevOps 專案中,移至 [管線>服務連線]。

  2. 選取要還原的現有服務連線。

  3. 選取 [ 還原轉換至原始配置]。

    顯示選取同盟認證的還原的螢幕快照。

  4. 再次選取 [ 還原 ] 以確認您的選擇。

建立使用現有服務主體的服務連線

如果您想要使用預先定義的一組訪問許可權,且尚未為此目的定義服務主體,請遵循下列其中一個教學課程來建立新的服務主體:

若要建立使用現有服務主體的服務連線:

  1. 在 Azure DevOps 專案中,移至 [項目設定>服務連線]。

    如需詳細資訊,請參閱 開啟項目設定

  2. 選取 [ 新增服務連線],然後選取 [Azure Resource Manager ] 和 [下一步]。

    顯示 Azure Resource Manager 選取項目的螢幕快照。

  3. 選取 [服務主體][手動][下一步]。

    顯示選取服務主體(手動)驗證方法選取的螢幕快照。

  4. 從 [ 新增 Azure 服務連線 ] 對話框中,選取 [ 環境]。 如果您選取 [Azure Stack],請輸入環境 URL,其類似 https://management.local.azurestack.external

  5. 選取 [ 範圍層級]。 選取 [訂用帳戶] 或 [管理群組]。 管理群組 是可協助您跨多個訂用帳戶管理存取、原則和合規性的容器。

    • 針對 [ 訂用帳戶 ] 範圍,輸入下列參數:

      參數 描述
      訂用帳戶標識碼 必要。 輸入 Azure 訂用帳戶標識碼。
      訂用帳戶名稱 必要。 輸入 Azure 訂用帳戶名稱。
    • 針對 [ 管理群組 ] 範圍,輸入下列參數:

      參數 描述
      管理群組標識碼 必要。 輸入 Azure 管理群組識別碼。
      管理組名 必要。 輸入 Azure 管理組名。
  6. 在 [ 驗證] 區段中,輸入或選取下列參數:

    參數 描述
    服務主體標識碼 必要。 輸入服務主體標識碼。
    認證 選取 [服務主體金鑰 ] 或 [憑證]。 如果您選取 [服務主體金鑰],請輸入金鑰(密碼)。 如果您選取 [ 憑證],請輸入憑證。
    租用戶標識碼 必要。 輸入用戶識別碼。
    Verify 選取即可驗證您輸入的設定。
  7. 在 [詳細數據] 區段中,輸入下列參數:

    參數 描述
    連線名稱 必要。 您用來在工作屬性中參考此服務連線的名稱。 不是 Azure 訂用帳戶的名稱。
    說明 選擇性。 輸入服務連線的描述。
    安全性 選取 [ 授與所有管線 的訪問許可權] 以允許所有管線使用此服務連線。 如果您未選取此選項,則必須手動授與使用此服務連線之每個管線的存取權。
  8. 選取 [驗證並儲存 ] 以驗證並建立服務連線。

  1. 在 Azure DevOps 專案中,移至 [項目設定>服務連線]。

    如需詳細資訊,請參閱 開啟項目設定

  2. 選取 [ 新增服務連線],然後選取 [Azure Resource Manager]。

    顯示 Azure Resource Manager 選取項目的螢幕快照。

  3. 在 [ 新增 Azure Resource Manager 服務連線 ] 對話框中,填入字段,如下所示:

    新增 Azure Resource Manager 服務連線的螢幕快照。

    1. 輸入 [ 連線名稱]。

    2. 選取 [ 環境]。 如果您選取 [Azure Stack],請輸入環境 URL,其類似 https://management.local.azurestack.external

    3. 選取 [範圍] 層級、[訂用帳戶] 或 [管理群組]。 管理群組 是可協助您跨多個訂用帳戶管理存取、原則和合規性的容器。

      • 針對 [ 訂用帳戶 ] 範圍,輸入下列參數:

        參數 描述
        訂用帳戶標識碼 必要。 輸入 Azure 訂用帳戶標識碼。
        訂用帳戶名稱 必要。 輸入 Azure 訂用帳戶名稱。
      • 針對 [ 管理群組 ] 範圍,輸入下列參數:

        參數 描述
        管理群組標識碼 必要。 輸入 Azure 管理群組識別碼。
        管理組名 必要。 輸入 Azure 管理組名。
    4. 輸入服務主體標識碼

    5. 選取認證類型:

      • 服務主體金鑰:輸入 服務主體金鑰 (密碼)。
      • 憑證:輸入 .perm 檔案的內容,包括憑證和私鑰區段。
    6. 輸入租用戶 標識碼

    7. 選取 [ 驗證連線 ] 以驗證服務連線。

    8. 選擇性地選取 [ 允許所有管線使用此聯機]。 如果您未選取此選項,則必須手動授與使用此服務連線之每個管線的存取權。

    9. 選取 [ 儲存 ] 以建立服務連線。

建立新的服務連線之後:

  • 如果您在 UI 中使用服務連線,請選取您在管線的 Azure 訂 用帳戶設定中指派的連線名稱。
  • 如果您在 YAML 檔案中使用服務連線,請複製連線名稱,並將它貼到程式碼中作為的值 azureSubscription

如有必要,請修改服務主體以公開適當的許可權。

如需使用服務主體進行驗證的詳細資訊,請參閱 使用角色型訪問控制來管理 Azure 訂用帳戶資源的 存取,或部落格文章 使用 Visual Studio 中的服務主體將 Azure 資源群組部署自動化。

如需詳細資訊,請參閱 針對 Azure Resource Manager 服務連線進行疑難解答。

說明與支援