Almacenamiento seguro de las credenciales de acceso en Azure Data Science Virtual Machine

El código de aplicación en la nube suele contener credenciales para autenticarse en los servicios en la nube. La administración y la seguridad de estas credenciales es un desafío muy conocido cuando se crean aplicaciones en la nube. Lo ideal sería que las credenciales nunca aparezcan en las estaciones de trabajo de los desarrolladores. Nunca se deben insertar credenciales en el control de código fuente.

La característica de identidades administradas para recursos de Azure ayuda a resolver el problema. Proporciona una identidad administrada automáticamente a los servicios de Azure en Microsoft Entra ID. Puede usar esta identidad para autenticarse en cualquier servicio que admita la autenticación de Microsoft Entra. Además, esta identidad evita la colocación de las credenciales insertadas en el código.

Para proteger las credenciales, use Windows Installer (MSI) en combinación con Azure Key Vault. Azure Key Vault es un servicio de Azure administrado que almacena de forma segura secretos y claves criptográficas. Puede acceder a un almacén de claves mediante la identidad administrada y recuperar los secretos autorizados y las claves criptográficas de este.

La documentación sobre Key Vault y las identidades administradas para recursos de Azure forman un recurso completo para obtener información detallada sobre estos servicios. En este artículo, se ofrece una guía sobre el uso básico de MSI y Key Vault en Data Science Virtual Machine (DSVM) para acceder a los recursos de Azure.

Creación de una identidad administrada en DSVM

# 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

Asignación de permisos de acceso a Key Vault a una entidad de seguridad de máquina virtual

# 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

Acceso a un secreto de Key Vault desde DSVM

# 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"

Acceso a las claves de almacenamiento desde la DSVM

# 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.

Acceso a Key Vault desde 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))

Acceso a Key Vault desde la CLI de 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>