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 存储或队列存储数据操作的内置或自定义角色分配。 其中包括以下内置角色:

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

属性

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

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

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

环境属性

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

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

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

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

主体属性

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

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

  • Microsoft Entra登录用户的权限,例如 Attribute 分配管理员角色
  • 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

1Exists 运算符仅支持Azure门户中视觉 ABAC 条件生成器中的这些属性。 可以使用其他工具将 Exists 运算符添加到任何属性,例如 PowerShell、Azure CLI、REST API 和Azure门户中的条件代码编辑器。

逻辑运算符

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

且

属性 值
运算符 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'}
如果加密范围名称等于 validScope1 或 validScope2,则为 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}
true

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)

后续步骤