App, chiavi API e segreti di Azure Key Vault
Azure Key Vault è un servizio di Azure che protegge chiavi crittografiche, segreti e certificati. Fornisce un repository centralizzato, sicuro e a disponibilità elevata per informazioni riservate come le chiavi API. Un metodo per evitare la pratica non sicura di incorporare le chiavi API direttamente nel codice sorgente dell'applicazione consiste nel configurare l'app per interagire in modo sicuro con le chiavi API archiviate in Azure Key Vault.
Questo articolo illustra come creare un'istanza di Key Vault, aggiungere una chiave API come segreto a questo insieme di credenziali delle chiavi e quindi configurare l'insieme di credenziali delle chiavi usando le procedure consigliate. Queste procedure consigliate includono la limitazione dell'accesso tramite il controllo degli accessi in base al ruolo, l'abilitazione del monitoraggio e la limitazione dell'accesso alla rete.
Creazione e protezione di un'istanza di Azure Key Vault
Azure Key Vault consente di archiviare in modo sicuro chiavi crittografiche, segreti e certificati. È consigliabile distribuire insiemi di credenziali delle chiavi separati per ambienti diversi (sviluppo, gestione temporanea, produzione) e applicazioni.
Creare un gruppo di risorse e un'istanza dell'insieme di credenziali delle chiavi
Per creare un'istanza dell'insieme di credenziali delle chiavi, è possibile usare il comando seguente dall'interfaccia della riga di comando di Azure o da Azure Cloud Shell:
Usare il comando
az group create
per creare un gruppo di risorse:az group create --name myResourceGroup --location eastus
È possibile sostituire "eastus" con una località più vicina, se si preferisce.
Usare
az keyvault create
per creare l'insieme di credenziali delle chiavi:az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
Sostituire
<your-unique-keyvault-name>
con un nome univoco in tutto Azure. In genere si usa il nome personale o dell'azienda insieme ad altri numeri e identificatori.
Aggiungere una chiave API ad Azure Key Vault come segreto
Dopo aver creato l'istanza di Azure Key Vault, è possibile aggiungere una chiave API come segreto a questa istanza di Azure Key Vault.
Di seguito viene usato il comando az keyvault secret set dell'interfaccia della riga di comando di Azure per aggiungere un segreto denominato MyApiKey all'insieme di credenziali delle chiavi e imposta il segreto per scadere dopo 180 giorni:
az keyvault secret set \
--vault-name "<YourKeyVaultName>" \
--name "MyApiKey" \
--value "<YourSecretValue>"
--expires "$(date -u -d '+180 days' +'%Y-%m-%dT%H:%M:%SZ')"
È consigliabile ruotare periodicamente le chiavi API. A seconda delle esigenze di sicurezza dell'organizzazione, è possibile scegliere di ruotare le chiavi più o meno frequentemente di ogni 180 giorni. È possibile configurare una sottoscrizione di Griglia di eventi per l'evento "SecretNearExpiry" come metodo di ricezione della notifica relativa alla scadenza dei segreti della chiave API.
Limitare l'accesso all'insieme di credenziali delle chiavi usando il controllo degli accessi in base al ruolo
È possibile limitare l'accesso all'istanza di Azure Key Vault in modo che solo l'identità dell'applicazione abbia accesso ad Azure Key Vault.
A tale scopo, configurare un ruolo di controllo degli Controllo di accesso accessi in base al ruolo usando il comando az role assignment create dell'interfaccia della riga di comando di Azure:
az role assignment create --role "Key Vault Secrets User" \
--assignee <object-id-of-app-or-user> \
--scope /subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>
Abilitare la registrazione e gli avvisi di Key Vault
È consigliabile abilitare la registrazione e gli avvisi nell'istanza di Key Vault come metodo per rilevare attività potenzialmente sospette.
Per abilitare la registrazione e gli avvisi di Azure Key Vault, usare il comando az monitor diagnostic-settings create dell'interfaccia della riga di comando di Azure:
az monitor diagnostic-settings create \
--name myDiagnosticSettings \
--resource {key-vault-resource-id} \
--logs '[{"category": "AuditEvent","enabled": true}]' \
--workspace {log-analytics-workspace-id}
Questo comando crea un'impostazione di diagnostica denominata myDiagnosticSettings
, la configura per l'insieme di credenziali delle chiavi di Azure specificato, abilita la AuditEvent
categoria di log, che tiene traccia degli eventi correlati alla sicurezza e all'accesso e invia i log all'area di lavoro Log Analytics specificata per il monitoraggio, l'analisi e l'invio di avvisi. In questo modo è possibile monitorare i modelli di accesso, rilevare i tentativi di accesso non autorizzati e configurare avvisi per gli eventi di sicurezza critici, ad esempio un utente tenta di accedere a un segreto senza le autorizzazioni appropriate.
È possibile eseguire il comando az monitor scheduled-query create dell'interfaccia della riga di comando di Azure per monitorare i log nell'area di lavoro Log Analytics specificata per i tentativi di accesso non autorizzati e attivare un avviso se viene rilevato un tentativo di accesso non autorizzato corrispondente:
az monitor scheduled-query create \
--name "Suspicious Access Alert" \
--resource-group myResourceGroup \
--scopes {log-analytics-workspace-resource-id} \
--condition "AzureDiagnostics | where ResourceType == 'VAULTS' | where OperationName == 'SecretGet' | where ResultSignature == 'Unauthorized'"
Limitare l'accesso di rete a Key Vault
È consigliabile limitare l'accesso di rete ad Azure Key Vault in modo che l'insieme di credenziali accetti solo le richieste provenienti da percorsi di rete noti. A tale scopo, è possibile usare due metodi generali:
- Collegamento privato di Azure. In questo modo viene creato un endpoint privato all'interno della rete virtuale, consentendo all'applicazione di connettersi ad Azure Key Vault senza attraversare la rete Internet pubblica. Questa opzione è la più sicura perché il traffico rimane all'interno della rete, ma richiede la creazione di un endpoint privato e la configurazione del DNS.
- Regole del firewall. È possibile configurare le impostazioni del firewall di Azure Key Vault, disponibili in Reti, con un elenco di intervalli IP consentiti. È anche possibile usare questo metodo per consentire l'accesso alle reti virtuali esistenti, ma è necessario abilitare un endpoint di servizio per Microsoft.KeyVault nella subnet selezionata.
È possibile creare un endpoint privato usando il comando az network private-endpoint create dell'interfaccia della riga di comando di Azure:
az network private-endpoint create \
--name myPrivateEndpoint \
--resource-group myResourceGroup \
--vnet-name myVNet \
--subnet mySubnet \
--private-connection-resource-id /subscriptions/{subscription}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{key-vault-name} \
--group-id vault \
--connection-name myConnection
You can create firewall rules on the Azure Key Vault instance using the Azure CLI [az keyvault network-rule add](/cli/azure/keyvault/network-rule#az-keyvault-network-rule-add) command, substituting the appropriate key vault names, resource groups, subnet, and subnet mask information:
```azurecli
az keyvault network-rule add \
--name {key-vault-name} \
--resource-group myResourceGroup \
--ip-address {trusted-ip-address}/32
Azure Key Vault applica HTTPS per tutte le comunicazioni. Ciò garantisce che le chiavi API e altri dati sensibili vengano crittografati in transito, proteggendoli dagli attacchi di intercettazione e man-in-the-middle.
Interagire con Azure Key Vault con Python
Per interagire con Azure Key Vault usando Python, installare la libreria di identità di Azure per Microsoft Entra ID e la libreria dei segreti di Azure Key Vault:
pip install azure-identity
pip install azure-keyvault-secrets
Per gestire i segreti a livello di codice, è possibile usare la libreria client dei segreti di Azure Identity e Azure Key Vault:
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
key_vault_name = "<your-key-vault-name>"
KVUri = f"https://{key_vault_name}.vault.azure.net"
secret_name = "<your-secret-name>"
credential = DefaultAzureCredential()
client = SecretClient(vault_url=KVUri, credential=credential)
retrieved_secret = client.get_secret(secret_name)
# Now you can use the API key:
api_key = retrieved_secret.value
print(f"The API key is: {api_key}")
In questo codice di esempio:
- DefaultAzureCredential: questa classe tenta di eseguire l'autenticazione usando vari metodi (variabili di ambiente, identità gestite e così via), rendendola adatta per ambienti di Azure diversi.
- SecretClient: questa classe fornisce metodi per interagire con i segreti in Key Vault.
- get_secret(): recupera il segreto da Key Vault.