Azure Monitor 中的角色、权限和安全性

本文介绍如何应用基于角色的访问控制 (RBAC) 监视角色来授予或限制访问权限,并讨论 Azure Monitor 相关资源的安全注意事项。

内置监视角色

Azure基于角色的访问控制(Azure RBAC)提供内置角色,用于监视以分配给用户、组、服务主体和托管标识。 最常见的角色分别是 “监视读取者 ”和 “监视参与者 ”,分别用于读取和写入权限。 分配角色时,请指定角色分配的范围。 可以在订阅、资源组或资源级别分配角色。 范围越广,角色分配所适用的资源越多。 在适当的范围内分配角色,以仅限制对用户所需的资源的访问权限。

有关监视角色的详细信息,请参阅 RBAC 监视角色

监控读取器与监控贡献者

监视参与者是监视读取者的超集。 下表一目了然地比较这两个角色。 有关功能的完整列表,请参阅以下部分。

Capability 监视读取者 监视参与者
查看监视数据、仪表板、指标和警报 是的 是的
查询活动日志和Log Analytics工作区数据 是的 是的
查看诊断设置、自动缩放设置和 Application Insights 数据 是的 是的
创建专用监视仪表板 是的
创建和编辑诊断设置 1
设置警报规则和警报设置 是的
列出Log Analytics工作区的共享密钥 是的
创建、删除和运行保存的搜索 是的
为 Application Insights 创建 Web 测试和组件 是的

1ListKeys 先决条件: 创建或编辑一个诊断设置,用于将数据发送到存储帐户或流到事件中心,除了监视参与者角色外,还需要对目标资源(存储帐户或事件中心命名空间)具有 ListKeys 权限。 对于仅需要监视访问权限的用户,应仅在资源或资源组范围内授予 ListKeys,绝不要在订阅范围内授予。 有关详细信息,请参阅 监视数据的安全注意事项

这两个角色都不授予对流式传输到事件中心或存储在存储帐户中的日志数据的读取权限。 若要配置对该数据的访问权限,请参阅 监视数据的安全注意事项

监视读取者

分配了监视查阅者角色的人员可以查看订阅中的所有监视数据,但不能修改任何资源或编辑与监视资源相关的任何设置。 此角色适用于组织中的用户,如支持人员或操作工程师,他们需要执行以下操作:

  • 查看 Azure 门户中的监视仪表板。
  • 查看 Azure 警报中定义的警报规则。
  • 使用 Azure Monitor REST APIPowerShell cmdletAzure CLI查询Azure Monitor指标。
  • 使用门户、Azure Monitor REST API、PowerShell cmdlet 或Azure CLI查询活动日志。
  • 查看资源的诊断设置
  • 查看订阅的日志配置文件。 日志配置文件是用于路由活动日志的旧功能。 不要基于它们生成新的依赖项。
  • 查看自动缩放设置。
  • 查看警报活动和设置。
  • 搜索 Log Analytics 工作区数据(包括工作区的使用情况数据)。
  • 在 Log Analytics 工作区中检索表架构。
  • 在 Log Analytics 工作区中检索和执行日志查询。
  • 访问 Application Insights 数据。

监视参与者

分配了监视参与者角色的人员可以查看订阅中的所有监视数据。 还可以创建或修改监视设置,但不能修改任何其他资源。

此角色是“监视读取者”角色的超集。 它适用于组织的监视团队成员或托管服务提供商,除了上述权限外,他们还需要执行以下操作:

  • 在门户中查看监视仪表板和创建自己专用的监视仪表板。
  • 创建和编辑资源的诊断设置。 创建或编辑诊断设置还需要 ListKeys 先决条件
  • 使用 Azure 警报设置警报规则活动和设置。
  • 列出 Log Analytics 工作区的共享密钥。
  • 在 Log Analytics 工作区中创建、删除和执行已保存的搜索。
  • 创建和删除 Log Analytics 工作区存储配置。
  • 创建 Application Insights Web 测试和组件。

