Azure Monitor Log Analytics 中的精细基于角色的访问控制(RBAC)允许根据指定的条件筛选每个用户可以查看或查询的工作区数据,以满足业务和安全需求。 此访问控制的优点包括:
- 行级访问
- 表级访问
- 控制平面和数据平面分离
如果 Log Analytics 体系结构包含多个工作区,以适应数据隔离、隐私或合规性,则精细 RBAC 通过减少所需的工作区数来帮助简化。
先决条件
行动 | 所需权限 |
---|---|
创建新的自定义角色 | 可分配作用域的 Microsoft.Authorization/roleDefinitions/write 权限。 例如,由特权内置角色“用户访问管理员”提供。 |
添加或更新条件 | Log Analytics 工作区的 Microsoft.Authorization/roleAssignments/write 和 Microsoft.Authorization/roleAssignments/delete 权限。 例如,由特权内置角色“基于角色的访问控制管理员”提供。 |
何时使用细粒度 RBAC?
精细 RBAC 可帮助你实现以下场景:
- 数据隔离 - 将不同单位、团队和地理位置的数据与同一工作区中分开,并确保每个用户只能访问与其组相关的数据。 访问条件使用自定义日志字段强制实施由防火墙、设备类型、订阅 ID 或其他标识符等属性隔离的行级访问。
- 数据隐私 - 保护敏感或机密数据,例如个人信息、运行状况记录或财务交易,仅允许访问授权用户。
- 数据符合性 - 使用精细 RBAC 作为工具来帮助你满足行业或区域的法规或法律要求。 对数据访问和使用情况强制实施适当的策略和控制。
精细 RBAC 控制数据访问,例如查看或查询数据。 它无法解决控制平面作的问题,例如设置数据访问、工作区管理、转换或数据导出的权限。
配置精细 RBAC
使用分步粒度 RBAC 示例跳转到精细 RBAC。
以下部分概述了配置精细 RBAC 所涉及的关键概念和步骤。
角色创建
若要配置精细 RBAC,必须创建具有所需 作 的自定义角色,然后使用 条件分配自定义角色。 有关自定义角色的详细信息,请参阅 Azure 自定义角色。
自定义角色操作和数据操作所需的最低权限为:
自定义角色定义 | 许可 | DESCRIPTION |
---|---|---|
控制平面操作 (Actions) | Microsoft.OperationalInsights/workspaces/query/read |
在 Log Analytics 中运行查询并查看元数据。 此权限不授予对数据的访问权限。 |
数据平面操作 (DataActions) | Microsoft.OperationalInsights/workspaces/tables/data/read |
对数据的访问,是在角色分配条件中选择的 dataaction 。 如果未设置条件,此权限将授予对分配范围内所有数据的访问权限。 |
(可选)通过添加 Microsoft.OperationalInsights/workspaces/read
控件操作,来实现从 Azure 门户的访问。 有关详细信息,请参阅 Azure RBAC 控制和数据操作。
注释
粒度 RBAC(如 Azure RBAC)是一种累加模型。 有效权限是角色分配的总和。 若要使精细的 RBAC 条件生效,必须删除具有更高访问权限的任何角色分配。
例如,如果在同一范围内有两个角色分配,其中一个设置了一个 */read
动作,另一个设置了对特定记录的访问限制条件,则生成的权限是 */read
动作,这允许访问该范围内的所有日志。 没有显式拒绝操作,只有拒绝分配。
条件和表达式
与常规角色分配一样,创建的自定义角色必须分配给用户或组。 区别在于,在角色分配期间,条件配置为微调访问控制。
通过精细 RBAC,可基于每个记录中的数据对表和在行级设置条件。 根据这两种策略规划限制:
访问控制方法 | 示例: |
---|---|
不能访问数据,除非获得许可。 | 限制对应用程序日志的访问,以便用户只能查看 application id 列是他们被允许访问的应用程序的记录。 |
对所有数据的访问,但不允许访问的数据除外 | 允许对所有登录日志的访问,但 userPrincipalName 列为 CEO 的记录除外。 |
条件由角色的数据操作和表达式组成。 表达式是一个逻辑语句,其格式为 Attribute
Operator
Value
.
值受限制,支持以下字符:
- 字母数字字符
- 特殊字符:
@
、.
-
Log Analytics 精细 RBAC 支持表和列/值属性:
特性源 | 显示名称 | 类型 | DESCRIPTION | 属性名称 |
---|---|---|---|---|
资源 | 表名称 | 字符串 | 用于授予/限制的表名。 | Microsoft.OperationalInsights/workspaces/tables:`<name>` |
资源 | 列值(键为列名) | 字典(键值) | 列名和值。 列名为键。 列中的数据值为值。 | Microsoft.OperationalInsights/workspaces/tables/record:<key> |
下面是一个示例屏幕截图,展示了使用 Azure 门户配置的精细 RBAC 角色分配条件,采用的是“无权访问数据,除非允许”的方法。
通过在你设置的匹配条件范围内配置精细 RBAC 角色分配来降低复杂性。 例如,如果您的自定义角色是在某个资源组范围内分配的,则其他工作区可能没有您表达式中指定的表或列资源,这可能导致您的条件被意外应用。
但是,如果在表级别为角色分配设置了条件,则必须创建两个角色,如下所示:
- 角色 1:Action:针对表的工作区的
Microsoft.OperationalInsights/workspaces/query/read
。 - 角色 2:DataAction:针对此工作区内表的
Microsoft.OperationalInsights/workspaces/tables/data/read
。 使用数据操作对角色定义条件。
若要避免创建两个角色,请使用最简单的方法:在工作区分配角色并设置用于控制表级别的条件。
有关详细信息,请参阅 Azure RBAC 范围级别。
表达式运算符
精细的 RBAC 表达式使用基于属性的访问控制 (ABAC)运算符的子集。
表名属性支持四个运算符。 这些运算符使你可以在设置条件时灵活地匹配表名的值。
ABAC 运算符 | DESCRIPTION |
---|---|
StringEquals |
区分大小写的匹配。 值必须与字符串完全匹配。 |
StringNotEquals |
StringEquals 的求反。 |
ForAllOfAnyValues:StringEquals |
在逻辑上等效于 in() . 如果左侧每个值都满足与右侧至少一个值进行比较的条件,则表达式求值结果为 true。 |
ForAllOfAllValues:StringNotEquals |
在逻辑上等效于 !in() . 如果左侧的每个值都满足与右侧至少一个值的比较,则表达式的计算结果为 false。 |
Log Analytics 中为列值定义的 ABAC 条件基于该列中的数据。 只能比较字符串数据类型。 对于行级访问属性,任何强制转换都完全基于 KQL 行为。
下表显示了支持的 ABAC 表达式运算符。 为便于理解,列出了等效的 Kusto 运算符。
ABAC 运算符 | Kusto 等效运算符 | DESCRIPTION |
---|---|---|
StringEquals / StringEqualsIgnoreCase |
== / =~ |
区分大小写的(或不区分大小写的)匹配。 值必须与字符串完全匹配。 |
StringNotEquals / StringNotEqualsIgnoreCase |
!= / !~ |
StringEquals(或 StringEqualsIgnoreCase)的求反。 |
StringLike / StringLikeIgnoreCase |
has_cs / has |
区分大小写的(或不区分大小写的)匹配。 运算符的右侧 (RHS) 是左侧 (LHS) 的整个字词。 |
StringNotLike / StringNotLikeIgnoreCase |
!has_cs / !has |
StringLike(或 StringLikeIgnoreCase)运算符的求反 |
StringStartsWith / StringStartsWithIgnoreCase |
startswith_cs / startswith |
区分大小写的(或不区分大小写的)匹配。 该值以字符串开头。 |
StringNotStartsWith / StringNotStartsWithIgnoreCase |
!startswith_cs / !startswith |
StringStartsWith(或 StringStartsWithIgnoreCase)运算符的求反。 |
ForAllOfAnyValues:StringEquals / ForAllOfAnyValues:StringEqualsIgnoreCase ForAllOfAllValues:StringNotEquals / ForAllOfAllValues:StringNotEqualsIgnoreCase ForAnyOfAnyValues:StringLikeIgnoreCase |
In / In~ !in / !in~ has_any |
“ForAllOfAnyValues:<BooleanFunction>”支持多个字符串和数字。 如果左侧的每个值都满足与右侧至少一个值的比较,则表达式的计算结果为 true。 |
不直接在函数上设置 ABAC 条件。 如果在表上设置条件,则它将传播到依赖于它的任何函数。 有关运算符和术语的详细信息,请参阅 字符串运算符。
小窍门
使用转换来丰富数据、更改数据类型和更改大小写,以便更好地适应 ABAC 表达式。 如果数据不支持要应用的条件,转换也是解决方案。 例如,若要将条件应用于具有高基数的数据(例如 IP 范围),请使用转换按子网名称对属于所选子网的 IP 进行分组。
有关详细信息,请参阅 Azure Monitor 中的数据收集转换。
注意事项
在 Log Analytics 中使用精细 RBAC 时,有几个注意事项适用。 以下部分提供了具体说明。
- 粒度 RBAC 仅在公有云中可用。
日志分析
- 搜索作业和摘要规则计划用于精细的 RBAC 支持,但不包括数据导出。 对于所有这些体验,如果查询表不存在完全访问权限,则用户无法配置搜索作业或规则并收到错误。
- 警报:仅支持基于托管标识的日志警报。
- Application Insights:仅支持基于工作区的 Application Insights。
Microsoft Sentinel
使用搜寻、书签和事件从原始表复制数据时,复制的数据不受 ABAC 条件的保护。
Azure ABAC 和 RBAC
应用正常的 Azure RBAC 和 ABAC 限制。 例如,每个订阅的最大角色分配阈值是 RBAC 的 Azure 服务限制。 Azure ABAC 限制每个条件的表达式数和条件的总体大小(以 KB 为单位)。 如需了解更多信息,请参阅以下文章:
审核和监视
对角色分配的更改记录在 Azure 活动日志中。 LAQueryLogs
表格中的用户查询指示查询是否在 ConditionalDataAccess
列中使用相应的 ABAC 访问条件执行。 使用 Log Analytics 工作区中的诊断设置启用日志。 有关详细信息,请参阅 Azure Monitor 日志诊断设置。
常见问题解答
我正在通过资源上下文访问日志。 是否可以强制实施我的条件?
对资源上下文查询强制实施 RBAC 和 ABAC,但要求包含资源日志的工作区满足以下先决条件:
- 将所有相关工作区的 访问控制模式 设置为 “需要工作区权限”。
如果设置为 “使用资源或工作区权限”,则分配给资源的 Azure 读取权限提供对所有日志的访问权限。 工作区和 ABAC 权限被忽略。 - 对所有相关工作区设置 ABAC。
有关详细信息,请参阅 管理对 Log Analytics 工作区的访问、访问模式。
导出表格时,细粒度的 RBAC 条件会保留吗?
精细 RBAC 条件仅对查询强制执行。 例如,使用工作区数据导出功能成功导出的数据不会保持针对目标表的数据的 ABAC 条件。
如何根据数据分类配置访问权限?
若要实现Bell-LaPadula样式访问模型,必须显式设置 ABAC 条件以坚持诸如向下读取之类的原则。 例如,具有顶级机密权限的用户必须显式为较低级别(如机密、机密和未分类)设置权限,以确保他们可以访问低于其最高分配级别的数据。