Azure Monitor 中的角色、权限和安全性
本文介绍如何应用基于角色的访问控制 (RBAC) 监视角色来授予或限制访问权限,并讨论 Azure Monitor 相关资源的安全注意事项。
内置监视角色
Azure 基于角色的访问控制 (Azure RBAC) 提供了用于监视的内置角色,可将其分配给用户、组、服务主体和托管标识。 对于读取和写入权限,最常见的角色分别是监视读者和监视参与者。
有关监视角色的详细信息,请参阅 RBAC 监视角色。
监视查阅者
分配了监视查阅者角色的人员可以查看订阅中的所有监视数据,但不能修改任何资源或编辑与监视资源相关的任何设置。 此角色适用于组织中的用户,如支持人员或操作工程师,他们需要执行以下操作:
- 查看 Azure 门户中的监视仪表板。
- 查看 Azure 警报中定义的警报规则。
- 使用 Azure Monitor REST API、PowerShell cmdlet 或跨平台 CLI 查询 Azure Monitor 指标。
- 使用门户、Azure Monitor REST API、PowerShell cmdlet 或跨平台 CLI 查询活动日志。
- 查看资源的诊断设置。
- 查看订阅的日志配置文件。
- 查看自动调整规模设置。
- 查看警报活动和设置。
- 搜索 Log Analytics 工作区数据(包括工作区的使用情况数据)。
- 在 Log Analytics 工作区中检索表架构。
- 在 Log Analytics 工作区中检索和执行日志查询。
- 访问 Application Insights 数据。
注意
此角色不授予已流式传输到事件中心或存储在存储帐户的日志数据的读取访问权限。 有关如何配置对这些资源的访问权限的信息,请参阅本文后面的监视数据的安全注意事项部分。
监视参与者
分配了监视参与者角色的人员可以查看订阅中的所有监视数据。 还可以创建或修改监视设置,但不能修改任何其他资源。
此角色是监视查阅者角色的一个超集。 它适用于组织的监视团队成员或托管服务提供商,除了上述权限外,他们还需要执行以下操作:
- 在门户中查看监视仪表板和创建自己专用的监视仪表板。
- 创建和编辑资源的诊断设置。 1
- 使用 Azure 警报设置警报规则活动和设置。
- 列出 Log Analytics 工作区的共享密钥。
- 在 Log Analytics 工作区中创建、删除和执行已保存的搜索。
- 创建和删除 Log Analytics 工作区存储配置。
- 创建 Application Insights Web 测试和组件。
1 若要创建或编辑诊断设置,用户还必须分别拥有目标资源(存储帐户或事件中心命名空间)的 ListKeys 权限。
注意
此角色不授予已流式传输到事件中心或存储在存储帐户的日志数据的读取访问权限。 有关如何配置对这些资源的访问权限的信息,请参阅本文后面的监视数据的安全注意事项部分。
监视权限和 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/mySubscription")
New-AzRoleDefinition -Role $role
注意
对资源的警报、诊断设置和指标的访问需要用户具有资源类型和该资源的作用域的读取访问权限。 要创建将数据发送到存储帐户或流式传输到事件中心的诊断设置,用户还需要对目标资源具有 ListKeys 权限。
分配角色
注意
建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
若要分配角色,请参阅使用 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
重要
- 确保你具有在指定范围内分配角色所需的权限。 必须对订阅或资源组拥有所有者权限。
- 将访问权限分配给你的资源所属的资源组或订阅,而非资源本身。
PowerShell 查询确定角色成员身份
生成属于给定角色的用户列表会很有帮助。 为了方便生成这些类型的列表,你可以根据特定需求调整以下示例查询。
为管理员角色 + 参与者角色查询整个订阅
(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 RBA 的权限,可以授予该实体特定存储帐户的 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/mySubscription/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/myMonitoringStorageAccount")
New-AzRoleDefinition -Role $role
警告
ListKeys 权限使用户能够列出主要和辅助存储帐户密钥。 这些密钥授予用户该存储帐户中的所有签名服务(blob、队列、表、文件)中的所有签名权限(如读取、写入、创建 blob 和删除 blob)。 如果可以,我们建议使用帐户 SAS。
限制对监视相关的事件中心的访问权限
事件中心可以遵循类似的模式,但首先需要创建专用的侦听授权规则。 如果想要将访问权限授予只需侦听与监视相关的事件中心的应用程序,请执行以下步骤:
在门户中,为事件中心创建共享访问策略,该事件中心是为传输仅包含侦听声明的监视数据而创建的。 例如,你可以将其称为“monitoringReadOnly”。如果可能,将该密钥直接提供给使用者并跳过下一步。
如果使用者需要按需获取密钥,请授予使用者对该事件中心的 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/mySubscription/resourceGroups/myResourceGroup/providers/Microsoft.ServiceBus/namespaces/mySBNameSpace") New-AzRoleDefinition -Role $role