Azure 角色分配条件格式和语法(预览)

重要

Azure ABAC 和 Azure 角色分配条件目前为预览版。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

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

条件格式

如果要更好地了解角色分配条件,最好了解格式。

简单条件

最基本的条件由目标操作和表达式组成。 操作是用户可以对资源类型执行的操作。 表达式是计算结果为 true 或 false 的语句,该语句确定是否允许执行该操作。

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

具有单个操作和单一表达式的简单条件格式。

以下条件有一个“读取 blob”操作。 该表达式检查容器名称是否是“blobs-example-container”。

具有 blob 读取操作和容器名称表达式的简单条件示例。

显示对具有特定容器名称的 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
    }
}

子操作

某些操作具有子操作。 例如,“读取 blob”数据操作具有子操作“从带有标记条件的 blob 读取内容”。 具有子操作的条件有以下格式。

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

多个操作

如果条件为 true,则条件可以包含要允许的多个操作。 如果为单个条件选择多个操作,则能为条件选择的属性可能较少,因为这些属性必须在所选操作中可用。

如果条件为 true,要允许的多个操作的格式。

多个表达式

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

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

多个条件

还可以合并条件以针对多个操作。

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

条件语法

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

(
    (
        !(ActionMatches{'<action>'} AND @Request[subOperation] ForAnyOfAnyValues:StringEqualsIgnoreCase {'<subOperation>'})
        AND
        !(ActionMatches{'<action>'} AND @Request[subOperation] ForAnyOfAnyValues:StringEqualsIgnoreCase {'<subOperation>'})
        AND
        ...
    )
    OR
    (
        <attribute> <operator> {<value, <value>, ...}
        AND | OR
        <attribute> <operator> {<value>, <value>, ...}
        AND | OR
        ...
    )
)
AND
(
    (
        !(ActionMatches{'<action>'} AND @Request[subOperation] ForAnyOfAnyValues:StringEqualsIgnoreCase {'<subOperation>'})
        AND
        !(ActionMatches{'<action>'} AND @Request[subOperation] ForAnyOfAnyValues:StringEqualsIgnoreCase {'<subOperation>'})
        AND
        ...
    )
    OR
    (
        <attribute> <operator> {<value, <value>, ...}
        AND | OR
        <attribute> <operator> {<value>, <value>, ...}
        AND | OR
        ...
    )
)
AND
...

操作

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

属性

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

属性源 说明 代码
资源 指示该属性位于资源上,例如容器名称。 @Resource
请求 指示该属性是操作请求的一部分,例如设置 blob 索引标记。 @Request

运算符

下表列出了可用于构造条件的运算符。

Category 操作员 说明
逻辑比较 AND
&&
And 运算符。
OR
||
Or 运算符。
NOT
!
Not 或否定运算符。
字符串比较 StringEquals
StringEqualsIgnoreCase
区分大小写的(或不区分大小写的)匹配。 值必须与字符串完全匹配。
StringNotEquals
StringNotEqualsIgnoreCase
StringEquals 的否定(或 StringEqualsIgnoreCase)运算符
StringStartsWith
StringStartsWithIgnoreCase
区分大小写的(或不区分大小写的)匹配。 值以字符串开头。
StringNotStartsWith
StringNotStartsWithIgnoreCase
StringStartsWith 的否定(或 StringStartsWithIgnoreCase)运算符
StringLike
StringLikeIgnoreCase
区分大小写的(或不区分大小写的)匹配。 值可以包含字符串中任意位置的多字符匹配通配符 (*) 或单字符匹配通配符 (?)。 如果需要,可以通过添加反斜杠 \*\? 来转义这些字符。
StringNotLike
StringNotLikeIgnoreCase
StringLike 的否定(或 StringLikeIgnoreCase)运算符
数值比较 NumericEquals
NumericNotEquals
NumericLessThan
NumericLessThanEquals
NumericGreaterThan
NumericGreaterThanEquals
目前,只支持整数。
更高级别的函数 ActionMatches 检查操作 [ID] 值是否与指定的操作模式匹配。 该运算符等效于在将操作与权限内的操作模式进行比较时,SDK 使用的操作匹配逻辑。
跨产品比较 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
如果左侧至少有一个值满足与右侧至少一个值的比较,则表达式的计算结果为 true。 格式为:ForAnyOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。
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
如果左侧的每个值都满足与右侧至少一个值的比较,则表达式的计算结果为 true。 格式为:ForAllOfAnyValues:<BooleanFunction>。 支持多个字符串和数字。
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
如果左侧至少有一个值满足与右侧每个值的比较,则表达式的计算结果为 true。 格式为:ForAnyOfAllValues:<BooleanFunction>。 支持多个字符串和数字。
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
如果左侧的每个值满足与右侧每个值的比较,则表达式的计算结果为 true。 格式为:ForAllOfAllValues:<BooleanFunction>。 支持多个字符串和数字。

运算符示例

示例 结果
ActionMatches{'Microsoft.Authorization/roleAssignments/*'} 如果要检查的操作等于“Microsoft.Authorization/roleAssignments/write”,则为 true
ActionMatches{'Microsoft.Authorization/roleDefinitions/*'} 如果要检查的操作等于“Microsoft.Authorization/roleAssignments/write”,则为 false
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
{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'blue', 'green'} true
{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'orange', 'green'} false
{'red', 'blue'} ForAllOfAnyValues:StringEquals {'orange', 'red', 'blue'} true
{'red', 'blue'} ForAllOfAnyValues:StringEquals {'red', 'green'} false
{10, 20} ForAnyOfAllValues:NumericLessThan {15, 18} true
{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)