Archiviare le credenziali di accesso in modo sicuro in una Data Science Virtual Machine Azure

Il codice dell'applicazione cloud contiene spesso le credenziali per l'autenticazione ai servizi cloud. La gestione e la sicurezza di queste credenziali sono una sfida nota durante la creazione di applicazioni cloud. Idealmente, le credenziali non dovrebbero mai essere visualizzate nelle workstation di sviluppo. Non è mai consigliabile archiviare le credenziali per il controllo del codice sorgente.

La funzionalità delle identità gestite per le risorse di Azure consente di risolvere il problema. Fornisce ai servizi di Azure un'identità gestita automaticamente in Microsoft Entra ID. È possibile usare questa identità per eseguire l'autenticazione a qualsiasi servizio che supporti l'autenticazione di Microsoft Entra. Inoltre, questa identità evita il posizionamento di eventuali credenziali incorporate nel codice.

Per proteggere le credenziali, usare Windows Installer (MSI) in combinazione con Azure Key Vault. Azure Key Vault è un servizio di Azure gestito che archivia in modo sicuro segreti e chiavi crittografiche. È possibile accedere a un insieme di credenziali delle chiavi usando l'identità gestita e recuperare i segreti autorizzati e le chiavi crittografiche dall'insieme di credenziali delle chiavi stesso.

La documentazione su Key Vault e le identità gestite per le risorse di Azure costituisce una risorsa completa per informazioni approfondite su questi servizi. Questo articolo illustra l'uso di base di MSI e Key Vault nella Data Science Virtual Machine (DSVM) per accedere alle risorse di Azure.

Creare un'identità gestita nella macchina virtuale di data science

# Prerequisite: You already created a Data Science VM in the usual way.

# Create an identity principal for the VM.
az vm assign-identity -g <Resource Group Name> -n <Name of the VM>
# Get the principal ID of the DSVM.
az resource list -n <Name of the VM> --query [*].identity.principalId --out tsv

Assegnare autorizzazioni di accesso a Key Vault a un'entità di sicurezza della macchina virtuale

# Prerequisite: You already created an empty Key Vault resource on Azure through use of the Azure portal or Azure CLI.

# Assign only get and set permissions but not the capability to list the keys.
az keyvault set-policy --object-id <Principal ID of the DSVM from previous step> --name <Key Vault Name> -g <Resource Group of Key Vault>  --secret-permissions get set

Accedere a un segreto in Key Vault dalla macchina virtuale di data science

# Get the access token for the VM.
x=`curl http://localhost:50342/oauth2/token --data "resource=https://vault.azure.net" -H Metadata:true`
token=`echo $x | python -c "import sys, json; print(json.load(sys.stdin)['access_token'])"`

# Access the key vault by using the access token.
curl https://<Vault Name>.vault.azure.net/secrets/SQLPasswd?api-version=2016-10-01 -H "Authorization: Bearer $token"

Accedere alle chiavi di archiviazione dalla macchina virtuale di data science

# Prerequisite: You granted your VMs MSI access to use storage account access keys, based on instructions at https://learn.microsoft.com/azure/active-directory/managed-service-identity/tutorial-linux-vm-access-storage. This article describes the process in more detail.

y=`curl http://localhost:50342/oauth2/token --data "resource=https://management.azure.com/" -H Metadata:true`
ytoken=`echo $y | python -c "import sys, json; print(json.load(sys.stdin)['access_token'])"`
curl https://management.azure.com/subscriptions/<SubscriptionID>/resourceGroups/<ResourceGroup of Storage account>/providers/Microsoft.Storage/storageAccounts/<Storage Account Name>/listKeys?api-version=2016-12-01 --request POST -d "" -H "Authorization: Bearer $ytoken"

# Now you can access the data in the storage account from the retrieved storage account keys.

Accedere a Key Vault da Python

from azure.keyvault import KeyVaultClient
from msrestazure.azure_active_directory import MSIAuthentication

"""MSI Authentication example."""

# Get credentials.
credentials = MSIAuthentication(
    resource='https://vault.azure.net'
)

# Create a Key Vault client.
key_vault_client = KeyVaultClient(
    credentials
)

key_vault_uri = "https://<key Vault Name>.vault.azure.net/"

secret = key_vault_client.get_secret(
    key_vault_uri,  # Your key vault URL.
    # The name of your secret that already exists in the key vault.
    "SQLPasswd",
    ""              # The version of the secret; empty string for latest.
)
print("My secret value is {}".format(secret.value))

Accedere a Key Vault dall'interfaccia della riga di comando di Azure

# With managed identities for Azure resources set up on the DSVM, users on the DSVM can use Azure CLI to perform the authorized functions. The following commands enable access to the key vault from Azure CLI, without a required Azure account login.
# Prerequisites: MSI is already set up on the DSVM, as indicated earlier. Specific permissions, like accessing storage account keys, reading specific secrets, and writing new secrets, are provided to the MSI.

# Authenticate to Azure CLI without a required Azure account. 
az login --msi

# Retrieve a secret from the key vault. 
az keyvault secret show --vault-name <Vault Name> --name SQLPasswd

# Create a new secret in the key vault.
az keyvault secret set --name MySecret --vault-name <Vault Name> --value "Helloworld"

# List access keys for the storage account.
az storage account keys list -g <Storage Account Resource Group> -n <Storage Account Name>