本文列出了控制 Azure Blob 存储访问权限的角色分配条件的一些示例。
重要
Azure 基于属性的访问控制 (Azure ABAC) 已正式发布 (GA),用于使用标准和高级存储帐户性能层中的 request
、resource
、environment
和 principal
属性控制对 Azure Blob 存储、Azure Data Lake Storage Gen2 和 Azure 队列的访问。 目前,“容器元数据”资源属性和“列出 Blob 操作的所含内容”请求属性处于预览状态。 有关 Azure 存储 ABAC 的完整功能状态信息,请参阅 Azure 存储中条件功能的状态。
有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Azure 预览版的补充使用条款。
先决条件
有关添加或编辑角色分配条件的先决条件的信息,请参阅有关条件的先决条件。
本文中的示例摘要
使用下表快速找到适合 ABAC 方案的示例。 该表包含方案的简要说明,并按源(环境、主体、请求和资源)列出了示例中使用的属性。
本部分包括涉及 Blob 索引标记的示例。
重要
尽管目前支持 Read content from a blob with tag conditions
子操作以便与 ABAC 功能预览期间实现的条件兼容,但该子操作已弃用,Azure 建议改用 Read a blob
操作。
在 Azure 门户中配置 ABAC 条件时,可能会出现“已弃用: 从具有标记条件的 Blob 中读取内容”。 Azure 建议删除该操作并将其替换为 Read a blob
操作。
如果要创作自己的条件,希望通过标记条件来限制读取访问,请参阅示例:使用 Blob 索引标记读取 Blob。
示例:使用 blob 索引标记读取 blob
此条件允许用户读取 blob 索引标记键为 Project 且标记值为 Cascade 的 blob。 不允许尝试访问没有此键值标记的 blob。
为了使此条件对安全主体有效,必须将它添加到包含以下操作的所有角色分配:
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户视觉编辑器添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许执行列出 Blob 操作,但所有其他读取操作都要根据检查 Blob 索引标记的表达式进行进一步求值。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"
$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-AzStorageBlob -Container <containerName> -Blob <blobName> -Context $bearerCtx
示例:新 blob 必须包含 blob 索引标记
此条件要求所有新的 blob 必须包含 blob 索引标记键 Project 和标记值 Cascade。
有两个操作允许创建新的 blob,因此必须以获取这两个操作作为目标。 必须将此条件添加到包含以下操作之一的任何角色分配:
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})) OR (@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$localSrcFile = # path to an example file, can be an empty txt
$ungrantedTag = @{'Project'='Baker'}
$grantedTag = @{'Project'='Cascade'}
# Get new context for request
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# try ungranted tags
$content = Set-AzStorageBlobContent -File $localSrcFile -Container example2 -Blob "Example2.txt" -Tag $ungrantedTag -Context $bearerCtx
# try granted tags
$content = Set-AzStorageBlobContent -File $localSrcFile -Container example2 -Blob "Example2.txt" -Tag $grantedTag -Context $bearerCtx
示例:现有 blob 必须具有 blob 索引标记键
此条件要求使用至少一个允许的 blob 索引标记键(Project 或 Program)标记任何现有 blob。 该条件适用于向现有 blob 添加治理。
有两个操作允许更新现有 blob 上的标记,因此必须以获取这两个权限为目标。 必须将此条件添加到包含以下操作之一的任何角色分配:
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags&$keys$&] ForAllOfAnyValues:StringEquals {'Project', 'Program'}
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write'})) OR (@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags&`$keys`$&] ForAllOfAnyValues:StringEquals {'Project', 'Program'}))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$localSrcFile = # path to an example file, can be an empty txt
$ungrantedTag = @{'Mode'='Baker'}
$grantedTag = @{'Program'='Alpine';'Project'='Cascade'}
# Get new context for request
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# try ungranted tags
$content = Set-AzStorageBlobContent -File $localSrcFile -Container example3 -Blob "Example3.txt" -Tag $ungrantedTag -Context $bearerCtx
# try granted tags
$content = Set-AzStorageBlobContent -File $localSrcFile -Container example3 -Blob "Example3.txt" -Tag $grantedTag -Context $bearerCtx
示例:现有 blob 必须具有 blob 索引标记键和值
此条件要求任何现有 blob 均需具有 blob 索引标记键 Project 和标记值 Cascade、Baker 或 Skagit。 该条件适用于向现有 blob 添加治理。
有两个操作允许更新现有 blob 上的标记,因此必须以获取这两个权限为目标。 必须将此条件添加到包含以下操作之一的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags&$keys$&] ForAnyOfAnyValues:StringEquals {'Project'}
AND
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ForAllOfAnyValues:StringEquals {'Cascade', 'Baker', 'Skagit'}
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write'})) OR (@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags&`$keys`$&] ForAnyOfAnyValues:StringEquals {'Project'} AND @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] ForAllOfAnyValues:StringEquals {'Cascade', 'Baker', 'Skagit'}))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$localSrcFile = <pathToLocalFile>
$ungrantedTag = @{'Project'='Alpine'}
$grantedTag1 = @{'Project'='Cascade'}
$grantedTag2 = @{'Project'='Baker'}
$grantedTag3 = @{'Project'='Skagit'}
# Get new context for request
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# try ungranted tags
Set-AzStorageBlobTag -Container example4 -Blob "Example4.txt" -Tag $ungrantedTag -Context $bearerCtx
# try granted tags
Set-AzStorageBlobTag -Container example4 -Blob "Example4.txt" -Tag $grantedTag1 -Context $bearerCtx
Set-AzStorageBlobTag -Container example4 -Blob "Example4.txt" -Tag $grantedTag2 -Context $bearerCtx
Set-AzStorageBlobTag -Container example4 -Blob "Example4.txt" -Tag $grantedTag3 -Context $bearerCtx
Blob 容器名称或路径
本部分包含一些示例,它们演示了如何根据容器名称或 Blob 路径来限制对对象的访问。
示例:读取、写入或删除命名容器中的 blob
该条件允许用户读取、写入或删除名为 blob-example-container 的存储容器中的 blob。 该条件适用于与订阅中的其他用户共享特定存储容器。
有五个操作用于读取、写入和删除现有 blob。 必须将此条件添加到包含以下操作之一的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 如果此条件中包含的存储帐户已启用分层命名空间或将来可能启用,则请添加。 |
在该条件下不使用子操作,因为只有在条件为基于标记创作时才需要子操作。

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
)
)
存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$localSrcFile = <pathToLocalFile>
$grantedContainer = "blobs-example-container"
$ungrantedContainer = "ungranted"
# Get new context for request
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# Ungranted Container actions
$content = Set-AzStorageBlobContent -File $localSrcFile -Container $ungrantedContainer -Blob "Example5.txt" -Context $bearerCtx
$content = Get-AzStorageBlobContent -Container $ungrantedContainer -Blob "Example5.txt" -Context $bearerCtx
$content = Remove-AzStorageBlob -Container $ungrantedContainer -Blob "Example5.txt" -Context $bearerCtx
# Granted Container actions
$content = Set-AzStorageBlobContent -File $localSrcFile -Container $grantedContainer -Blob "Example5.txt" -Context $bearerCtx
$content = Get-AzStorageBlobContent -Container $grantedContainer -Blob "Example5.txt" -Context $bearerCtx
$content = Remove-AzStorageBlob -Container $grantedContainer -Blob "Example5.txt" -Context $bearerCtx
示例:使用路径读取命名容器中的 blob
该条件允许使用 blob 路径 readonly/* 对名为 blob-example-container 的存储容器进行读取访问。 该条件适用于与订阅中的其他用户共享存储容器的特定部分以进行读取访问。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 如果此条件中包含的存储帐户已启用分层命名空间或将来可能启用,则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
AND
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*'
)
)
存储 Blob 数据读取者、存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
AND
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*'
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查容器名称和路径的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container' AND @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*'))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$grantedContainer = "blobs-example-container"
# Get new context for request
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# Try to get ungranted blob
$content = Get-AzStorageBlobContent -Container $grantedContainer -Blob "Ungranted.txt" -Context $bearerCtx
# Try to get granted blob
$content = Get-AzStorageBlobContent -Container $grantedContainer -Blob "readonly/Example6.txt" -Context $bearerCtx
示例:使用路径读取或列出命名容器中的 blob
此条件允许使用 blob 路径 readonly/* 对名为 blob-example-container 的存储容器进行读取访问和列出访问。 条件 #1 适用于除列出 blob 之外的读取操作。 条件 #2 适用于列出 blob。 此条件适用于与订阅中的其他用户共享存储容器的特定部分以进行读取或列出访问。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 如果此条件中包含的存储帐户已启用分层命名空间或将来可能启用,则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
注意
Azure 门户使用 prefix='' 列出容器根目录中的 blob。 使用前缀 StringStartsWith 'readonly/' 通过列出 blob 操作添加条件后,目标用户将无法在 Azure 门户中列出容器根目录中的 blob。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
AND
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringStartsWith 'readonly/'
)
)
AND
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
AND
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:prefix] StringStartsWith 'readonly/'
)
)
存储 Blob 数据读取者、存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
AND
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringStartsWith 'readonly/'
)
)
AND
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'blobs-example-container'
AND
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:prefix] StringStartsWith 'readonly/'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
示例:使用路径在命名容器中写入 blob
该条件允许合作伙伴(Microsoft Entra 来宾用户)通过 uploads/contoso/* 路径将文件放入名为 Contosocorp 的存储容器。 该条件适用于允许其他用户将数据放入存储容器。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 如果此条件中包含的存储帐户已启用分层命名空间或将来可能启用,则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'contosocorp'
AND
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'uploads/contoso/*'
)
)
存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'contosocorp'
AND
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'uploads/contoso/*'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'}) AND !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'contosocorp' AND @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'uploads/contoso/*'))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$grantedContainer = "contosocorp"
$localSrcFile = <pathToLocalFile>
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# Try to set ungranted blob
$content = Set-AzStorageBlobContent -Container $grantedContainer -Blob "Example7.txt" -Context $bearerCtx -File $localSrcFile
# Try to set granted blob
$content = Set-AzStorageBlobContent -Container $grantedContainer -Blob "uploads/contoso/Example7.txt" -Context $bearerCtx -File $localSrcFile
示例:使用 blob 索引标记和路径读取 blob
该条件允许用户读取 blob 索引标记键为 Program、标记值为 Alpine 且 blob 路径为 logs* 的 blob。 blob 路径 logs* 还包括 blob 名称。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Program<$key_case_sensitive$>] StringEquals 'Alpine'
)
)
AND
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'logs*'
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查 blob 索引标记和路径的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Program<`$key_case_sensitive`$>] StringEquals 'Alpine')) AND ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'logs*'))"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
下面说明如何测试此条件。
$grantedContainer = "contosocorp"
# Get new context for request
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
# Try to get ungranted blobs
# Wrong name but right tags
$content = Get-AzStorageBlobContent -Container $grantedContainer -Blob "AlpineFile.txt" -Context $bearerCtx
# Right name but wrong tags
$content = Get-AzStorageBlobContent -Container $grantedContainer -Blob "logsAlpine.txt" -Context $bearerCtx
# Try to get granted blob
$content = Get-AzStorageBlobContent -Container $grantedContainer -Blob "logs/AlpineFile.txt" -Context $bearerCtx
此条件允许用户使用特定元数据键/值对读取 Blob 容器中的 Blob。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据读者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/metadata:testKey] StringEquals 'testValue'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}) `
) `
OR `
( `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/metadata:testKey] StringEquals 'testValue' `
) `
)"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
此条件允许用户使用特定元数据键/值对写入或删除 Blob 容器中的 Blob。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete |
|
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/metadata:testKey] StringEquals 'testValue'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
以下介绍如何使用 Azure PowerShell 添加此条件。
$condition = "( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'}) `
) `
OR `
( `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/metadata:testKey] StringEquals 'testValue' `
) `
) `
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
Blob 版本或 blob 快照
本部分包含一些示例,它们演示了如何根据容器版本或快照来限制对对象的访问。
示例:仅读取当前 blob 版本
此条件允许用户仅读取当前 blob 版本。 用户无法读取其他 blob 版本。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:isCurrentVersion] BoolEquals true
)
)
存储 Blob 数据读取者、存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:isCurrentVersion] BoolEquals true
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查版本的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
示例:读取当前 blob 版本和特定 blob 版本
此条件允许用户读取当前 blob 版本以及版本 ID 为 2022-06-01T23:38:32.8883645Z 的 blob。 用户无法读取其他 blob 版本。 版本 ID 属性仅适用于未启用分层命名空间的存储帐户。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T23:38:32.8883645Z'
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:isCurrentVersion] BoolEquals true
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查版本信息的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
示例:删除旧 blob 版本
此条件允许用户删除早于 2022 年 6 月 1 日的 blob 版本以执行清理。 版本 ID 属性仅适用于未启用分层命名空间的存储帐户。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/deleteBlobVersion/action |
|

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/deleteBlobVersion/action'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeLessThan '2022-06-01T00:00:00.0Z'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
示例:读取当前 blob 版本和任何 blob 快照
此条件允许用户读取当前 blob 版本和任何 blob 快照。 版本 ID 属性仅适用于未启用分层命名空间的存储帐户。 快照属性适用于未启用分层命名空间的存储帐户,当前为已启用分层命名空间的存储帐户提供预览版。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:snapshot]
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:isCurrentVersion] BoolEquals true
)
)
存储 Blob 数据读取者、存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:snapshot]
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:isCurrentVersion] BoolEquals true
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查版本和快照信息的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
此条件允许用户列出容器中的 Blob,并包括元数据、快照和版本信息。 列出 Blob 包含属性适用于未启用分层命名空间的存储帐户。
注意
列出 Blob 包含是一个请求属性,通过在调用列出 Blob 操作时允许或限制 include
参数中的值来发挥作用。 使用叉积比较运算符将 include
参数中的值与条件中指定的值进行比较。 如果比较结果为 true,则允许 List Blobs
请求。 如果比较结果为 false,则拒绝 List Blobs
请求。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据读者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND SubOperationMatches{'Blob.List'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:include] ForAllOfAnyValues:StringEqualsIgnoreCase {'metadata', 'snapshots', 'versions'}
)
)
在此示例中,当子操作为 Blob.List
时,条件会限制读取操作。 这意味着会根据那个检查 include
值的表达式进一步评估列出 Blob 操作,但允许所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
当请求中包含元数据时,此条件会限制用户列出 Blob。 列出 Blob 包含属性适用于未启用分层命名空间的存储帐户。
注意
列出 Blob 包含是一个请求属性,通过在调用列出 Blob 操作时允许或限制 include
参数中的值来发挥作用。 使用叉积比较运算符将 include
参数中的值与条件中指定的值进行比较。 如果比较结果为 true,则允许 List Blobs
请求。 如果比较结果为 false,则拒绝 List Blobs
请求。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户添加此条件的设置。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据读者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND SubOperationMatches{'Blob.List'})
)
OR
(
@Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:include] ForAllOfAllValues:StringNotEquals {'metadata'}
)
)
在此示例中,当子操作为 Blob.List
时,条件会限制读取操作。 这意味着会根据那个检查 include
值的表达式进一步评估列出 Blob 操作,但允许所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
分层命名空间
本部分包含一些示例,它们演示了如何根据是否已为存储帐户启用分层命名空间来限制对对象的访问。
示例:仅读取已启用分层命名空间的存储帐户
此条件允许用户仅读取已启用分层命名空间的存储帐户中的 blob。 此条件仅适用于资源组范围或更大范围。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true
)
)
存储 Blob 数据读取者、存储 Blob 数据参与者
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查分层命名空间的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
加密范围
本部分包含一些示例,它们演示了如何限制对具有已批准加密范围的对象的访问。
示例:读取具有特定加密范围的 blob
此条件允许用户读取使用加密范围 validScope1
或 validScope2
加密的 blob。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'validScope1', 'validScope2'}
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查加密范围的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
示例:在具有特定加密范围的命名存储帐户中读取或写入 blob
此条件允许用户在名为 sampleaccount
并使用加密范围 ScopeCustomKey1
加密的存储帐户中读取或写入 blob。 如果 blob 未使用 ScopeCustomKey1
加密或解密,则请求将返回禁止。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
注意
由于不同存储帐户的加密范围可能不同,因此建议将 storageAccounts:name
特性与 encryptionScopes:name
特性结合使用,以限制允许的特定加密范围。

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts:name] StringEquals 'sampleaccount'
AND
@Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'ScopeCustomKey1'}
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
主体属性
本部分包含一些示例,它们演示了如何根据自定义安全主体来限制对对象的访问。
如果用户具有与 blob 索引标记匹配的自定义安全属性,则此条件允许对 blob 进行读取或写入访问。
例如,如果 Brenda 具有特性 Project=Baker
,则她只能读取和写入具有 Project=Baker
blob 索引标记的 blob。 同样,Chandra 只能读取和写入具有 Project=Cascade
的 blob。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
有关详细信息,请参阅基于标记和自定义安全属性允许对 Blob 进行读取访问。

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
)
)
AND
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'} AND SubOperationMatches{'Blob.Write.WithTagHeaders'})
)
OR
(
@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project] StringEquals @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
如果用户的自定义安全属性具有任何与 blob 索引标记匹配的值,则此条件允许对 blob 进行读取访问。
例如,如果 Chandra 的 Project 属性具有值 Baker 和 Cascade,则她只能读取带 Project=Baker
或 Project=Cascade
Blob 索引标记的 Blob。
必须将此条件添加到包含以下操作的任何角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
有关详细信息,请参阅基于标记和自定义安全属性允许对 Blob 进行读取访问。

可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
若要使用代码编辑器添加条件,请复制条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ForAnyOfAnyValues:StringEquals @Principal[Microsoft.Directory/CustomSecurityAttributes/Id:Engineering_Project]
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对检查 blob 索引标记和自定义安全属性的表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
环境属性
本部分包含一些示例,它们演示了如何根据网络环境或当前日期和时间来限制对对象的访问。
示例:允许在特定日期和时间之后对 Blob 进行读取访问
此条件仅允许在协调世界时 (UTC) 2023 年 5 月 1 日下午 1 点之后对 Blob 容器 container1
进行读取访问。
读取现有 Blob 有两种可能的操作。 为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下任何操作的所有角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
添加操作
选择“添加操作”,然后仅选择“读取 Blob”子操作,如下表所示。
请不要选择顶层“所有读取操作”操作或任何其他子操作,如下图所示:
生成表达式
使用下表中的值生成条件的表达式部分:
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'container1'
AND
@Environment[UtcNow] DateTimeGreaterThan '2023-05-01T13:00:00.000Z'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
下面介绍如何使用 Azure PowerShell 为存储 Blob 数据读取者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Blob Data Reader"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$containerName = "container1"
$dateTime = "2023-05-01T13:00:00.000Z"
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}) `
) `
OR `
( `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals '$containerName' `
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
示例:允许从特定子网访问特定容器中的 Blob
此条件仅允许从虚拟网络 virtualnetwork1
上的子网 default
读取、写入、添加和删除 container1
中的 Blob。 若要在本示例中使用子网属性,子网必须为 Azure 存储启用服务终结点。
对现有 Blob 执行读取、写入、添加和删除有五种可能的操作。 为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下任何操作的所有角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
添加操作
选择“添加操作”,然后仅选择下表中显示的顶层操作。
操作 |
子操作 |
所有读取操作 |
n/a |
写入到 blob |
n/a |
创建 blob 或快照,或追加数据 |
n/a |
删除 Blob |
不适用 |
请不要选择任何单独的子操作,如下图所示:
生成表达式
使用下表中的值生成条件的表达式部分:
设置 |
值 |
特性源 |
资源 |
特性 |
容器名称 |
运算符 |
StringEquals |
值 |
container1 |
逻辑运算符 |
'AND' |
特性源 |
环境 |
属性 |
子网 |
操作员 |
StringEqualsIgnoreCase |
值 |
/subscriptions/<your subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/virtualNetworks/virtualnetwork1/subnets/default |
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name]StringEquals 'container1'
AND
@Environment[Microsoft.Network/virtualNetworks/subnets] StringEqualsIgnoreCase '/subscriptions/<your subscription id>/resourceGroups/example-group/providers/Microsoft.Network/virtualNetworks/virtualnetwork1/subnets/default'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
下面介绍如何使用 Azure PowerShell 为存储 Blob 数据参与者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Blob Data Contributor"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$containerName = "container1"
$vnetName = "virtualnetwork1"
$subnetName = "default"
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'}) `
) `
OR `
( `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals '$containerName' `
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,其中 Blob 索引标记敏感度具有 high
值,可通过专用链接(任何专用链接)进行访问。 这意味着从公共 Internet 读取高度敏感的 Blob 的所有尝试都会被禁止。 用户可以从公共 Internet 读取敏感度设置为 high
以外的某个值的 Blob。
此 ABAC 示例条件的真值表如下所示:
操作 |
敏感性 |
专用链接 |
Access |
读取 blob |
high |
是 |
允许 |
读取 blob |
high |
否 |
不允许 |
读取 blob |
不高 |
是 |
允许 |
读取 blob |
不高 |
否 |
允许 |
读取现有 Blob 有两种可能的操作。 为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下任何操作的所有角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户中的可视化条件编辑器添加此条件的设置。
添加操作
选择“添加操作”,然后仅选择“读取 Blob”子操作,如下表所示。
请不要选择顶层“所有读取操作”操作或任何其他子操作,如下图所示:
生成表达式
使用下表中的值生成条件的表达式部分:
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<$key_case_sensitive$>] StringEquals 'high'
AND
@Environment[isPrivateLink] BoolEquals true
)
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<$key_case_sensitive$>] StringNotEquals 'high'
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
下面介绍如何使用 Azure PowerShell 为存储 Blob 数据读取者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Blob Data Reader"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) `
) `
OR `
( `
( `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<`$key_case_sensitive`$>] StringEquals 'high' `
AND `
@Environment[isPrivateLink] BoolEquals true `
) `
OR `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<`$key_case_sensitive`$>] StringNotEquals 'high' `
) `
)"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
示例:仅允许从特定专用终结点对容器进行访问
此条件要求通过名为 privateendpoint1
的专用终结点对存储容器 container1
中的 Blob 执行所有读取、写入、添加和删除操作。 对于未命名为 container1
的所有其他容器,不需要通过专用终结点进行访问。
对现有 Blob 执行读取、写入和删除有五种可能的操作。 为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下任何操作的所有角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 如果此条件中包含的存储帐户已启用分层命名空间或将来可能启用,则请添加。 |
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户中的可视化条件编辑器添加此条件的设置。
添加操作
选择“添加操作”,然后仅选择下表中显示的顶层操作。
操作 |
子操作 |
所有读取操作 |
n/a |
写入到 blob |
n/a |
创建 blob 或快照,或追加数据 |
n/a |
删除 Blob |
不适用 |
请不要选择任何单独的子操作,如下图所示:
生成表达式
使用下表中的值生成条件的表达式部分:
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请选择以下条件代码示例之一,具体取决于与分配关联的角色。 输入代码后,请切换回可视化编辑器进行验证。
存储 Blob 数据所有者:
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action'})
)
OR
(
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'container1'
AND
@Environment[Microsoft.Network/privateEndpoints] StringEqualsIgnoreCase '/subscriptions/<your subscription id>/resourceGroups/example-group/providers/Microsoft.Network/privateEndpoints/privateendpoint1'
)
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringNotEquals 'container1'
)
)
存储 Blob 数据参与者:
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'})
AND
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'})
)
OR
(
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals 'container1'
AND
@Environment[Microsoft.Network/privateEndpoints] StringEqualsIgnoreCase '/subscriptions/<your subscription id>/resourceGroups/example-group/providers/Microsoft.Network/privateEndpoints/privateendpoint1'
)
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringNotEquals 'container1'
)
)
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
下面介绍如何使用 Azure PowerShell 为存储 Blob 数据参与者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Blob Data Contributor"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$containerName = "container1"
$privateEndpointName = "privateendpoint1"
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/add/action'}) `
AND `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete'}) `
) `
OR `
( `
( `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringEquals '$containerName' `
AND `
@Environment[Microsoft.Network/privateEndpoints] StringEqualsIgnoreCase '/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Network/privateEndpoints/$privateEndpointName' `
) `
OR `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name] StringNotEquals '$containerName' `
) `
)"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
示例:仅允许从特定专用终结点读取高度敏感的 Blob 数据,并由标记具有访问权限的用户进行读取访问
此条件要求索引标记敏感度设置为 high
的 Blob 只能由具有匹配的敏感度安全属性值的用户读取。 此外,必须通过名为 privateendpoint1
的专用终结点访问它们。 可以通过其他终结点或 Internet 来访问敏感度标记设为其他值的 Blob。
读取现有 Blob 有两种可能的操作。 为了使此条件对具有多个角色分配的主体有效,必须将该条件添加到包含以下任何操作的所有角色分配。
操作 |
说明 |
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read |
|
Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action |
如果角色定义包含此操作(例如存储 Blob 数据所有者),则请添加。 |
可以使用 Azure 门户或 Azure PowerShell 将条件添加到角色分配。 该门户有两个用于生成 ABAC 条件的工具 - 可视化编辑器和代码编辑器。 在 Azure 门户中,可以在这两个编辑器之间切换,以在不同的视图中查看条件。 在“可视化编辑器”选项卡和“代码编辑器”选项卡之间切换,以查看首选门户编辑器的示例。
以下是通过 Azure 门户中的可视化条件编辑器添加此条件的设置。
添加操作
选择“添加操作”,然后仅选择“读取 Blob”子操作,如下表所示。
请不要选择顶层操作,如下图所示:
生成表达式
使用下表中的值生成条件的表达式部分:
下图显示了将设置输入到 Azure 门户后的情况。 必须对表达式进行分组以确保计算正确。
若要使用代码编辑器添加条件,请复制下面的条件代码示例并将其粘贴到代码编辑器中。 输入代码后,请切换回可视化编辑器进行验证。
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})
)
OR
(
(
@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:sensitivity] StringEqualsIgnoreCase @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<$key_case_sensitive$>]
AND
@Environment[Microsoft.Network/privateEndpoints] StringEqualsIgnoreCase '/subscriptions/<your subscription id>/resourceGroups/example-group/providers/Microsoft.Network/privateEndpoints/privateendpoint1'
)
OR
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<$key_case_sensitive$>] StringNotEquals 'high'
)
)
在此示例中,条件会限制读取操作,但子操作为 Blob.List
时除外。 这意味着允许 List Blob 操作,但会针对表达式进一步计算所有其他读取操作。
如果用户尝试在分配的角色中执行未受条件限制的操作,则!(ActionMatches)
计算结果为 true,总体条件的计算结果为 true。 此结果允许执行该操作。
若要详细了解条件的格式设置和评估方式,请参阅条件格式。
下面介绍如何使用 Azure PowerShell 为存储 Blob 数据读取者角色添加此条件。
$subId = "<your subscription id>"
$rgName = "<resource group name>"
$storageAccountName = "<storage account name>"
$roleDefinitionName = "Storage Blob Data Reader"
$userUpn = "<user UPN>"
$userObjectID = (Get-AzADUser -UserPrincipalName $userUpn).Id
$privateEndpointName = "privateendpoint1"
$scope = "/subscriptions/$subId/resourceGroups/$rgName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
$condition = `
"( `
( `
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) `
) `
OR `
( `
( `
@Principal[Microsoft.Directory/CustomSecurityAttributes/Id:sensitivity] StringEqualsIgnoreCase @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<`$key_case_sensitive`$>] `
AND `
@Environment[Microsoft.Network/privateEndpoints] StringEqualsIgnoreCase '/subscriptions/$subid/resourceGroups/$rgname/providers/Microsoft.Network/privateEndpoints/$privateEndpointName' `
) `
OR `
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:sensitivity<`$key_case_sensitive`$>] StringNotEquals 'high' `
) `
)"
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectID
$testRa.Condition = $condition
$testRa.ConditionVersion = "2.0"
Set-AzRoleAssignment -InputObject $testRa -PassThru
后续步骤