监视权限和 Azure 自定义角色

如果内置角色不符合团队的需求,请创建具有精细权限的Azure自定义角色

例如,使用以下 PowerShell 脚本,使用精细权限为活动日志读取者创建Azure自定义角色。

$role = Get-AzRoleDefinition "Reader"
$role.Id = $null
$role.Name = "Activity Log Reader"
$role.Description = "Can view activity logs."
$role.Actions.Clear()
$role.Actions.Add("Microsoft.Insights/eventtypes/*")
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add("/subscriptions/<SubscriptionId>")
New-AzRoleDefinition -Role $role 

访问资源的警报、诊断设置和指标需要对该资源的资源类型和范围具有读取访问权限。 创建将数据发送到存储帐户或流到事件中心的诊断设置也需要 ListKeys 先决条件

分配角色

若要分配角色,请参阅使用 Azure PowerShell 分配 Azure 角色

例如,以下 PowerShell 脚本会将角色分配给指定用户。

<RoleId> 替换为要分配的 RBAC 监视角色 ID。

<SubscriptionID><ResourceGroupName><UserPrincipalName> 替换为适合你的环境的值。

# Define variables
$SubscriptionId = "<SubscriptionID>"
$ResourceGroupName = "<ResourceGroupName>"
$UserPrincipalName = "<UserPrincipalName>"  # The UPN of the user to whom you want to assign the role
$RoleId = "<RoleId>"  # The ID of the role

# Get the user object
$User = Get-AzADUser -UserPrincipalName $UserPrincipalName

# Define the scope (e.g., subscription or resource group level)
$Scope = "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName"

# Assign the role
New-AzRoleAssignment -ObjectId $User.Id -RoleDefinitionId $RoleId -Scope $Scope

若要改用门户,请参阅使用 Azure 门户分配Azure角色

重要

  • 若要分配角色,您需要具有 所有者基于角色的访问控制管理员用户访问管理员 角色,或者具有在目标作用域授予 Microsoft.Authorization/roleAssignments/write 权限的自定义角色。
  • 在订阅、资源组或资源范围内分配访问权限。 使用满足要求的最窄范围。

PowerShell 查询确定角色成员身份

生成属于给定角色的用户列表会很有帮助。 为了方便生成这些类型的列表,你可以根据特定需求调整以下示例查询。

为管理员角色 + 参与者角色查询整个订阅

-IncludeClassicAdministrators 参数以及经典的 ServiceAdministratorCoAdministrator 角色均为遗留项。 Azure 2024 年 8 月停用的经典管理员角色,因此此查询通常不返回经典管理员条目。 它仅适用于仍引用这些角色的环境。

