Azure 角色分配条件格式和语法

条件是一项额外检查,你可选择将其添加到角色分配中,以提供更精细的访问控制。 例如,为了读取对象,你可添加要求对象具有特定标记的条件。 本文介绍角色分配条件的格式和语法。

条件格式

为了更好地了解角色分配条件,最好是先了解格式。

简单条件

最基本的条件包含目标操作和表达式。 操作是用户可以针对资源类型执行的操作。 表达式是求值结果为 true 或 false 的语句,此求值结果确定了是否允许执行相应的操作。

下面显示了简单条件的格式。

包含单个操作和单个表达式的简单条件的格式。

(
    (
        !(ActionMatches{'<action>'})
    )
    OR
    (
        <attribute> <operator> <value>
    )
)

以下条件包含“读取 Blob”操作。 该表达式检查容器名称是否为 blobs-example-container。

(
    (
        !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
    )
    OR 
    (
        @Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name]
        StringEquals 'blobs-example-container'
    )
)

该示意图显示对具有特定容器名称的 Blob 进行的读取访问。

条件的求值方式

如果用户尝试执行角色分配中并非 <action> 的操作,则 !(ActionMatches) 的求值结果为 true,并且整个条件的求值结果也为 true,以允许执行该操作。

如果用户尝试执行角色分配中的 <action>,则 !(ActionMatches) 的求值结果为 false,因此将进行表达式求值。 如果表达式求值结果为 true,则整个条件的求值结果将为 true,以允许执行 <action>。 否则不允许执行 <action>

以下伪代码演示了读取此条件的另一种方式。

if a user tries to perform an action in the role assignment that does not match <action>
{
    Allow action to be performed
}
else
{
    if <attribute> <operator> <value> is true
    {
        Allow <action> to be performed
    }
    else
    {
        Do not allow <action> to be performed
    }
}

子操作

某些操作具有子操作。 例如,Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read 数据操作具有子操作“列出 Blob”。 包含子操作的条件采用以下格式。

具有子操作的操作的格式。

(
    (
        !(ActionMatches{'<action>'}
        AND
        SubOperationMatches{'<subOperation>'})

    )
    OR
    (
        <attribute> <operator> <value>
    )
)

多个操作

一个条件可以包含当其求值结果为 true 时你要允许执行的多个操作。 如果为单个条件选择多个操作,则可为条件选择的特性可能较少,因为这些特性必须在所选操作中可用。

条件求值结果为 true 时允许执行的多个操作的格式。

(
    (
        !(ActionMatches{'<action>'})
        AND
        !(ActionMatches{'<action>'})
    )
    OR
    (
        <attribute> <operator> <value>
    )
)

多个表达式

一个条件可以包含多个表达式。 可以根据运算符针对多个值检查特性。

使用布尔运算符和多个值的多个表达式的格式。

(
    (
        !(ActionMatches{'<action>'})
    )
    OR
    (
        <attribute> <operator> <value>
        AND | OR
        <attribute> <operator> {<value>, <value>, <value>}
        AND | OR
        <attribute> <operator> <value>
    )
)

多个条件

还可以组合多个条件以将多个操作指定为目标。

使用布尔运算符的多个条件的格式。

(
    (
        !(ActionMatches{'<action>'})
    )
    OR
    (
        <attribute> <operator> <value>
        AND | OR
        <attribute> <operator> {<value>, <value>, <value>}
        AND | OR
        <attribute> <operator> <value>
    )
)
AND
(
    (
        !(ActionMatches{'<action>'})
    )
    OR
    (
        <attribute> <operator> <value>
        AND | OR
        <attribute> <operator> <value>
    )
)

条件语法

下面显示了角色分配条件的语法。

