Accedere a una cassaforte di chiavi privata dalla tua pipeline

Azure Key Vault offre una soluzione sicura per la gestione di credenziali, ad esempio chiavi, segreti e certificati, con sicurezza senza problemi. Con Azure Pipelines, è possibile semplificare il processo di accesso e utilizzo di Azure Key Vault per archiviare e recuperare le credenziali.

In alcuni scenari, le organizzazioni assegnano priorità alla sicurezza limitando l'accesso agli insiemi di chiavi esclusivamente alle reti virtuali di Azure designate per garantire il massimo livello di sicurezza per le applicazioni critiche.

In questa esercitazione apprenderai a:

  • Creare un'entità principale del servizio.
  • Creare una connessione al servizio.
  • Configurare i punti di accesso in ingresso.
  • Interroga un Azure Key Vault privato dalla tua pipeline.

Prerequisiti

  • Un'organizzazione Di Azure DevOps e un progetto. Creare un'organizzazione o un progetto, se non è già stato fatto.
  • Una sottoscrizione di Azure. Creare un account Azure gratuito se non ne è già disponibile uno.
  • Un insieme di credenziali delle chiavi di Azure. Creare un nuovo Key Vault di Azure se non ne esiste già uno.

Accedere a un archivio di chiavi privato

Gli sviluppatori possono usare Azure Pipelines per collegare un Azure Key Vault a un gruppo di variabili e mappare i segreti selezionati del vault. È possibile accedere al vault delle chiavi usato come gruppo di variabili:

  • Da Azure DevOps, durante il tempo di configurazione del gruppo di variabili.
  • Da un agente self-hosted, durante il runtime del processo della pipeline.

Diagramma che mostra i diversi percorsi per accedere a un vault di chiavi private.

Creare un'entità servizio

Per iniziare, creare una nuova entità servizio in modo da poter accedere alle risorse Azure. Successivamente, è necessario creare una nuova connessione al servizio Azure Resource Manager in Azure DevOps. Configurare quindi una credenziale federata per il principal del servizio in Azure prima di verificare e salvare la connessione del servizio in Azure DevOps.

  1. Vai al portale di Azure.

  2. Nel menu del servizio aprire Azure Cloud Shell e quindi selezionare Bash.

  3. Eseguire il comando seguente per creare un nuovo principale del servizio:

    az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
    
  4. Assicurarsi di copiare l'output perché viene usato per creare la connessione al servizio nel passaggio successivo.

Creare una connessione al servizio

  1. Accedere all'organizzazione di Azure DevOps e quindi passare al progetto.

  2. Selezionare > al servizio.

  3. Selezionare Azure Resource Manager, quindi selezionare Avanti.

  4. In Tipo di identità selezionare Registrazione app (automatica) dal menu a discesa.

  5. Per Credenziale, lascia il valore predefinito consigliato a federazione dell'identità del carico di lavoro.

  6. Per Livello ambito selezionare Sottoscrizione e quindi selezionare la sottoscrizione dal menu a discesa.

  7. Selezionare un gruppo di risorse se si vuole limitare l'accesso solo al gruppo di risorse specificato.

  8. Immettere un nome per la connessione al servizio e quindi selezionare la casella di controllo Concedi l'autorizzazione di accesso a tutte le pipeline per consentire a tutte le pipeline di usare questa connessione al servizio.

  9. Seleziona Salva.

    Screenshot che illustra come configurare una connessione al servizio Azure Resource Manager per un'entità servizio.

Creare una credenziale federata

  1. Passare al portale Azure, inserire l'ID client del principal del servizio nella barra di ricerca e quindi selezionare l'applicazione.

  2. In Gestisci, selezionare Certificati e segreti>Federated credentials.

  3. Selezionare Aggiungi credenziali e quindi per Scenario di credenziali federate selezionare Altro emittente.

  4. Per Issuer, incollare l'URL seguente per sostituire il segnaposto con il GUID dell'organizzazione. Per trovare l'ID organizzazione, passare a Organization settings>Microsoft Entra. Scaricare l'elenco delle organizzazioni Azure DevOps connesse alla directory.

    https://login.microsoftonline.com/<TENANT_ID>/v2.0
    
  5. In Identificatore oggetto incollare l'URL seguente. Sostituire i segnaposto con il nome dell'organizzazione, il nome del progetto e il nome della connessione al servizio.

    ENTRA_PREFIX/sc/ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
    
  6. Immettere un nome per le credenziali federate e quindi selezionare Aggiungi.