(Get-AzRoleAssignment -IncludeClassicAdministrators | Where-Object {$_.RoleDefinitionName -in @('ServiceAdministrator', 'CoAdministrator', 'Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "

在所有者和参与者的特定 Application Insights 资源的上下文中进行查询

$resourceGroup = "ResourceGroupName"
$resourceName = "AppInsightsName"
$resourceType = "microsoft.insights/components"
(Get-AzRoleAssignment -ResourceGroup $resourceGroup -ResourceType $resourceType -ResourceName $resourceName | Where-Object {$_.RoleDefinitionName -in @('Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "

在所有者和参与者的特定资源组的上下文中进行查询

$resourceGroup = "ResourceGroupName"
(Get-AzRoleAssignment -ResourceGroup $resourceGroup | Where-Object {$_.RoleDefinitionName -in @('Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "

监视数据的安全注意事项

Azure Monitor 中的数据可在存储帐户中发送,或者流式传输到事件中心,这两者都是通用的 Azure 资源。 由于这些是通用的资源,因此创建、删除和访问它们是一项预留给管理员的权限操作。 由于此数据可能包含敏感信息(例如 IP 地址或用户名),因此请对与监视相关的资源采用以下做法来防止滥用:

  • 使用单个、专用存储帐户来监视数据。 如果需要将监视数据分成多个存储帐户,则存储帐户应仅用于监视数据。 如果共享用于监视的存储帐户和其他类型的数据,则可能会无意中向仅应访问监视数据的组织授予对其他数据的访问权限。 例如,安全信息和事件管理的非 Microsoft 组织应仅需访问监视数据。
  • 与上述原因相同,请对所有诊断设置使用单个、专用的服务总线或事件中心命名空间。
  • 通过将与监视相关的存储帐户或事件中心保存在单独的资源组中来限制对它们的访问。 对监视角色使用范围,将监视角色限制为只能访问该资源组。
  • 当用户只需访问监视数据时,绝不应授予订阅范围内的存储帐户或事件中心的 ListKeys 权限。 相反,应在资源或资源组级别授予用户这些权限(如果您有专用的监视资源组)。

当用户或应用程序需要访问存储帐户中的监视数据时,请在包含监视数据且对 blob 存储具有服务级只读访问权限的存储帐户中生成共享访问签名 (SAS)。 在 PowerShell 中,帐户 SAS 可能类似于以下代码:

$context = New-AzStorageContext -Environment AzureChinaCloud -ConnectionString "[connection string for your monitoring Storage Account]"
$token = New-AzStorageAccountSASToken -ResourceType Service -Service Blob -Permission "rl" -Context $context

将令牌提供给需要从该存储账户读取数据的实体。 该实体可以列出和读取该存储帐户中的所有 Blob。

或者,若要通过 Azure RBAC 控制此权限,请向该实体Microsoft.Storage/storageAccounts/listkeys/action授予该特定存储帐户的权限。 对于需要设置诊断设备来将数据发送到存储帐户的用户来说,此权限是必需的。 例如,为需要从一个存储帐户读取的用户或应用程序创建以下Azure自定义角色:

$role = Get-AzRoleDefinition "Reader"
$role.Id = $null
$role.Name = "Monitoring Storage Account Reader"
$role.Description = "Can get the storage account keys for a monitoring storage account."
$role.Actions.Clear()
$role.Actions.Add("Microsoft.Storage/storageAccounts/listkeys/action")
$role.Actions.Add("Microsoft.Storage/storageAccounts/Read")
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add("/subscriptions/<SubscriptionId>/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/myMonitoringStorageAccount")
New-AzRoleDefinition -Role $role 

警告

ListKeys 权限使用户能够列出主要和辅助存储帐户密钥。 这些密钥授予用户该存储帐户中的所有签名服务(blob、队列、表、文件)中的所有签名权限(如读取、写入、创建 blob 和删除 blob)。 如果可以,我们建议使用帐户 SAS。

遵循与事件中心类似的模式,但首先创建用于侦听的专用授权规则。 若要向仅需侦听监视相关事件中心的应用授予访问权限,请执行以下步骤:

  1. 在门户中,为事件中心创建共享访问策略,这些事件中心是为传输仅包含侦听声明的监视数据而创建的。 例如,你可以将其称为“monitoringReadOnly”。如果可能,将该密钥直接提供给使用者并跳过下一步。

  2. 如果使用者需要按需获取密钥,请向该用户授予该事件中心的 ListKeys 操作权限。 对于需要将诊断设置以流式传输到事件中心的用户,还需要执行此步骤。 例如,可以创建一条 Azure RBAC 规则:

    $role = Get-AzRoleDefinition "Reader"
    $role.Id = $null
    $role.Name = "Monitoring Event Hub Listener"
    $role.Description = "Can get the key to listen to an event hub streaming monitoring data."
    $role.Actions.Clear()
    $role.Actions.Add("Microsoft.EventHub/namespaces/authorizationrules/listkeys/action")
    $role.Actions.Add("Microsoft.EventHub/namespaces/Read")
    $role.AssignableScopes.Clear()
    $role.AssignableScopes.Add("/subscriptions/<SubscriptionId>/resourceGroups/myResourceGroup/providers/Microsoft.EventHub/namespaces/myEventHubNamespace")
    New-AzRoleDefinition -Role $role 
    

后续步骤