Accedere a un insieme di credenziali delle chiavi privato dalla pipeline
Azure Key Vault offre una soluzione sicura per la gestione di credenziali, ad esempio chiavi, segreti e certificati, con sicurezza senza problemi. Usando Azure Pipelines, è possibile semplificare il processo di accesso e uso degli insiemi di credenziali delle chiavi, semplificando l'archiviazione e il recupero delle credenziali.
In alcuni scenari, le organizzazioni assegnano priorità alla sicurezza limitando l'accesso agli insiemi di credenziali delle chiavi esclusivamente alle reti virtuali di Azure designate per garantire il massimo livello di sicurezza per le applicazioni critiche.
La presente esercitazione include informazioni su come:
- Creare un'entità servizio
- Creare una connessione al servizio
- Configurare i punti di accesso in ingresso
- Eseguire query su un insieme di credenziali delle chiavi di Azure privato dalla 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. Se non è già stato fatto, creare un nuovo insieme di credenziali delle chiavi di Azure.
Accedere a un insieme di credenziali delle chiavi privato
Azure Pipelines consente agli sviluppatori di collegare un insieme di credenziali delle chiavi di Azure a un gruppo di variabili ed eseguire il mapping dei segreti selettivi dell'insieme di credenziali. È possibile accedere a un insieme di credenziali 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.
Creare un'entità servizio
Per iniziare, creare una nuova entità servizio, che consentirà di accedere alle risorse di Azure. Successivamente, sarà necessario creare una nuova connessione al servizio ARM in Azure DevOps, quindi configurare una credenziale federata per l'entità servizio in Azure prima di verificare e salvare la connessione al servizio in Azure DevOps.
Passare al portale di Azure.
Aprire Cloud Shell dalla barra dei menu e quindi selezionare Bash.
Eseguire il comando seguente per creare una nuova entità servizio:
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
Assicurarsi di copiare l'output, perché verrà usato per creare la connessione al servizio nel passaggio successivo.
Creare una connessione al servizio
Accedere all'organizzazione di Azure DevOps e passare al progetto.
Selezionare Impostazioni progetto>Connessioni>al servizio Nuova connessione al servizio.
Selezionare Azure Resource Manager e quindi avanti.
Per Tipo di identità selezionare Registrazione app (automatica) dal menu a discesa.
Per Credenziali lasciare il valore consigliato predefinito: Federazione dell'identità del carico di lavoro.
Per Livello ambito selezionare **Sottoscrizione e quindi selezionare la sottoscrizione dal menu a discesa.
Selezionare un gruppo di risorse se si vuole limitare l'accesso solo al gruppo di risorse specificato.
Specificare 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.
Al termine, seleziona Salva.
Creare credenziali federate
In Gestisci selezionare Certificati e segreti>Credenziali federate.
Selezionare Aggiungi credenziali e quindi per Scenario di credenziali federate selezionare Altro emittente.
Per Issuer (Autorità di certificazione) incollare l'URL seguente sostituendo il segnaposto con il GUID dell'organizzazione. È possibile trovare l'ID organizzazione passando a Impostazioni>organizzazione Microsoft Entra> Scaricare l'elenco delle organizzazioni di Azure DevOps connesse alla directory.
https://vstoken.dev.azure.com/<ORGANIZATION_ID>
Per Identificatore soggetto, incollare l'URL seguente sostituendo il segnaposto con il nome dell'organizzazione, il nome del progetto e il nome della connessione al servizio.
sc://ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
Specificare un nome per le credenziali federate e quindi selezionare Aggiungi al termine.
Creare una connessione al servizio
Accedere all'organizzazione di Azure DevOps e passare al progetto.
Selezionare Impostazioni progetto>Connessioni>al servizio Nuova connessione al servizio.
Selezionare Azure Resource Manager,> Avanti e quindi selezionare Entità servizio (manuale)>Avanti.
Selezionare Cloud di Azure per Ambiente e sottoscrizione per il livello di ambito, quindi immettere l'ID sottoscrizione e il nome della sottoscrizione.
Immettere le informazioni sull'entità servizio e quindi selezionare Verifica.
Dopo 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. Al termine, selezionare Verifica e salva .
Suggerimento
Se non è possibile verificare la connessione all'entità servizio, concedere all'entità servizio l'accesso con autorizzazioni di lettura all'entità servizio.
Creare una connessione al servizio
Accedere alla raccolta di Azure DevOps e quindi passare al progetto.
Selezionare Impostazioni progetto>Connessioni>al servizio Nuova connessione al servizio.
Selezionare Azure Resource Manager, assegnare un nome alla connessione al servizio e quindi selezionare Cloud di Azure per Ambiente e sottoscrizione per il livello di ambito.
Immettere l'ID sottoscrizione e il nome della sottoscrizione.
Immettere le informazioni sull'entità servizio e quindi selezionare Verifica connessione.
Selezionare la casella di controllo Consenti a tutte le pipeline di usare questa connessione e quindi selezionare OK al termine.
Suggerimento
Se non è possibile verificare la connessione all'entità servizio, concedere all'entità servizio l'accesso con autorizzazioni di lettura all'entità servizio.
Accedere a un insieme di credenziali delle chiavi privato da Azure Devops
In questa sezione verranno esaminati due metodi per accedere a un insieme di credenziali delle chiavi privato da Azure DevOps. Prima di tutto, si useranno Gruppi di variabili per collegare ed eseguire il mapping dei segreti dall'insieme di credenziali delle chiavi, seguito dalla configurazione dell'accesso in ingresso consentendo intervalli IP statici. Viene stabilito l'accesso in ingresso perché Azure Pipelines usa l'indirizzo IP pubblico di Azure DevOps pubblicato durante l'esecuzione di query su Azure Key Vault da un gruppo di variabili. Pertanto, aggiungendo connessioni in ingresso al firewall di Azure Key Vault, è possibile connettersi correttamente all'insieme di credenziali delle chiavi di Azure.
Per il secondo approccio verrà illustrato l'aggiunta dinamica dell'indirizzo IP dell'agente ospitato da Microsoft all'elenco di indirizzi consentiti del firewall dell'insieme di credenziali delle chiavi, l'esecuzione di query sull'insieme di credenziali delle chiavi e successivamente la rimozione dell'indirizzo IP dopo il completamento. Questo secondo approccio è a scopo dimostrativo e non è l'approccio consigliato da Azure Pipelines.
1 - Eseguire il mapping dei segreti dell'insieme di credenziali delle chiavi con un gruppo di variabili
Accedere all'organizzazione di Azure DevOps e passare al progetto.
Selezionare Libreria pipeline>e quindi + Gruppo di variabili.
Assegnare un nome al gruppo di variabili e quindi selezionare l'interruttore per abilitare il pulsante Collega segreti da Azure Key Vault come variabile .
Selezionare la connessione al servizio creata in precedenza, selezionare l'insieme di credenziali delle chiavi e quindi selezionare Autorizza.
In Variabili selezionare Aggiungi per aggiungere il segreto, quindi selezionare Salva al termine.
Nota
Assicurarsi che la connessione al servizio disponga delle autorizzazioni Get ed list e che all'entità servizio sia assegnato il ruolo Utente segreti dell'insieme di credenziali delle chiavi nell'insieme di credenziali delle chiavi privato.
1.1 Configurare le autorizzazioni di connessione del servizio
Passare all'insieme di credenziali delle chiavi di Azure e quindi selezionare Criteri di accesso.
Selezionare Crea e in Autorizzazioni segrete aggiungere le autorizzazioni Recupera ed Elenco e quindi selezionare Avanti.
Aggiungere la connessione al servizio nella barra di ricerca, selezionarla e quindi selezionare Avanti.
Selezionare Avanti ancora una volta, rivedere le impostazioni e quindi selezionare Rivedi e crea al termine.
1.2 Configurare le autorizzazioni dell'entità servizio
Passare all'insieme di credenziali delle chiavi di Azure e quindi selezionare Controllo di accesso (IAM).
Selezionare Aggiungi aggiungi>assegnazione di> ruolo e quindi selezionare la scheda Ruolo.
Selezionare il ruolo Utente Segreti dell'insieme di credenziali delle chiavi e quindi selezionare Avanti.
Selezionare Seleziona membri> per aggiungere l'entità >servizio Selezionare.
Al termine, selezionare Rivedi e assegna .
Accedere all'organizzazione di Azure DevOps e passare al progetto.
Selezionare Libreria pipeline>e quindi + Gruppo di variabili.
Assegnare un nome al gruppo di variabili e quindi selezionare l'interruttore per abilitare il pulsante Collega segreti da Azure Key Vault come variabile .
Selezionare la connessione al servizio di Azure creata in precedenza dal menu a discesa e quindi selezionare l'insieme di credenziali delle chiavi.
Se viene visualizzato il messaggio di errore: la connessione al servizio di Azure specificata deve disporre delle autorizzazioni di gestione dei segreti "Get, List" nell'insieme di credenziali delle chiavi selezionato. Come illustrato in precedenza. Passare all'insieme di credenziali delle chiavi in portale di Azure, selezionare Controllo di accesso (IAM)>Aggiungere l'utente dei segreti dell'insieme di credenziali delle chiavi dell'assegnazione>>di ruolo Avanti, quindi aggiungere l'entità servizio, quindi selezionare Rivedi e assegna al termine.
Aggiungere i segreti e quindi selezionare Salva al termine.
2 - Configurare l'accesso in ingresso da Azure DevOps
Per abilitare l'accesso all'insieme di credenziali delle chiavi da Azure DevOps, è necessario concedere l'accesso da intervalli IP statici specifici. Questi intervalli sono determinati dalla posizione geografica dell'organizzazione Azure DevOps.
Accedere all'Organizzazione di Azure DevOps.
Seleziona Impostazioni organizzazione.
Passare a Panoramica, dove si trova la posizione geografica elencata nella parte inferiore della pagina.
Trovare gli intervalli IP V4 geography.
Configurare l'insieme di credenziali delle chiavi per consentire l'accesso da intervalli IP statici.
3 - Eseguire query su un insieme di credenziali delle chiavi privato con un gruppo di variabili
In questo esempio si usa il gruppo di variabili, configurato in precedenza e autorizzato con un'entità servizio, per eseguire query e copiare il segreto dall'insieme di credenziali delle chiavi di Azure privato usando semplicemente il gruppo di variabili collegate. Azure Pipelines usa l'indirizzo IP pubblico pubblicato durante l'esecuzione di query su Azure Key Vault da un gruppo di variabili, quindi assicurarsi di aver configurato l'accesso in ingresso per il corretto funzionamento:
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: consentire dinamicamente l'indirizzo IP dell'agente ospitato da Microsoft
In questo secondo approccio si inizierà eseguendo una query sull'indirizzo IP dell'agente ospitato da Microsoft all'inizio della pipeline. Si aggiungerà quindi all'elenco di elementi consentiti dell'insieme di credenziali delle chiavi, si procederà con le attività rimanenti e infine si rimuoverà l'indirizzo IP dall'elenco di indirizzi consentiti del firewall dell'insieme di credenziali delle chiavi.
Nota
Questo approccio è solo a scopo dimostrativo e non è l'approccio consigliato da 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
Assicurarsi che l'entità servizio usata per accedere all'insieme di credenziali delle chiavi dalla pipeline contenga il ruolo collaboratore dell'insieme di credenziali delle chiavi all'interno del controllo di accesso (IAM) dell'insieme di credenziali delle chiavi.
Accedere a un insieme di credenziali delle chiavi privato da un agente self-hosted
Per poter accedere a un insieme di credenziali delle chiavi privato da un agente di Azure Pipelines, è necessario usare un agente self-hosted (Windows, Linux, Mac) o agenti del set di scalabilità. Ciò è dovuto al fatto che gli agenti ospitati da Microsoft, come altri servizi di calcolo generici, non sono inclusi nell'elenco di servizi attendibili dell'insieme di credenziali delle chiavi.
Per stabilire la connettività con l'insieme di credenziali delle chiavi private, è necessario fornire una connettività line-of-sight configurando un endpoint privato per l'insieme di credenziali delle chiavi. Questo endpoint deve essere instradabile e avere il nome DNS privato risolvibile dall'agente pipeline self-hosted.
1 - Configurare l'accesso in ingresso da un agente self-hosted
Seguire le istruzioni fornite per creare una rete virtuale.
In portale di Azure usare la barra di ricerca nella parte superiore della pagina per trovare Azure Key Vault.
Dopo aver individuato l'insieme di credenziali delle chiavi nei risultati della ricerca, selezionarlo e quindi passare a Impostazioni>rete.
Selezionare Connessioni endpoint privato e quindi crea per creare un nuovo endpoint privato.
Selezionare il gruppo di risorse che ospita la rete virtuale creata in precedenza. Specificare 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. Al termine, selezionare Avanti.
Selezionare Connetti a una risorsa di Azure nella directory per il metodo Connessione e quindi scegliere Microsoft.KeyVault/vaults dal menu a discesa per Tipo di risorsa. Selezionare la risorsa dal menu a discesa. La sotto-risorsa di destinazione verrà popolata automaticamente con il valore: insieme di credenziali. Al termine, selezionare Avanti.
Nella scheda Rete virtuale selezionare la rete virtuale e la subnet create in precedenza e lasciare il resto dei campi come predefinito. Al termine, selezionare Avanti.
Continuare con le schede DNS e Tag , accettando le impostazioni predefinite. Nella scheda Rivedi e crea selezionare Crea al termine.
Dopo aver distribuito la risorsa, passare all'insieme di credenziali delle chiavi Impostazioni Rete>>Connessioni endpoint private, l'endpoint privato deve essere elencato con uno stato connessione approvato.> Se si esegue il collegamento a una risorsa di Azure in una directory diversa, è necessario attendere che il proprietario della risorsa approvi la richiesta di connessione.
2 - Consentire la rete virtuale
Passare a portale di Azure e quindi trovare Azure Key Vault.
Selezionare Impostazioni>rete e assicurarsi di essere nella scheda Firewall e reti virtuali.
Selezionare Aggiungi una rete>virtuale Aggiungi reti virtuali esistenti.
Selezionare la sottoscrizione dal menu a discesa, quindi selezionare la rete virtuale creata in precedenza e quindi selezionare le subnet.
Selezionare Aggiungi al termine e quindi scorrere fino alla fine della pagina e selezionare Applica per salvare le modifiche.
3 - Eseguire query su un insieme di credenziali delle chiavi privato da un agente self-hosted
L'esempio seguente usa un agente configurato nella macchina virtuale della rete virtuale per eseguire query sull'insieme di credenziali 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 si preferisce non concedere ad Azure DevOps l'accesso in ingresso all'insieme di credenziali delle chiavi private, è possibile usare l'attività AzureKeyVault per eseguire query sull'insieme di credenziali delle chiavi. Tuttavia, è necessario assicurarsi di consentire alla rete virtuale che ospita l'agente nelle impostazioni del firewall dell'insieme di credenziali delle chiavi.
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.
Ciò indica che l'accesso pubblico è stato disabilitato e che non sono state configurate alcuna connessione endpoint privato né eccezioni del firewall. Seguire i passaggi descritti in [#configure-inbound-access-from-a-self-hosted-agent] e Configurare l'accesso in ingresso da Azure DevOps per configurare l'accesso all'insieme di credenziali delle chiavi private.
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 dell'insieme di credenziali delle chiavi è stato disabilitato e l'opzione Consenti al servizi Microsoft attendibile di ignorare questo firewall è deselezionata, ma l'indirizzo IP del client non è stato aggiunto al firewall dell'insieme di credenziali delle chiavi. Passare all'insieme di credenziali delle chiavi nella portale di Azure, quindi Impostazioni>rete e aggiungere l'INDIRIZZO IP client all'elenco di elementi consentiti 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 elementi consentiti dell'insieme di credenziali delle chiavi. Per informazioni dettagliate, vedere Configurare l'accesso in ingresso da Azure DevOps . In alternativa, è possibile passare a Consentire dinamicamente all'ip dell'agente ospitato da Microsoft di apprendere come aggiungere l'IP client al firewall dell'insieme di credenziali delle chiavi durante il runtime.