队列存储的 Azure 角色分配条件示例
本文列出了用于控制 Azure 队列存储资源访问权限的角色分配条件的一些示例。
重要
Azure 基于属性的访问控制 (Azure ABAC) 已正式发布 (GA),用于使用标准和高级存储帐户性能层中的 request
、resource
、environment
和 principal
属性控制对 Azure Blob 存储、Azure Data Lake Storage Gen2 和 Azure 队列的访问。 目前,“容器元数据”资源属性和“列出 Blob 操作的所含内容”请求属性处于预览状态。 有关 Azure 存储 ABAC 的完整功能状态信息,请参阅 Azure 存储中条件功能的状态。
有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Azure 预览版的补充使用条款。
有关添加或编辑角色分配条件的先决条件的信息,请参阅有关条件的先决条件。
使用下表快速找到适合 ABAC 方案的示例。 该表包含方案的简要说明,并按源(环境、主体、请求和资源)列出了示例中使用的属性。
本部分包含演示如何基于队列名称限制消息访问的示例。
此条件允许用户速览或清除名为 sample-queue 的队列中的消息。 该条件适用于与订阅中的其他用户共享特定队列数据。
重要
为了使此条件对安全主体有效,必须将它添加到包含以下操作的所有角色分配:Microsoft.Storage/storageAccounts/queueServices/queues/messages/read
和 Microsoft.Storage/storageAccounts/queueServices/queues/messages/delete
。

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在本文中的“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
选择“添加操作”,然后选择“速览消息”和“清除消息”:
使用下表中的值生成条件的表达式部分:
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。
存储队列数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/read'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/delete'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/queueServices/queues:name] StringEquals 'sample-queue'
)
)
输入代码后,请切换回可视化编辑器进行验证。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/delete'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/read'})) OR (@Resource[Microsoft.Storage/storageAccounts/queueServices/queues:name] StringEquals 'sample-queue'))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
Get-AzStorageQueue -Name <queueName> -Context $bearerCtx
本部分包含一些示例,它们演示了如何根据网络环境或当前日期和时间来限制对队列消息的访问。
此条件仅允许在协调世界时 (UTC) 2023 年 5 月 1 日下午 1:00 之后对队列 sample-queue
进行速览访问。
重要
为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下操作的所有角色分配:Microsoft.Storage/storageAccounts/queueServices/queues/messages/read
。
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在下面的“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
选择“添加操作”,然后选择“速览消息”:
使用下表中的值生成条件的表达式部分:
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。
存储队列数据读取者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/read'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/queueServices/queues:name] StringEquals 'sample-queue'
AND
@Environment[UtcNow] DateTimeGreaterThan '2023-05-01T13:00:00.0Z'
)
)
输入代码后,请切换回可视化编辑器进行验证。
下面介绍如何使用 Azure PowerShell 为存储队列数据读取者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Queue Data Reader"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$queueName = "sample-queue"
$dateTime = "2023-05-01T13:00:00.000Z"
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/read'}) `
) `
OR `
( `
@Resource[Microsoft.Storage/storageAccounts/queueServices/queues:name] StringEquals '$queueName' `
AND `
@Environment[UtcNow] DateTimeGreaterThan '$dateTime' `
) `
)"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
此条件仅允许从虚拟网络 sample-vnet
上的子网 default
放置和更新 sample-queue
中的消息。
重要
为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下任何操作的所有角色分配:Microsoft.Storage/storageAccounts/queueServices/queues/messages/write
。
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在下面的“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
选择“添加操作”,然后选择“放置或更新消息”:
使用下表中的值生成条件的表达式部分:
设置 |
值 |
特性源 |
资源 |
Attribute |
队列名称 |
运算符 |
StringEquals |
值 |
container1 |
逻辑运算符 |
'AND' |
特性源 |
环境 |
属性 |
子网 |
操作员 |
StringEqualsIgnoreCase |
值 |
/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/sample-vnet/subnets/default |
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。
存储队列数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/write'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/queueServices/queues:name] StringEquals 'sample-queue'
AND
@Environment[Microsoft.Network/virtualNetworks/subnets] StringEquals '/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.Network/virtualNetworks/sample-vnet/subnets/default'
)
)
输入代码后,请切换回可视化编辑器进行验证。
下面介绍如何使用 Azure PowerShell 为存储队列数据参与者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Queue Data Contributor"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$queueName = "sample-queue"
$vnetName = "sample-vnet"
$subnetName = "default"
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/queueServices/queues/messages/write'}) `
) `
OR `
( `
@Resource[Microsoft.Storage/storageAccounts/queueServices/queues:name] StringEquals '$queueName' `
AND `
@Environment[Microsoft.Network/virtualNetworks/subnets] StringEqualsIgnoreCase '/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Network/virtualNetworks/$vnetName/subnets/$subnetName' `
) `
)"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
若需查看有关如何使用主体属性允许 Blob 数据访问的完整示例,请参阅允许基于标记和自定义安全属性读取 Blob。