Azure Data Science Virtual Machine にアクセス資格情報を安全に保存する

クラウド アプリケーション コードには、多くの場合、クラウド サービスに対して認証するための資格情報が含まれています。 これらの資格情報の管理とセキュリティは、クラウド アプリケーションを構築する際によく知られている課題です。 資格情報は、開発者のワークステーションに一切表示ないことが理想的です。 ソース管理に資格情報をチェックインすることは絶対にしません。

Azure リソース用マネージド ID 機能がこの問題の解決に役立ちます。 これにより、Microsoft Entra ID で自動的に管理される ID が Azure サービスに与えられます。 この ID を使用し、Microsoft Entra 認証をサポートする任意のサービスに対する認証を行うことができます。 また、この ID により、埋め込み資格情報がコード内に置かれることが回避されます。

資格情報をセキュリティで保護するには、Windows Installer (MSI) と Azure Key Vault を組み合わせて使用します。 Azure Key Vault は、シークレットと暗号化キーを安全に格納するマネージド Azure サービスです。 マネージド ID を使用してキー コンテナーにアクセスし、キー コンテナーから承認済みのシークレットと暗号化キーを取得することができます。

Azure リソースの Key Vault とマネージド ID に関するドキュメントは、これらのサービスの詳細情報についての包括的なリソースで構成されています。 この記事では、データ サイエンス仮想マシン (DSVM) で MSI と Key Vault を使用して Azure リソースにアクセスする基本的な方法について説明します。

DSVM 上でマネージド ID を作成する

# 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

VM プリンシパルに Key Vault のアクセス許可を割り当てる

# 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

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"

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.

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

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>