使用托管标识身份验证,对 Blob 进行排队以进行引入

将 Blob 排队来从你自己的存储帐户引入时,可使用托管标识来替代共享访问签名 (SAS)共享密钥身份验证方法。 托管标识是引入数据时更安全的方法,因为它们不需要你与服务共享客户 SAS 令牌或共享密钥。 相反,托管标识会分配给群集,并被授予用于引入数据的存储帐户的读取权限。 你可随时撤销这些权限。

注意

  • 此身份验证方法仅适用于驻留在客户拥有的存储帐户中的 Azure Blob 和 Azure Data Lake 文件。 它不适用于使用 Kusto SDK 上传的本地文件。
  • 仅支持排队引入。 不支持 Kusto 查询语言中的内联引入和使用 SDK API 实现的直接引入。

为群集分配托管标识

请按照托管标识概述将系统或用户分配的托管标识添加到群集。 如果群集已分配有所需的托管标识,请按照以下步骤复制其对象 ID:

  1. 使用已与包含群集的 Azure 订阅关联的帐户登录 Azure 门户

  2. 导航到群集并选择“标识”。

  3. 选择相应的标识类型、系统或用户分配,然后复制所需标识的对象 ID。

Screenshot of the overview page, showing the system managed identity object I D

向托管标识授予权限

  1. 在 Azure 门户中,导航到包含要引入的数据的存储帐户。

  2. 选择“访问控制”,然后选择“添加”>“添加角色分配”。

  3. 授予托管标识“存储 Blob 数据读取者”,或在要使用 DeleteSourceOnSuccess 源选项(对存储帐户的权限)的情况下授予“存储 Blob 数据参与者者”。

重要

授予所有者或参与者权限是不够的,这会导致引入失败。

Screenshot of the add role assignment page, showing the system assigned role for ingestion using managed identities

在 Azure 数据资源管理器设置托管标识策略

若要使用托管标识将数据引入群集,请允许对所选托管标识采用 NativeIngestion 使用选项。 原生引入是指使用 SDK 从外部源进行引入的功能。 有关可用 SDK 的详细信息,请参阅客户端库

可在目标群集的群集或数据库级别定义“使用托管标识”策略。

若要在数据库级别应用策略,请运行以下命令:

.alter-merge database <database name> policy managed_identity "[ { 'ObjectId' : '<managed_identity_id>', 'AllowedUsages' : 'NativeIngestion' }]"

若要在群集级别应用策略,请运行以下命令:

.alter-merge cluster policy managed_identity "[ { 'ObjectId' : '<managed_identity_id>', 'AllowedUsages' : 'NativeIngestion' }]"

<managed_identity_id> 替换为所需托管标识的对象 ID。

注意

必须在群集上具有 All Database Admin 权限才能编辑托管标识策略。

使用 Kusto SDK 通过托管标识对 Blob 进行排队以进行引入

使用 Kusto SDK 引入数据时,请将 ;managed_identity={objectId} 追加到未获授权的 Blob URI 上,使用托管标识身份验证生成 Blob URI。 如果使用群集系统分配的托管标识引入数据,可将 ;managed_identity=system 追加到 Blob URI。

重要

必须使用排队引入客户端。 不支持将托管标识用于 Kusto 查询语言中的直接引入或内联引入。

下面是系统标识和用户分配的托管标识的 Blob URI 示例。

  • 系统分配:https://demosa.blob.core.chinacloudapi.cn/test/export.csv;managed_identity=system
  • 用户分配:https://demosa.blob.core.chinacloudapi.cn/test/export.csv;managed_identity=6a5820b9-fdf6-4cc4-81b9-b416b444fd6d

重要

  • 使用托管标识通过 C# SDK 引入数据时,必须在 BlobSourceOptions 中提供 Blob 大小。 如果未设置大小,SDK 会尝试通过访问存储帐户来填充 Blob 大小,这会导致失败。
  • size 参数应该是原始(未压缩)数据大小,不一定是 Blob 大小。
  • 如果在引入时不知道大小,可提供零 (0) 值。 该服务将尝试使用托管标识进行身份验证来发现大小。