(
    (
        !(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
        AND
        !(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
        AND
        ...
    )
    OR
    (
        <attribute> <operator> {<value, <value>, ...}
        AND | OR
        <attribute> <operator> {<value>, <value>, ...}
        AND | OR
        ...
    )
)
AND
(
    (
        !(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
        AND
        !(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
        AND
        ...
    )
    OR
    (
        <attribute> <operator> {<value, <value>, ...}
        AND | OR
        <attribute> <operator> {<value>, <value>, ...}
        AND | OR
        ...
    )
)
AND
...

操作

目前,可将条件添加到包含 Blob 存储或队列存储数据操作的内置或自定义角色分配。 其中包括以下内置角色:

有关可在条件中使用的存储操作列表,请参阅:

属性

根据所选的操作,特性可能出现在不同的位置。 如果为单个条件选择多个操作,则能为条件选择的属性可能较少,因为这些属性必须在全部所选操作中可用。 若要指定特性,必须包含源作为前缀。

特性源 说明 代码
环境 属性与请求的环境相关联,例如请求的网络源或当前日期和时间。
@Environment
主体 属性是分配给主体的自定义安全属性,例如用户或企业应用程序(服务主体)。 @Principal
请求 属性是操作请求的一部分,例如设置 blob 索引标记。 @Request
资源 属性是资源的属性,例如容器名称。 @Resource

有关可在条件中使用的存储属性的完整列表,请参阅:

环境属性

环境属性与发出访问请求的环境相关联,例如日期和时间或网络环境。 网络环境可能指明是通过特定专用终结点或虚拟网络子网进行访问,还是可能通过任何专用链接进行访问。

下表列出了条件支持的环境属性。

Display name 说明 属性 类型
是专用链接1 在条件中使用此属性来要求通过任何专用链接进行访问。 isPrivateLink 布尔值
专用终结点1,2 在条件中使用此属性限制通过特定专用终结点进行的访问。 Microsoft.Network/privateEndpoints 字符串
子网1,3 在条件中使用此属性限制来自特定子网的访问。 Microsoft.Network/virtualNetworks/subnets 字符串
现在 (UTC) 在条件中使用此属性来限制在特定时间段内对对象的访问。 UtcNow DateTime

1 对于复制操作,Is private linkPrivate endpointSubnet 属性仅适用于目标(例如存储帐户),而不适用于源。 有关适用的复制操作的详细信息,请选择表中的每个属性以查看更多详细信息。
2 仅当目前至少在订阅中配置了一个专用终结点时,才能使用 Private endpoint 属性。
3 仅当你当前至少有一个使用订阅中配置的服务终结点的虚拟网络子网时,才可以使用 Subnet 属性。

主体属性

主体属性是自定义安全属性,分配给请求访问资源的安全主体。 安全主体可以是用户或企业应用程序(服务主体)。

要使用主体属性,必须具备以下各项:

  • 登录用户的 Microsoft Entra 权限,例如属性分配管理员角色
  • Microsoft Entra ID 中定义的自定义安全属性

有关自定义安全属性的详细信息,请参阅:

请求属性

请求属性与访问请求中指定的条件相关联,例如要列出的 Blob 的指定前缀。

资源属性

资源属性与请求访问的对象相关联,例如存储帐户名称、容器名称或是否为存储帐户启用分层命名空间。

函数运算符

本部分列出了可用于构造条件的函数运算符。

ActionMatches

属性
“运算符” ActionMatches
说明 检查当前操作是否与指定的操作模式匹配。
示例 ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}
如果所要检查的操作等于“Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read”,则为 true

ActionMatches{'Microsoft.Authorization/roleAssignments/*'}
如果所要检查的操作等于“Microsoft.Authorization/roleAssignments/write”,则为 true

ActionMatches{'Microsoft.Authorization/roleDefinitions/*'}
如果所要检查的操作等于“Microsoft.Authorization/roleAssignments/write”,则为 false

SubOperationMatches

属性
“运算符” SubOperationMatches
说明 检查当前子操作是否与指定的子操作模式匹配。
示例 SubOperationMatches{'Blob.List'}

Exists

属性
“运算符” Exists
说明 检查指定的特性是否存在。
示例 Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:snapshot]
属性支持 1 加密范围名称
快照
版本 ID

1 在 Azure 门户上的视觉 ABAC 条件生成器中,只有这些属性支持 Exists 运算符。 可以使用 PowerShellAzure CLIREST API 以及 Azure 门户中的条件代码编辑器等其他工具将 Exists 运算符添加到任何属性中。

逻辑运算符

本部分列出了可用于构造条件的逻辑运算符。

属性
运算符 AND
&&
说明 “与”运算符。
示例 !(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-01T00:00:00.0Z' OR NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId

Not

属性
运算符 NOT
!
说明 “非”或求反运算符。
示例 NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId]

布尔比较运算符

本部分列出了可用于构造条件的布尔比较运算符。

属性
运算符 BoolEquals
BoolNotEquals
说明 布尔比较。
示例 @Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true

字符串比较运算符

本部分列出了可用于构造条件的字符串比较运算符。

StringEquals

属性
运算符 StringEquals
StringEqualsIgnoreCase
说明 区分大小写(或不区分大小写)匹配。 值必须与字符串完全匹配。
示例 @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'

StringNotEquals

属性
运算符 StringNotEquals
StringNotEqualsIgnoreCase
说明 StringEquals(或 StringEqualsIgnoreCase)运算符求反。

StringStartsWith

属性
运算符 StringStartsWith
StringStartsWithIgnoreCase
说明 区分大小写(或不区分大小写)匹配。 值以字符串开头。

StringNotStartsWith

属性
运算符 StringNotStartsWith
StringNotStartsWithIgnoreCase
说明 StringStartsWith(或 StringStartsWithIgnoreCase)运算符求反。

StringLike

属性
运算符 StringLike
StringLikeIgnoreCase
说明 区分大小写(或不区分大小写)匹配。 值可以包含字符串中任意位置的多字符匹配通配符 (*) 或单字符匹配通配符 (?)。 如果需要,可以通过添加反斜杠 \*\? 来转义这些字符。
示例 @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*'

Resource[name1] StringLike 'a*c?'
如果 Resource [name1] 等于“abcd”,则结果为 true

Resource[name1] StringLike 'A*C?'
如果 Resource [name1] 等于“abcd”,则结果为 false

Resource[name1] StringLike 'a*c'
如果 Resource [name1] 等于“abcd”,则结果为 false

StringNotLike

属性
运算符 StringNotLike
StringNotLikeIgnoreCase
说明 StringLike(或 StringLikeIgnoreCase)运算符求反。

数值比较运算符

本部分列出了可用于构造条件的数值比较运算符。

属性
运算符 NumericEquals
NumericNotEquals
NumericGreaterThan
NumericGreaterThanEquals
NumericLessThan
NumericLessThanEquals
说明 数字匹配。 仅支持整数。

日期/时间比较运算符

本部分列出了可用于构造条件的日期/时间比较运算符。

属性
运算符 DateTimeEquals
DateTimeNotEquals
DateTimeGreaterThan
DateTimeGreaterThanEquals
DateTimeLessThan
DateTimeLessThanEquals
说明 yyyy-mm-ddThh:mm:ss.mmmmmmmZ 格式的全精度检查。 现在用于 Blob 版本 ID、Blob 快照和 UTC。
示例 @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z'

GUID 比较运算符

本部分列出了可用于构造条件的全局唯一标识符 (GUID) 比较运算符。

属性
运算符 GuidEquals
GuidNotEquals
描述 不区分大小写的匹配格式:00000000-0000-0000-0000-000000000000。 用于标识资源,例如主体 ID 或角色定义 ID。
示例

叉积比较运算符

本部分列出了可用于构造条件的叉积比较运算符。

ForAnyOfAnyValues

属性
运算符 ForAnyOfAnyValues:StringEquals
ForAnyOfAnyValues:StringEqualsIgnoreCase
ForAnyOfAnyValues:StringNotEquals
ForAnyOfAnyValues:StringNotEqualsIgnoreCase
ForAnyOfAnyValues:StringLike
ForAnyOfAnyValues:StringLikeIgnoreCase
ForAnyOfAnyValues:StringNotLike
ForAnyOfAnyValues:StringNotLikeIgnoreCase
ForAnyOfAnyValues:NumericEquals
ForAnyOfAnyValues:NumericNotEquals
ForAnyOfAnyValues:NumericGreaterThan
ForAnyOfAnyValues:NumericGreaterThanEquals
ForAnyOfAnyValues:NumericLessThan
ForAnyOfAnyValues:NumericLessThanEquals
ForAnyOfAnyValues:GuidEquals
ForAnyOfAnyValues:GuidNotEquals
说明 如果左侧至少有一个值满足与右侧至少一个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAnyOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。
示例 @Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'validScope1', 'validScope2'}
如果加密范围名称等于 validScope1validScope2,则为 true。

{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'blue', 'green'}
true

{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'orange', 'green'}
false

ForAllOfAnyValues

属性
运算符 ForAllOfAnyValues:StringEquals
ForAllOfAnyValues:StringEqualsIgnoreCase
ForAllOfAnyValues:StringNotEquals
ForAllOfAnyValues:StringNotEqualsIgnoreCase
ForAllOfAnyValues:StringLike
ForAllOfAnyValues:StringLikeIgnoreCase
ForAllOfAnyValues:StringNotLike
ForAllOfAnyValues:StringNotLikeIgnoreCase
ForAllOfAnyValues:NumericEquals
ForAllOfAnyValues:NumericNotEquals
ForAllOfAnyValues:NumericGreaterThan
ForAllOfAnyValues:NumericGreaterThanEquals
ForAllOfAnyValues:NumericLessThan
ForAllOfAnyValues:NumericLessThanEquals
ForAllOfAnyValues:GuidEquals
ForAllOfAnyValues:GuidNotEquals
说明 如果左侧每个值都满足与右侧至少一个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAllOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。
示例 @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ForAllOfAnyValues:StringEquals {'Cascade', 'Baker', 'Skagit'}

{'red', 'blue'} ForAllOfAnyValues:StringEquals {'orange', 'red', 'blue'}
true

{'red', 'blue'} ForAllOfAnyValues:StringEquals {'red', 'green'}
false

ForAnyOfAllValues

属性
运算符 ForAnyOfAllValues:StringEquals
ForAnyOfAllValues:StringEqualsIgnoreCase
ForAnyOfAllValues:StringNotEquals
ForAnyOfAllValues:StringNotEqualsIgnoreCase
ForAnyOfAllValues:StringLike
ForAnyOfAllValues:StringLikeIgnoreCase
ForAnyOfAllValues:StringNotLike
ForAnyOfAllValues:StringNotLikeIgnoreCase
ForAnyOfAllValues:NumericEquals
ForAnyOfAllValues:NumericNotEquals
ForAnyOfAllValues:NumericGreaterThan
ForAnyOfAllValues:NumericGreaterThanEquals
ForAnyOfAllValues:NumericLessThan
ForAnyOfAllValues:NumericLessThanEquals
ForAnyOfAllValues:GuidEquals
ForAnyOfAllValues:GuidNotEquals
说明 如果左侧至少有一个值满足与右侧每个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAnyOfAllValues:<BooleanFunction>。 支持多个字符串和数字。
示例 {10, 20} ForAnyOfAllValues:NumericLessThan {15, 18}

ForAllOfAllValues

属性
运算符 ForAllOfAllValues:StringEquals
ForAllOfAllValues:StringEqualsIgnoreCase
ForAllOfAllValues:StringNotEquals
ForAllOfAllValues:StringNotEqualsIgnoreCase
ForAllOfAllValues:StringLike
ForAllOfAllValues:StringLikeIgnoreCase
ForAllOfAllValues:StringNotLike
ForAllOfAllValues:StringNotLikeIgnoreCase
ForAllOfAllValues:NumericEquals
ForAllOfAllValues:NumericNotEquals
ForAllOfAllValues:NumericGreaterThan
ForAllOfAllValues:NumericGreaterThanEquals
ForAllOfAllValues:NumericLessThan
ForAllOfAllValues:NumericLessThanEquals
ForAllOfAllValues:GuidEquals
ForAllOfAllValues:GuidNotEquals
说明 如果左侧每个值都满足与右侧每个值进行比较的条件,则表达式求值结果为 true。 格式为:ForAllOfAllValues:<BooleanFunction>。 支持多个字符串和数字。
示例 {10, 20} ForAllOfAllValues:NumericLessThan {5, 15, 18}
false

{10, 20} ForAllOfAllValues:NumericLessThan {25, 30}
true

{10, 20} ForAllOfAllValues:NumericLessThan {15, 25, 30}
false

特殊字符

字符 说明
* 星号 (*) 表示可与 Like 运算符结合使用的多字符通配符匹配。 如果需要,可以通过添加反斜杠 \* 来转义星号。
? 问号 (?) 表示可与 Like 运算符结合使用的单字符通配符匹配。 如果需要,可以通过添加反斜杠 \? 来转义问号。
$ 美元符号 ($) 用于帮助描述标记键。 在 Azure PowerShell 中,如果用双引号 (") 括起来的字符串包含美元符号,则必须为其添加反引号 (`) 作为前缀。 例如: tags:Project<`$key_case_sensitive`$>

组合与优先级

如果目标操作有三个或多个表达式,并且表达式之间有不同的运算符,则求值顺序不明确。 可以使用括号 () 对表达式进行分组并指定表达式的求值顺序。 括在括号中的表达式优先级更高。 例如,如果有以下表达式:

a AND b OR c

必须按以下方式之一添加括号:

(a AND b) OR c
a AND (b OR c)

后续步骤