Connessione ad Azure usando una connessione al servizio Azure Resource Manager

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

È possibile usare una connessione al servizio Azure Resource Manager per connettersi alle risorse di Azure tramite l'autenticazione dell'entità servizio o tramite un'identità del servizio gestita di Azure. Se si usa una connessione al servizio Resource Manager, è possibile usare una pipeline per eseguire la distribuzione in una risorsa di Azure, ad esempio un'app del servizio app Azure senza eseguire l'autenticazione ogni volta.

Sono disponibili più opzioni per la connessione ad Azure usando le connessioni al servizio Azure Resource Manager:

  • Entità servizio o identità gestita con federazione dell'identità del carico di lavoro
  • Entità servizio con segreto
  • Identità gestita assegnata dall'agente

Per informazioni su altri tipi di connessioni e per informazioni generali sulla creazione e l'uso delle connessioni, vedere Connessioni al servizio per build e versioni.

Creare una connessione al servizio Azure Resource Manager che usa la federazione dell'identità del carico di lavoro

La federazione dell'identità del carico di lavoro usa OpenID Connessione (OIDC) per eseguire l'autenticazione con le risorse protette di Microsoft Entra senza usare segreti.

È consigliabile usare questo approccio se tutti gli elementi seguenti sono veri per lo scenario:

  • Si ha il ruolo Proprietario per la sottoscrizione di Azure.
  • Non ci si connette ad Azure Stack o a un Azure per enti pubblici Cloud.
  • Tutte le attività delle estensioni del Marketplace usate vengono aggiornate per supportare la federazione delle identità del carico di lavoro.

Creare una nuova connessione al servizio federativo dell'identità del carico di lavoro

  1. Nel progetto Azure DevOps passare a Impostazioni progetto>Connessioni del servizio.

    Per altre informazioni, vedere Aprire le impostazioni del progetto.

  2. Selezionare Nuova connessione al servizio e quindi Selezionare Azure Resource Manager.

    Screenshot che mostra la scelta di un tipo di connessione del servizio identità del carico di lavoro.

  3. Selezionare Federazione dell'identità del carico di lavoro (automatica).

    Screenshot che mostra la selezione di un tipo di connessione del servizio identità del carico di lavoro.

  4. Specificare i seguenti parametri:

    Parametro Descrizione
    Abbonamento Selezionare una sottoscrizione di Azure esistente. Se non vengono visualizzate sottoscrizioni o istanze di Azure, vedere Risolvere i problemi relativi alle connessioni al servizio Azure Resource Manager.
    Gruppo di risorse Lasciare vuoto per consentire agli utenti di accedere a tutte le risorse definite all'interno della sottoscrizione. Per limitare l'accesso utente alle risorse, immettere un nome del gruppo di risorse. Gli utenti possono quindi accedere solo alle risorse definite per il gruppo di risorse.
    Nome connessione al servizio Obbligatorio. Nome usato per fare riferimento a questa connessione al servizio nelle proprietà dell'attività. Non il nome della sottoscrizione di Azure.
  5. Dopo aver creato la nuova connessione al servizio, copiare il nome della connessione e incollarlo nel codice come valore per azureSubscription.

  6. Per eseguire la distribuzione in una risorsa di Azure specifica, l'attività richiede più dati su tale risorsa. Passare alla risorsa nella portale di Azure e quindi copiare i dati nel codice. Ad esempio, per distribuire un'app Web, copiare il nome dell'app del servizio app Azure e incollarlo nel codice come valore per WebAppName.

Convertire una connessione al servizio Azure Resource Manager esistente per usare la federazione dell'identità del carico di lavoro

È possibile convertire rapidamente una connessione al servizio Azure Resource Manager esistente per usare la federazione dell'identità del carico di lavoro per l'autenticazione anziché un'entità servizio. È possibile usare lo strumento di conversione della connessione al servizio in Azure DevOps se la connessione al servizio soddisfa questi requisiti:

  • Azure DevOps ha originariamente creato la connessione al servizio. Se si crea manualmente la connessione al servizio, non è possibile convertire la connessione al servizio usando lo strumento di conversione della connessione al servizio perché Azure DevOps non dispone delle autorizzazioni per modificare le proprie credenziali.
  • Solo un progetto usa la connessione al servizio. Non è possibile convertire connessioni tra servizio di progetto.