Creare una connessione al servizio

  1. Accedere all'organizzazione di Azure DevOps e quindi passare al progetto.

  2. Selezionare > al servizio.

  3. Selezionare Azure Resource Manager>Next e quindi selezionare Service principal (manual)>Next.

  4. Per Environment, selezionare Azure Cloud e per livello, selezionare Subscription. Immettere quindi l'ID sottoscrizione e il nome della sottoscrizione.

  5. Inserisci le informazioni sull'entità del servizio e quindi seleziona Verifica.

  6. Dopo aver completato la verifica, assegnare un nome alla connessione al servizio, aggiungere una descrizione e quindi selezionare la casella di controllo Concedi autorizzazione di accesso a tutte le pipeline . Selezionare Verifica e salva.

Suggerimento

Se non è possibile verificare la connessione del principale del servizio, concedere al principale del servizio l'accesso Lettore alla sottoscrizione.

Accedere a un archivio di chiavi private da Azure DevOps

In questa sezione, esaminiamo due metodi per accedere a un insieme di credenziali chiavi privato da Azure DevOps. Prima di tutto, si usano gruppi di variabili per collegare e mappare i segreti dal Key Vault, seguito dalla configurazione dell'accesso in ingresso consentendo intervalli IP statici. Stabiliamo l'accesso in ingresso perché Azure Pipelines utilizza l'indirizzo IP pubblico di Azure DevOps pubblicato per eseguire query sul Key Vault di Azure da un gruppo di variabili. Aggiungendo connessioni inbound al firewall del Key Vault, è possibile connettersi correttamente al Key Vault di Azure.

Per il secondo approccio, dimostriamo l'aggiunta dinamica dell'indirizzo IP dell'agente ospitato da Microsoft all'elenco di indirizzi consentiti del firewall della cassetta di sicurezza delle chiavi, l'interrogazione della cassetta di sicurezza delle chiavi e successivamente la rimozione dell'indirizzo IP dopo il completamento. Questo secondo approccio è solo a scopo dimostrativo. Questo approccio non è consigliato per Azure Pipelines.

Passaggio 1: Mappare i segreti dell'insieme di credenziali del Key Vault con un gruppo di variabili

  1. Accedere all'organizzazione di Azure DevOps e quindi passare al progetto.

  2. Selezionare Pipeline>Libreria, e quindi selezionare + Gruppo di variabili.

  3. Assegna un nome al gruppo di variabili e quindi attiva Collega i segreti da un Azure Key Vault come variabile.

  4. Selezionare la connessione al servizio creata in precedenza, selezionare il tuo Key Vault, e quindi selezionare Autorizza.

  5. In Variabili selezionare Aggiungi per aggiungere il segreto e quindi selezionare Salva.

Nota

Assicurarsi che la connessione al servizio disponga delle autorizzazioni Get e List e che al principal del servizio sia assegnato il ruolo Key Vault Secrets User nel Key Vault privato.

Passaggio 1.1: Configurare le autorizzazioni di connessione del servizio

  1. Vai al tuo vault delle chiavi di Azure e quindi seleziona Criteri di accesso.

  2. Selezionare Crea e in Autorizzazioni segrete aggiungere le autorizzazioni Recupera ed Elenco e quindi selezionare Avanti.

  3. Aggiungere la connessione al servizio nella barra di ricerca, selezionarla e quindi selezionare Avanti.

  4. Selezionare Avanti ancora una volta, rivedere le impostazioni e quindi selezionare Rivedi e crea.

Passaggio 1.2: Configurare le autorizzazioni del principale del servizio

  1. Vai al tuo Key Vault di Azure e quindi seleziona Controllo di accesso (IAM).

  2. Selezionare Aggiungi>Assegnazione di ruolo, e quindi selezionare la scheda Ruolo.

  3. Selezionare "Utente dei segreti dell'insieme delle chiavi" e quindi selezionare Avanti.

  4. Scegli Seleziona membri, aggiungi il principale del servizio e scegli Seleziona.

  5. Seleziona Rivedi + assegna.

  1. Accedere all'organizzazione di Azure DevOps e quindi passare al progetto.

  2. Selezionare Pipeline>Libreria, e quindi selezionare + Gruppo di variabili.

  3. Assegnare un nome al gruppo di variabili e quindi attivare Collegare i segreti da un Key Vault di Azure come variabile.

  4. Seleziona la connessione al servizio Azure che hai creato in precedenza dal menu a discesa, quindi seleziona il Key Vault.

    Screenshot che mostra come collegare un gruppo di variabili a un Key Vault di Azure con un errore che indica le autorizzazioni Get e List mancanti.

  5. È possibile che venga visualizzato il messaggio di errore "La connessione al servizio Azure specificata deve avere "Get, List" autorizzazioni di gestione segreti sulla Key Vault selezionata." Vai alla tua Key Vault nel portale di Azure e seleziona Controllo di accesso (IAM)>Aggiungi assegnazione di ruolo>utente di segreti del Key Vault>Avanti. Aggiungere il principale del servizio e quindi selezionare Rivedi e assegna.

    Screenshot che illustra come aggiungere un'entità servizio come utente segreto per un Azure key vault.

  6. Aggiungere i segreti e quindi selezionare Salva.

