Armazenar credenciais de acesso com segurança em uma Máquina Virtual de Ciência de Dados do Azure

O código do aplicativo em nuvem geralmente contém credenciais para autenticação em serviços em nuvem. O gerenciamento e a segurança dessas credenciais são um desafio bem conhecido à medida que construímos aplicativos em nuvem. Idealmente, as credenciais nunca devem aparecer nas estações de trabalho dos desenvolvedores. Nunca devemos verificar credenciais para controle de origem.

O recurso identidades gerenciadas para recursos do Azure ajuda a resolver o problema. Fornece aos serviços do Azure uma identidade gerida automaticamente no Microsoft Entra ID. Você pode usar essa identidade para autenticar qualquer serviço que ofereça suporte à autenticação Microsoft Entra. Além disso, essa identidade evita a colocação de quaisquer credenciais incorporadas no seu código.

Para proteger credenciais, use o Windows Installer (MSI) em combinação com Azure Key Vault. O Azure Key Vault é um serviço gerenciado do Azure que armazena segredos e chaves criptográficas com segurança. É possível acessar um cofre de chaves usando a identidade gerenciada e depois recuperar as chaves de criptografia e os segredos autorizados do cofre de chaves.

A documentação sobre o Key Vault e as identidades geridas para os recursos do Azure constitui um recurso abrangente para obter informações detalhadas sobre esses serviços. Esse artigo aborda o uso básico do MSI e do Key Vault na Máquina Virtual de Ciência de Dados (DSVM) para acessar os recursos do Azure.

Criar uma identidade gerenciada no 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

Atribuir permissões de acesso do Key Vault a uma entidade de segurança da VM

# 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

Acessar um segredo no cofre de chaves da 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"

Acessar chaves de armazenamento pela 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.

Acessar o cofre de chaves do 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))

Acessar o cofre de chaves da CLI do 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>