Per convertire una connessione al servizio:

  1. Nel progetto Azure DevOps passare a Impostazioni progetto>Connessioni del servizio.

    Per altre informazioni, vedere Aprire le impostazioni del progetto.

  2. Selezionare la connessione al servizio da convertire per usare l'identità del carico di lavoro.

  3. Seleziona Converti.

    Screenshot che mostra la selezione della conversione per le credenziali federate.

    Se si dispone di una credenziale dell'entità servizio esistente con un segreto scaduto, verrà visualizzata un'opzione diversa da convertire.

    Screenshot che mostra l'opzione per la conversione per l'uso delle credenziali federate quando si dispone di un certificato scaduto.

  4. Selezionare di nuovo Converti per confermare di voler creare una nuova connessione al servizio.

    La conversione potrebbe richiedere alcuni minuti. Se si desidera ripristinare la connessione, è necessario ripristinarla entro sette giorni.

Convertire più connessioni al servizio Azure Resource Manager con uno script

Usare uno script per aggiornare più connessioni al servizio contemporaneamente per usare ora la federazione dell'identità del carico di lavoro per l'autenticazione.

Questo script di PowerShell di esempio richiede due parametri: l'organizzazione Azure DevOps (ad esempio) https://dev.azure.com/fabrikam-tailspine il progetto Azure DevOps (ad esempio: Space game web agent). Lo script recupera quindi le connessioni al servizio associate per il progetto e l'organizzazione di Azure DevOps. Verrà chiesto di confermare che si vuole convertire ogni connessione al servizio associata che non usa la federazione dell'identità del carico di lavoro. Se si conferma, lo script usa l'API REST di Azure DevOps per aggiornare ogni connessione al servizio per usare ora la federazione dell'identità del carico di lavoro. Lo script richiede l'esecuzione di PowerShell 7.3 o versione successiva e dell'interfaccia della riga di comando di Azure. Salvare lo script in un file con estensione ps1 ed eseguirlo usando 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)'"
}

Ripristinare una connessione al servizio Azure Resource Manager esistente che usa un segreto dell'entità servizio

È possibile ripristinare una connessione automatica del servizio convertita con il relativo segreto per sette giorni. Dopo sette giorni, creare manualmente un nuovo segreto.

Se si crea e si converte manualmente la connessione al servizio, non è possibile ripristinare la connessione al servizio usando lo strumento di conversione della connessione al servizio perché Azure DevOps non dispone delle autorizzazioni per modificare le proprie credenziali.

Per ripristinare una connessione al servizio:

  1. Nel progetto Azure DevOps passare a Connessioni al>servizio pipeline.

  2. Selezionare una connessione al servizio esistente da ripristinare.

  3. Selezionare Ripristina conversione nello schema originale.

    Screenshot che mostra la selezione di ripristino per una credenziale federata.

  4. Selezionare Di nuovo Ripristina per confermare la scelta.

Creare una connessione al servizio Azure Resource Manager che usa un segreto dell'entità servizio

È consigliabile usare questo approccio se tutti gli elementi seguenti sono veri per lo scenario:

  • L'accesso è stato eseguito come proprietario dell'organizzazione di Azure Pipelines e della sottoscrizione di Azure.
  • Non è necessario limitare ulteriormente le autorizzazioni per le risorse di Azure a cui gli utenti accedono tramite la connessione al servizio.
  • Non ci si connette ad Azure Stack o a un Azure per enti pubblici Cloud.
  • Non ci si connette da Azure DevOps Server 2019 o versioni precedenti di Team Foundation Server .

Per creare la connessione al servizio:

  1. Nel progetto Azure DevOps passare a Impostazioni progetto>Connessioni del servizio.

    In Team Foundation Server selezionare l'icona Impostazioni nella barra dei menu superiore per passare alla pagina Servizi.

    Per altre informazioni, vedere Aprire le impostazioni del progetto.

  2. Selezionare Nuova connessione al servizio e quindi Selezionare Azure Resource Manager.

    Screenshot che mostra la scelta di un tipo di connessione del servizio.

  3. Immettere o selezionare i parametri seguenti:

    Parametro Descrizione
    Nome connessione Obbligatorio. Nome usato per fare riferimento a questa connessione al servizio nelle proprietà dell'attività. Non il nome della sottoscrizione di Azure.
    Livello di ambito Selezionare Sottoscrizione o Gruppo di gestione. I gruppi di gestione sono contenitori che consentono di gestire l'accesso, i criteri e la conformità tra più sottoscrizioni.
    Abbonamento Se si seleziona Sottoscrizione per l'ambito, selezionare una sottoscrizione di Azure esistente. Se non vengono visualizzate sottoscrizioni o istanze di Azure, vedere Risolvere i problemi relativi alle connessioni al servizio Azure Resource Manager.
    Gruppo di gestione Se si seleziona Gruppo di gestione per l'ambito, selezionare un gruppo di gestione di Azure esistente. Per altre informazioni, vedere Creare gruppi di gestione.
    Gruppo di risorse Lasciare vuoto per consentire agli utenti di accedere a tutte le risorse definite all'interno della sottoscrizione. Per limitare l'accesso utente alle risorse, immettere un nome del gruppo di risorse. Gli utenti possono quindi accedere solo alle risorse definite per il gruppo di risorse.
  4. Dopo aver creato la nuova connessione al servizio:

    • Se si usa l'editor classico, selezionare il nome della connessione assegnato nell'impostazione della sottoscrizione di Azure della pipeline.
    • Se si usa un file YAML, copiare il nome della connessione nel codice come valore per azureSubscription.
  5. Per eseguire la distribuzione in una risorsa di Azure specifica, aggiungere altre informazioni sulla risorsa all'attività:

    • Se si usa l'editor classico, selezionare i dati da aggiungere all'attività. Ad esempio, selezionare il nome servizio app.
    • Se si usa un file YAML, passare alla risorsa nella portale di Azure. Copiare i dati necessari e incollarli nel codice dell'attività. Ad esempio, per distribuire un'app Web, copiare il nome dell'app servizio app e incollarlo come valore per WebAppName nell'attività YAML.