Passaggio 2: Configurare l'accesso in ingresso da Azure DevOps

Per abilitare l'accesso al vault delle chiavi da Azure DevOps, è necessario concedere l'accesso da specifici intervalli IP statici. La posizione geografica dell'organizzazione Azure DevOps determina questi intervalli.

  1. Accedi alla tua organizzazione di Azure DevOps.

  2. Seleziona Impostazioni organizzazione.

  3. Passare a Panoramica per trovare la posizione geografica.

    Screenshot che mostra come trovare la posizione geografica dell'organizzazione di Azure DevOps.

  4. Trova gli intervalli IP V4 per area geografica.

    Importante

    Per le connessioni in ingresso negli Stati Uniti, assicurarsi di aggiungere gli intervalli IP per tutte le regioni degli Stati Uniti.

  5. Configura il Key Vault per consentire l'accesso da intervalli IP statici.

Passaggio 3: Eseguire query su un vault delle chiavi privato con un gruppo di variabili

In questo esempio, si usa il gruppo di variabili configurato in precedenza e autorizzato con un principale del servizio per eseguire query e copiare il segreto dal Key Vault di Azure privato per usare il gruppo di variabili collegato. Azure Pipelines utilizza l'indirizzo IP pubblico inviato quando interroga Azure Key Vault a partire da un gruppo di variabili, quindi assicurati di aver configurato l'accesso in ingresso affinché questa azione funzioni correttamente.

variables:
-  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Metodo alternativo: autorizzare dinamicamente l'IP dell'agente ospitato da Microsoft

In questo secondo approccio si esegue una richiesta sull'indirizzo IP dell'agente ospitato da Microsoft fin dall'inizio della pipeline. Quindi, aggiungerlo all'elenco di autorizzazioni del Key Vault. Procedere con le attività rimanenti e quindi rimuovere l'indirizzo IP dall'elenco di indirizzi consentiti del firewall del key vault.

Nota

Questo approccio è solo a scopo dimostrativo. Questo approccio non è consigliato per Azure Pipelines.

- task: AzurePowerShell@5
  displayName: 'Allow agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
     Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
     echo "##vso[task.setvariable variable=agentIP]ip"

- task: AzureKeyVault@2
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    KeyVaultName: 'YOUR_KEY_VAULT_NAME'
    SecretsFilter: '*'
    RunAsPreJob: false

- task: AzurePowerShell@5
  displayName: 'Remove agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ipRange = $env:agentIP + "/32"
     Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
  condition: succeededOrFailed()

Importante

Assicurati che il principale del servizio utilizzato per accedere al key vault nella tua pipeline possieda il ruolo di Collaboratore di Key Vault all'interno del controllo di accesso (IAM) del key vault.

Accedere a un archivio di chiavi privato da un agente autogestito

Per accedere a un insieme di credenziali delle chiavi private da un agente Azure Pipelines, è necessario usare un agente self-hosted (Windows, Linux o Mac) o agenti di set di scalabilità di macchine virtuali. Questo requisito si deve al fatto che gli agenti ospitati di Microsoft, come altri servizi di calcolo generici, non sono inclusi nell'elenco dei servizi attendibili.

Per stabilire la connettività con il tuo deposito di chiavi privato, è necessario configurare un endpoint privato per il tuo deposito di chiavi in modo da fornire una connettività a visibilità diretta. Questo endpoint deve essere instradabile e avere il nome del Sistema dei Nomi di Dominio privato risolvibile dall'agente della pipeline auto-ospitata.

