Sicheres Speichern von Zugriffsanmeldeinformationen in einer Azure Data Science Virtual Machine-Instanz

Cloudanwendungscode enthält häufig Anmeldeinformationen zur Authentifizierung bei Clouddiensten. Das Verwalten und Schützen dieser Anmeldeinformationen ist eine bekannte Herausforderung beim Erstellen von Cloudanwendungen. Im Idealfall werden Anmeldeinformationen nie auf Entwicklerarbeitsstationen angezeigt. Wir sollten niemals Anmeldeinformationen in der Quellcodeverwaltung einchecken.

Das Feature für verwaltete Identitäten für Azure-Ressourcen in Microsoft Entra hilft bei der Lösung dieses Problems. Damit wird in Microsoft Entra ID eine automatisch verwaltete Identität für Azure-Dienste bereitgestellt. Sie können diese Identität für die Authentifizierung bei jedem Dienst verwenden, der die Microsoft Entra-Authentifizierung unterstützt. Darüber hinaus vermeidet diese Identität die Platzierung eingebetteter Anmeldeinformationen in Ihrem Code.

Um Anmeldeinformationen zu sichern, verwenden Sie Windows Installer (MSI) in Kombination mit Azure Key Vault. Azure Key Vault ist ein verwalteter Azure-Dienst, der geheime Schlüssel und kryptografische Schlüssel sicher speichert. Sie können mit der verwalteten Identität auf einen Schlüsseltresor zugreifen und dann die autorisierten Geheimnisse und kryptografischen Schlüssel aus dem Schlüsseltresor abrufen.

Die Dokumentation zu Key Vault und den verwalteten Identitäten für Azure-Ressourcen ist eine umfassende Quelle für ausführliche Informationen über diese Dienste. Dieser Artikel beschreibt die grundlegende Verwendung von MSI und Key Vault auf der Data Science VM (Data Science Virtual Machine, DSVM) für den Zugriff auf Azure-Ressourcen.

Erstellen einer verwalteten Identität auf der 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

Zuweisen von Key Vault-Zugriffsberechtigungen zu einem VM-Prinzipal

# 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

Zugreifen auf ein Geheimnis im Schlüsseltresor aus der 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"

Zugreifen auf Speicherschlüssel von der 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.

Zugreifen auf den Schlüsseltresor aus 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))

Zugreifen auf den Schlüsseltresor aus Azure CLI

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