Nota

Quando si segue questo approccio, Azure DevOps si connette con Microsoft Entra ID e crea una registrazione dell'app con un segreto valido per tre mesi. Quando la connessione al servizio sta per scadere, microsoft Entra ID visualizza questa richiesta: un certificato o un segreto sta per scadere a breve. Crearne uno nuovo. In questo scenario è necessario aggiornare la connessione al servizio.

Per aggiornare una connessione al servizio, nel portale di Azure DevOps modificare la connessione e quindi selezionare Verifica. Dopo aver salvato la modifica, la connessione al servizio è valida per altri tre mesi.

È consigliabile usare la federazione delle identità del carico di lavoro anziché creare un segreto. Se si usa la federazione delle identità del carico di lavoro, non è necessario ruotare i segreti e la registrazione dell'app mantiene lo scopo previsto. Per iniziare a usare la federazione dell'identità del carico di lavoro, passare alla pagina dei dettagli della connessione del servizio e selezionare Converti. La connessione al servizio viene convertita in modo da usare la federazione dell'identità del carico di lavoro anziché un segreto. Per altre informazioni, vedere Convertire una connessione al servizio Azure Resource Manager esistente per usare la federazione delle identità del carico di lavoro.

Per altre informazioni, vedere Risolvere i problemi di una connessione al servizio Azure Resource Manager.

Se si verificano problemi con questo approccio, ad esempio senza sottoscrizioni visualizzate nell'elenco a discesa, o se si desidera limitare ulteriormente le autorizzazioni utente, è possibile usare invece un'entità servizio o una macchina virtuale con un'identità del servizio gestita.

Creare una connessione al servizio Azure Resource Manager che usa un'entità servizio esistente

  1. Se si vuole usare un set predefinito di autorizzazioni di accesso e non si dispone già di un'entità servizio definita a questo scopo, seguire una di queste esercitazioni per creare una nuova entità servizio:

  2. Nel progetto Azure DevOps passare a Impostazioni progetto>Connessioni del servizio.

    In Team Foundation Server selezionare l'icona Impostazioni nella barra dei menu superiore per passare alla pagina Servizi.

    Per altre informazioni, vedere Aprire le impostazioni del progetto.

  3. Selezionare Nuova connessione al servizio e quindi Selezionare Azure Resource Manager.

    Screenshot che mostra la scelta di un tipo di connessione del servizio.

  4. Selezionare l'opzione Entità servizio (manuale) e quindi immettere i dettagli dell'entità servizio.

    Screenshot che mostra l'apertura della versione completa della finestra di dialogo del servizio.

  5. Per Connessione nome immettere un nome visualizzato da usare per fare riferimento a questa connessione al servizio.

  6. In Ambiente selezionare il nome dell'ambiente (Cloud di Azure, Azure Stack o Azure per enti pubblici Cloud).

  7. Se non si seleziona Cloud di Azure, immettere l'URL dell'ambiente. Per Azure Stack, l'URL dell'ambiente è simile a https://management.local.azurestack.external.

  8. Per Livello ambito selezionare l'ambito per la connessione:

    • Se si seleziona Sottoscrizione, selezionare una sottoscrizione di Azure esistente. Se non vengono visualizzate sottoscrizioni o istanze di Azure, vedere Risolvere i problemi relativi alle connessioni al servizio Azure Resource Manager.
    • Se si seleziona Gruppo di gestione, selezionare un gruppo di gestione di Azure esistente. Per altre informazioni, vedere Creare gruppi di gestione.
  9. Nella finestra di dialogo Sottoscrizione di Azure immettere le informazioni seguenti sull'entità servizio:

    • ID sottoscrizione
    • Nome della sottoscrizione
    • ID entità servizio
    • La chiave client dell'entità servizio o, se è stata selezionata l'opzione Certificato, immettere il contenuto sia del certificato che delle sezioni della chiave privata del file *.pem .
    • ID tenant

    È possibile ottenere queste informazioni scaricando ed eseguendo uno script di Azure PowerShell. Quando viene richiesto, immettere il nome della sottoscrizione, la password, il ruolo (facoltativo) e il tipo di cloud, ad esempio Cloud di Azure (impostazione predefinita), Azure Stack o un cloud Azure per enti pubblici.

  10. Selezionare Verifica connessione per convalidare le impostazioni immesse.

  11. Dopo aver creato la nuova connessione al servizio:

    • Se si usa la connessione al servizio nell'interfaccia utente, selezionare il nome della connessione assegnato nell'impostazione della sottoscrizione di Azure della pipeline.
    • Se si usa la connessione al servizio in un file YAML, copiare il nome della connessione e incollarlo nel codice come valore per azureSubscription.
  12. Se necessario, modificare l'entità servizio per esporre le autorizzazioni appropriate.

    Per altre informazioni sull'autenticazione tramite un'entità servizio, vedere Usare il controllo degli accessi in base al ruolo per gestire l'accesso alle risorse della sottoscrizione di Azure o il post di blog Automatizzare una distribuzione di un gruppo di risorse di Azure usando un'entità servizio in Visual Studio.

