Azure 机器学习工作区使用共享密钥访问其默认的 Azure 存储帐户。 利用基于密钥的授权,拥有对存储帐户的密钥和访问权限的任何人都可以访问数据。
若要降低未经授权的访问风险,可以禁用基于密钥的授权,改为使用 Microsoft Entra ID 进行授权。 此配置使用 Microsoft Entra ID 值来授权访问存储帐户。 用于访问存储的标识是用户的标识或托管标识。 用户的标识用于在 Azure 机器学习工作室中查看数据,或者在使用用户的标识进行身份验证时运行笔记本。 在作为托管标识运行训练作业等情况下,Azure 机器学习服务使用托管标识来访问存储帐户。
先决条件
安装 SDK v2。
重要
本文需要 azure-ai-ml Python 包版本 1.17.0。 若要检查已安装的包版本,请使用 pip list Python 开发环境中的命令。
安装 azure-identity:pip install azure-identity。 如果要在笔记本单元格中工作,请使用 %pip install azure-identity。
提供订阅的详细信息:
适用范围:
Python SDK azure-ai-ml v2(最新版)
# Enter details of your subscription
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
获取订阅的句柄。 本文中的所有 Python 代码都使用 ml_client:
# get a handle to the subscription
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group)
- (可选)如果有多个帐户,请添加要在
DefaultAzureCredential 中使用的 Microsoft Entra ID 的租户 ID。 在 Azure 门户的“Microsoft Entra ID 外部标识”下找到你的租户 ID。
DefaultAzureCredential(interactive_browser_tenant_id="<TENANT_ID>")
若要使用本文档中的 CLI 命令,需要 Azure CLI 和 ml 扩展。
重要
本文中的步骤需要将 Azure CLI 扩展用于机器学习 2.27.0 版。 若要确定安装的扩展版本,请使用 az version Azure CLI 中的命令。 在返回的扩展集合中,找到 ml 扩展。 此代码示例显示示例返回值:
{
"azure-cli": "2.61.0",
"azure-cli-core": "2.61.0",
"azure-cli-telemetry": "1.1.0",
"extensions": {
"ml": "2.27.0"
}
}
创建新的工作区
创建新工作区时,创建过程可以自动禁用共享密钥访问。 或者,你也可以创建 Azure 存储帐户、禁用共享密钥访问,并在工作区创建期间使用它。
在 Azure 机器学习工作室中,选择“使用自定义网络、加密标识、依赖资源或标记创建”。
在“基本信息”选项卡中,选择之前创建的“存储帐户”。
在“ 标识 ”选项卡中的“ 存储帐户访问 ”部分中,将 存储帐户访问类型 设置为 基于标识。
像往常一样继续工作区创建过程。 创建工作区时,会自动为托管标识分配访问存储帐户所需的权限。
使用 SDK 创建工作区时,请设置 system_datastores_auth_mode="identity"。 若要使用预先存在的存储帐户,请使用 storage_account 参数指定现有存储帐户的 Azure 资源管理器 ID:
# Creating a unique workspace name with current datetime to avoid conflicts
from azure.ai.ml.entities import Workspace
import datetime
# Azure Resource Manager ID of the storage account
storage_account = "<your_storage_account>"
basic_workspace_name = "mlw-basic-prod-" + datetime.datetime.now().strftime(
"%Y%m%d%H%M"
)
ws_basic = Workspace(
name=basic_workspace_name,
location="chinanorth3",
display_name="Basic workspace-example",
description="This example shows how to create a basic workspace",
hbi_workspace=False,
tags=dict(purpose="demo"),
storage_account=storage_account,
system_datastores_auth_mode="identity"
)
ws_basic = ml_client.workspaces.begin_create(ws_basic).result()
print(ws_basic)
若要创建对存储帐户使用 Microsoft Entra ID 授权的新工作区,请使用满足这些要求并将 system_datastores_auth_mode 设置为 identity 的 YAML 配置文件。 还可以使用 storage_account 项指定现有存储帐户的 Azure 资源 ID 值。
此示例 YAML 文件演示如何将工作区设置为使用托管标识和现有存储帐户:
$schema: https://azuremlschemas.azureedge.net/latest/workspace.schema.json
name: mlw-basicex-prod
location: chinanorth3
display_name: Bring your own dependent resources-example
description: This configuration specifies a workspace configuration with existing dependent resources
storage_account: {your storage account resource id}
system_datastores_auth_mode: identity
tags:
purpose: demonstration
此 YAML 文件可与 az ml workspace create 命令(包含参数 --file)一起使用:
az ml workspace create -g <resource-group-name> --file workspace.yml
在以下 JSON 模板示例中,用自己的值替换以下占位符:
在此处显示的 JSON 代码示例中,用自己的值替换
-
[工作区名称]
-
[工作区友好名称]
-
[存储帐户 ARM 资源 ID]
-
[Key Vault ARM 资源 ID]
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources":
[
{
"type": "Microsoft.MachineLearningServices/workspaces",
"apiVersion": "2024-04-01",
"name": "[workspace name]",
"location": "[resourceGroup().location]",
"sku":
{
"name": "Basic",
"tier": "Basic"
},
"kind": "Default",
"identity":
{
"type": "SystemAssigned"
},
"properties":
{
"friendlyName": "[workspace friendly name]",
"storageAccount": "[Storage Account ARM resource ID]",
"keyVault": "[Key Vault ARM resource ID]",
"systemDatastoresAuthMode": "identity",
"managedNetwork":
{
"isolationMode": "Disabled"
},
"publicNetworkAccess": "Enabled"
}
}
]
}
有关部署 ARM 模板的信息,请使用以下文章之一:
创建工作区后,标识将使用它的所有用户,例如数据科学家。 在存储帐户的 Azure 基于角色的访问控制中,为这些用户分配 存储 Blob 数据参与者 和 存储文件数据特权参与者 角色。 如果这些用户只需要读取访问权限,请改用“存储 Blob 数据读者”和“存储文件数据特权读者”角色。 有关详细信息,请访问本文档中的角色分配资源。
更新现有工作区
如果有现有的 Azure 机器学习工作区,请使用本部分中的步骤更新工作区以使用 Microsoft Entra ID 来授权对存储帐户的访问。 然后,在存储帐户上禁用共享密钥访问。
若要更新现有工作区,请转到“属性”并选择“基于标识的访问”。
选择“保存”以保存此选项。
若要更新现有工作区,请为工作区设置 system_datastores_auth_mode = "identity"。 此代码示例显示了名为 test-ws1 的工作区的更新:
ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group)
ws = ml_client.workspaces.get(name="test-ws1")
ws.system_datastores_auth_mode = "identity"
ws = ml_client.workspaces.begin_update(workspace=ws).result()
若要更新现有工作区,请使用 az ml workspace update 命令并指定 --system-datastores-auth-mode identity。 此示例显示了名为 myworkspace 的工作区的更新:
az ml workspace update --name myworkspace --system-datastores-auth-mode identity
在以下 JSON 模板示例中,用自己的值替换以下占位符:
-
[工作区名称]
-
[工作区友好名称]
-
[存储帐户 ARM 资源 ID]
-
[Key Vault ARM 资源 ID]
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources":
[
{
"type": "Microsoft.MachineLearningServices/workspaces",
"apiVersion": "2024-04-01",
"name": "[workspace name]",
"location": "[resourceGroup().location]",
"sku":
{
"name": "Basic",
"tier": "Basic"
},
"kind": "Default",
"identity":
{
"type": "SystemAssigned"
},
"properties":
{
"friendlyName": "[workspace friendly name]",
"storageAccount": "[Storage Account ARM resource ID]",
"keyVault": "[Key Vault ARM resource ID]",
"systemDatastoresAuthMode": "identity",
"managedNetwork":
{
"isolationMode": "Disabled"
},
"publicNetworkAccess": "Enabled"
}
}
]
}
有关部署 ARM 模板的信息,请使用以下文章之一:
向用户分配角色
更新工作区后,请更新存储帐户以禁用共享密钥访问。 有关禁用共享密钥访问的详细信息,请参阅 Azure 存储帐户的“阻止共享密钥授权 ”一文。
还必须标识需要访问默认数据存储的所有用户,例如数据科学家。 必须在 Azure 基于角色的存储帐户访问控制中为这些用户分配“存储 Blob 数据参与者”和“存储文件数据特权参与者”角色。 如果这些用户只需要读取访问权限,请改用“存储 Blob 数据读者”和“存储文件数据特权读者”角色。 有关详细信息,请参阅本文档中 的角色分配 资源。
还原为使用共享密钥
若要将工作区还原为使用共享密钥访问存储帐户,请使用以下信息:
若要更新现有工作区,请转到“属性”并选择“基于凭据的访问”。
选择“保存”以保存此选项。
若要将工作区配置为再次使用共享密钥,请为工作区设置 system_datastores_auth_mode = "accesskey"。 以下代码演示如何更新名为 test-ws1 的工作区:
ml_client = MLClient(DefaultAzureCredential(), subscription_id, resource_group)
ws = ml_client.workspaces.get(name="test-ws1")
ws.system_datastores_auth_mode = "accesskey"
ws = ml_client.workspaces.begin_update(workspace=ws).result()
若要将工作区配置为再次使用共享密钥,请使用 az ml workspace update 命令并指定 --system-datastores-auth-mode accesskey。 以下示例演示如何更新名为 myworkspace 的工作区。
az ml workspace update --name myworkspace --system-datastores-auth-mode accesskey
如果有现有的 Azure 机器学习工作区,请使用本部分中的步骤更新工作区以使用 Microsoft Entra ID 来授权对存储帐户的访问。 然后,在存储帐户上禁用共享密钥访问。
在以下 JSON 模板示例中,用自己的值替换以下占位符:
-
[工作区名称]
-
[工作区友好名称]
-
[存储帐户 ARM 资源 ID]
-
[Key Vault ARM 资源 ID]
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources":
[
{
"type": "Microsoft.MachineLearningServices/workspaces",
"apiVersion": "2024-04-01",
"name": "[workspace name]",
"location": "[resourceGroup().location]",
"sku":
{
"name": "Basic",
"tier": "Basic"
},
"kind": "Default",
"identity":
{
"type": "SystemAssigned"
},
"properties":
{
"friendlyName": "[workspace friendly name]",
"storageAccount": "[Storage Account ARM resource ID]",
"keyVault": "[Key Vault ARM resource ID]",
"systemDatastoresAuthMode": "accesskey",
"managedNetwork":
{
"isolationMode": "Disabled"
},
"publicNetworkAccess": "Enabled"
}
}
]
}
有关部署 ARM 模板的信息,请使用以下文章之一:
创建工作区后,标识将使用它的所有用户,例如数据科学家。 在存储帐户的 Azure 基于角色的访问控制中,为这些用户分配 存储 Blob 数据参与者 和 存储文件数据特权参与者 角色。 如果这些用户只需要读取访问权限,请改用“存储 Blob 数据读者”和“存储文件数据特权读者”角色。 有关详细信息,请访问本文档中的角色分配资源。
还原工作区后,请更新存储帐户以禁用共享密钥访问。 有关禁用共享密钥访问的详细信息,请访问文章阻止对 Azure 存储帐户进行共享密钥授权。
角色分配应用场景
若要使用禁用共享密钥访问权限的存储帐户,可能需要向用户或中心的托管标识授予更多角色。 中心默认具有系统分配的托管标识。 但是,某些应用场景需要用户分配的托管标识。 下表总结了需要额外角色分配的应用场景:
| 场景 |
Microsoft Entra ID |
必需的角色 |
备注 |
| 托管联机终结点 |
系统分配的托管标识 |
存储 Blob 数据参与者 |
预配时自动分配了角色。
请勿手动更改此角色分配。 |
| 监视(评估模型质量/性能) |
用户分配的托管标识 |
存储 Blob 数据参与者 |
如果工作区当前使用现有用户分配的托管标识,请验证它是否具有分配的存储数据 Blob 参与者角色。 用户分配的托管标识是对工作区的系统分配的托管标识的补充。 有关如何将托管标识添加到工作区的信息,请访问添加用户分配的托管标识。
|
| 模型注册表和 ML 流 |
用户分配的托管标识 |
存储 Blob 数据参与者 |
创建使用用户分配的标识的计算群集。 * 如果将模型作为作业的输入/输出,请单独创建 UAMI,将“存储数据参与者”角色添加到基础存储,并在创建计算群集时关联该 UAMI。 作业随后将成功运行 * 如果从本地文件中注册模型,用户需要底层存储的“存储数据参与者”角色 * 模型包方案存在已知问题,目前不受支持。 |
| 并行运行步骤 (PRS) |
用户分配的托管标识 |
存储表数据参与者
存储队列数据参与者 |
|
| 数据标签 |
用户的标识 |
存储 Blob 数据参与者 |
|
| 工作室:创建数据集、浏览数据 |
用户的标识 |
存储 Blob 数据参与者 |
|
| 计算实例 |
用户的标识 |
存储文件数据特权参与者 |
|
| 工作室:笔记本 |
用户的标识 |
存储文件数据特权参与者 |
|
| 工作室:笔记本的文件资源管理器 |
用户的标识 |
存储文件数据特权参与者 |
|
| PromptFlow |
用户的标识 |
存储 Blob 数据参与者 存储文件数据特权参与者 |
|
| 数据:数据存储和数据集 |
用户的标识 |
存储 Blob 数据参与者 |
|
局限性
- 基于标识的工作区环境不支持使用系统分配的托管标识来创建计算实例。 如果工作区的存储帐户访问类型是基于标识的访问,则计算实例当前不支持系统分配的标识来装载数据存储。 使用用户分配的标识创建计算实例,并确保用户分配的标识在存储帐户上具有 存储文件数据特权参与者 。
相关内容