Passaggio 1: Configurare l'accesso in entrata da un agente ospitato in locale

  1. Seguire le istruzioni per creare una rete virtuale.

  2. Nel portale Azure, utilizza la barra di ricerca nella parte superiore della pagina per trovare il tuo servizio Azure Key Vault.

  3. Selezionare l'insieme di credenziali delle chiavi e quindi passare a Impostazioni>rete.

  4. Selezionare Connessioni endpoint privato e quindi selezionare Crea per creare un nuovo endpoint privato.

    Screenshot che mostra come creare una nuova connessione endpoint privata per un Azure Key Vault.

  5. Selezionare il gruppo di risorse che ospita la rete virtuale creata in precedenza. Immettere un nome e un nome di interfaccia di rete per l'istanza e assicurarsi di selezionare la stessa area della rete virtuale creata in precedenza. Seleziona Avanti.

    Screenshot che illustra come configurare la scheda Base quando si crea una nuova istanza dell'endpoint privato per l'Azure Key Vault.

  6. Per il metodo di connessione, selezionare Connetti a una risorsa di Azure nella mia directory. Per Tipo di risorsa scegliere Microsoft. KeyVault/vaults dal menu a discesa. Selezionare la risorsa dal menu a discesa. La sotto-risorsa di destinazione viene popolata automaticamente con il valore vault. Seleziona Avanti.

    Screenshot che mostra come configurare la scheda Risorse quando si crea una nuova istanza di endpoint privato per l'Azure Key Vault.

  7. Nella scheda Rete virtuale selezionare il virtual network e la subnet creati in precedenza e lasciare il resto dei campi come predefinito. Seleziona Avanti.

  8. Accettare le impostazioni predefinite nelle schede DNS e Tag . Nella scheda Rivedi e crea selezionare Crea.

  9. Dopo aver distribuito la risorsa, passare al Key Vault e selezionare Impostazioni>Rete>Connessioni endpoint private. L'endpoint privato deve essere elencato con stato Connessioneapprovato. Se si collega a una risorsa Azure in una directory diversa, è necessario attendere che il proprietario della risorsa approvi la richiesta di connessione.

    Screenshot che mostra una connessione di private endpoint approvata

Passaggio 2: Consentire la rete virtuale

  1. Vai al portale di Azure, quindi individua il tuo Azure Key Vault.

  2. Selezionare Impostazioni>Rete, e assicurarsi di essere nella scheda Firewall e reti virtuali.

  3. Selezionare Aggiungi una rete>virtuale Aggiungi reti virtuali esistenti.

  4. Selezionare la sottoscrizione dal menu a discesa, selezionare la rete virtuale creata in precedenza e quindi selezionare le subnet.

  5. Selezionare Aggiungi e quindi scorrere fino alla fine della pagina e selezionare Applica per salvare le modifiche.

    Schermata che mostra come aggiungere una rete virtuale esistente al firewall del Key Vault.

Passaggio 3: Eseguire query su un insieme di credenziali delle chiavi privato da un agente self-hosted

L'esempio seguente utilizza un agente configurato sulla macchina virtuale della rete virtuale per eseguire query sull'archivio delle chiavi private tramite il gruppo di variabili:

pool: Self-hosted-pool

variables:
  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Se non si desidera concedere a Azure DevOps l'accesso in ingresso al key vault privato, è possibile utilizzare l'attività AzureKeyVault per interrogare il key vault. È necessario assicurarsi di consentire l'accesso alla rete virtuale che ospita l'agente nelle impostazioni del firewall del key vault.

pool: Self-hosted-pool

steps:
- task: AzureKeyVault@2
  inputs:
    azureSubscription: '$(SERVICE_CONNECTION_NAME)'
    keyVaultName: $(KEY_VAULT_NAME)
    SecretsFilter: '*'

- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Risoluzione dei problemi

Se si verificano gli errori seguenti, seguire la procedura descritta in questa sezione per risolvere il problema:

  • Public network access is disabled and request is not from a trusted service nor via an approved private link.

    Questo errore indica che l'accesso pubblico è stato disabilitato e che non sono state configurate eccezioni del firewall e una connessione endpoint privato. Segui i passaggi sotto Configurare l'accesso in ingresso da un agente self-hosted e Configurare l'accesso in ingresso da Azure DevOps per configurare l'accesso al tuo archivio chiavi privato.

  • Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>

    Questo messaggio di errore indica che l'accesso pubblico del key vault è stato disabilitato e che l'opzione Allow trusted servizi Microsoft to bypass this firewall è stata lasciata vuota, ma l'indirizzo IP del client non è stato aggiunto al firewall del key vault. Passare al Key Vault nel portale di Azure, selezionare Impostazioni>Networking e quindi aggiungere l'IP client all'elenco di permessi del firewall.

  • Error: Client address is not authorized and caller is not a trusted service.

    Assicurarsi di aggiungere gli intervalli IPV4 dell'area geografica all'elenco di autorizzazione del Key Vault. Per altre informazioni, vedere Configurare l'accesso in ingresso da Azure DevOps.

    In alternativa, puoi passare a Consentire dinamicamente gli IP dell'agente ospitato da Microsoft per imparare come aggiungere l'IP client al firewall del Key Vault durante il runtime.