Per altre informazioni, vedere Risolvere i problemi relativi alle connessioni al servizio Azure Resource Manager.

Creare una connessione al servizio Azure Resource Manager a una macchina virtuale che usa un'identità del servizio gestita

Nota

Per usare un'identità del servizio gestita per l'autenticazione, è necessario usare un agente self-hosted in una macchina virtuale di Azure.

È possibile configurare agenti basati su macchine virtuali di Azure per l'uso di un'identità del servizio gestita di Azure in Microsoft Entra ID. In questo scenario si usa l'identità assegnata dal sistema (entità servizio) per concedere agli agenti basati su macchine virtuali di Azure l'accesso a qualsiasi risorsa di Azure che supporti l'ID Microsoft Entra, ad esempio un'istanza di Azure Key Vault, anziché rendere persistenti le credenziali in Azure DevOps per la connessione.

  1. Nel progetto Azure DevOps passare a Impostazioni progetto>Connessioni del servizio.

    In Team Foundation Server selezionare l'icona Impostazioni nella barra dei menu superiore per passare alla pagina Servizi.

    Per altre informazioni, vedere Aprire le impostazioni del progetto.

  2. Selezionare Nuova connessione al servizio e quindi Selezionare Azure Resource Manager.

    Screenshot che mostra la scelta di un tipo di connessione del servizio.

  3. Selezionare l'opzione Autenticazione identità gestita.

    Screenshot che mostra l'accesso alle impostazioni dell'identità del servizio gestito.

  4. Per Connessione nome, immettere un nome visualizzato da usare quando si fa riferimento a questa connessione al servizio.

  5. In Ambiente selezionare il nome dell'ambiente (Cloud di Azure, Azure Stack o Azure per enti pubblici Cloud).

  6. Nella finestra di dialogo Connessioni immettere i valori seguenti della sottoscrizione:

    • ID sottoscrizione
    • Nome della sottoscrizione
    • ID tenant
  7. Dopo aver creato la nuova connessione al servizio:

    • Se si usa la connessione al servizio nell'interfaccia utente, selezionare il nome della connessione assegnato nell'impostazione della sottoscrizione di Azure della pipeline.
    • Se si usa la connessione al servizio in un file YAML, copiare il nome della connessione nel codice come valore per azureSubscription.
  8. Assicurarsi che la macchina virtuale (agente) disponga delle autorizzazioni appropriate.

    Ad esempio, se il codice deve chiamare Azure Resource Manager, assegnare alla macchina virtuale il ruolo appropriato usando il controllo degli accessi in base al ruolo in Microsoft Entra ID.

    Per altre informazioni, vedere Come è possibile usare le identità gestite per le risorse di Azure? e Usare il controllo degli accessi in base al ruolo per gestire l'accesso alle risorse della sottoscrizione di Azure.

Per altre informazioni sul processo, vedere Risolvere i problemi relativi alle connessioni al servizio Azure Resource Manager.

Connessione a un cloud Azure per enti pubblici

Per informazioni sulla connessione a un cloud di Azure per enti pubblici, vedere Connessione da Azure Pipelines (Azure per enti pubblici Cloud).

Connettersi ad Azure Stack

Per informazioni sulla connessione ad Azure Stack, vedere gli articoli seguenti:

Assistenza e supporto