你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

重要

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

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

条件格式

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

简单条件

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

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

Format of a simple condition with a single action and a single expression.

(
    (
        !(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'
    )
)

Diagram showing read access to blobs with particular container name.

条件的求值方式

如果用户尝试执行角色分配中并非 <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 读取内容”子操作。 包含子操作的条件采用以下格式。

Format for an action with a suboperation.

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

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

多个操作

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

Format for multiple actions to allow if condition is true.

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

多个表达式

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

Format for multiple expressions using Boolean operators and multiple values.

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

多个条件

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

Format for multiple conditions using Boolean operator.

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

有关可在条件中使用的存储 Blob 操作的列表,请参阅 Azure 存储中 Azure 角色分配条件的操作和特性(预览版)

属性

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

特性源 说明 代码
资源 指示该特性是资源的特性,例如容器名称。 @Resource
请求 指示该属性是操作请求的一部分,例如设置 blob 索引标记。 @Request
主体 指示属性是主体(例如用户、企业应用程序(服务主体)或托管标识)的 Azure AD 自定义安全属性。 @Principal

资源和请求属性

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

主体属性

若要使用主体属性,你必须具备以下所有条件:

  • Azure AD Premium P1 或 P2 许可证
  • 已登录用户的 Azure AD 权限,例如属性分配管理员角色
  • Azure AD 中定义的自定义安全属性

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

运算符

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

类别 操作员 说明
逻辑比较 AND
&&
“与”运算符。
OR
||
“或”运算符。
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 检查 Action[ID] 值是否与指定的操作模式相匹配。 此运算符等效于 SDK 在将某个操作与 Permission 中的操作模式进行比较时使用的操作匹配逻辑。
叉积比较 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)

后续步骤