为工作区的存储帐户禁用共享密钥访问(预览版)
本文内容
Azure 机器学习工作区默认使用共享密钥访问其默认 Azure 存储帐户。 利用基于密钥的授权,拥有对存储帐户的密钥和访问权限的任何人都可以访问数据。
若要降低未经授权的访问风险,可以禁用基于密钥的授权,改为使用 Microsoft Entra ID 进行授权。 此配置使用 Microsoft Entra ID 值来授权访问存储帐户。 用于访问存储的标识是用户的标识或托管标识。 用户的标识用于查看 Azure 机器学习工作室中的数据,或在通过用户标识进行身份验证时运行笔记本。 在作为托管标识运行训练作业等情况下,Azure 机器学习服务使用托管标识来访问存储帐户。
将工作区与禁用共享密钥的存储帐户配合使用目前为预览版。
重要
此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,我们不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。
有关详细信息,请参阅适用于 Azure 预览版的补充使用条款 。
先决条件
安装 SDK v2 。
重要
本文中的步骤需要使用 azure-ai-ml Python 包版本 1.17.0。 若要确定已安装的包版本,请使用 Python 开发环境中的 pip list
命令。
安装 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 版。 若要确定已安装的扩展版本,请使用 Azure CLI 中的 az version
命令。 在返回的扩展集合中,找到 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 数据参与者
相关内容