查询 Azure 资源的日志
在 Azure Monitor Log Analytics 中,查询通常在工作区的上下文中执行。 一个工作区可以包含许多资源的数据,因此很难隔离特定资源的数据。 此外,资源还可将数据发送到多个工作区。 为了简化这种体验,REST API 允许直接查询 Azure 资源以获取其日志。
响应格式
Azure 资源查询会生成与针对 Log Analytics 工作区的查询相同的响应形状。
URL 格式
假设某个 Azure 资源使用完全限定的标识符:
/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>
针对直接 API 终结点查询此资源的日志时会转到以下 URL:
https://api.loganalytics.azure.cn/v1/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>/query
通过 ARM 对同一资源运行的查询将使用以下 URL:
https://management.chinacloudapi.cn/subscriptions/<sid>/resourceGroups/<rg>/providers/<providerName>/<resourceType>/<resourceName>/providers/microsoft.insights/logs?api-version=2018-03-01-preview
实质上,此 URL 是完全限定的 Azure 资源加上扩展提供程序:/providers/microsoft.insights/logs
。
表访问和 RBAC
microsoft.insights
资源提供程序公开一组新的操作,用于在表级别控制对日志的访问。 对于名为 tableName
的表,这些操作采用以下格式。
microsoft.insights/logs/<tableName>/read
可以使用“actions”属性将此权限添加到角色以允许指定的表,并使用“notActions”属性来禁止指定的表。
工作区访问控制
现在,Azure 资源查询会查找用作可能数据源的 Log Analytics 工作区。 但是,管理员可能已通过 RBAC 角色锁定了对工作区的访问。 默认情况下,API 仅返回用户有权访问的工作区中的结果。
工作区管理员可能希望在不破坏现有 RBAC 的情况下利用 Azure 资源查询,从而创建用户有权在其中读取 Azure 资源日志,但无权查询包含这些日志的工作区的方案。 工作区管理员资源,用于通过工作区上的布尔属性查看日志。 这样,用户就可以访问与特定工作区中的目标 Azure 资源相关的日志,前提是用户有权读取目标 Azure 资源的日志。
这是将访问范围限定为工作区级别的表的操作:
microsoft.operationalinsights/workspaces/query/<tableName>/read
错误响应
下面简要列出了查询 Azure 资源时出现的常见失败情况以及有症状行为的说明。
Azure 资源不存在
HTTP/1.1 404 Not Found
{
"error": {
"message": "The resource /subscriptions/7fd50ca7-1e78-4144-ab9c-0ec2faafa046/resourcegroups/test-rg/providers/microsoft.storage/storageaccounts/exampleResource was not found",
"code": "ResourceNotFoundError"
}
}
无权访问资源
HTTP/1.1 403 Forbidden
{
"error": {
"message": "The provided credentials have insufficient access to perform the requested operation",
"code": "InsufficientAccessError",
"innererror": {
"code": "AuthorizationFailedError",
"message": "User '92eba38a-70da-42b0-ab83-ffe82cce658f' does not have access to read logs for this resource"
}
}
资源中没有日志,或者对包含这些日志的工作区没有权限
根据数据和权限的精确组合,响应将包含 200 无结果数据错误,或者引发语法错误(4xx 错误)。
部分访问权限
在某些情况下,用户可能对特定资源的日志拥有部分访问权限。 当用户缺少以下任一访问权限时:
- 对包含 Azure 资源日志的工作区的访问权限
- 对查询中的表引用的访问权限
用户将看到正常响应,但他们无权访问的数据源将以静默方式筛选掉。若要查看有关用户对 Azure 资源、基础 Log Analytics 工作区和特定表的访问权限的信息,请在请求中包含标头 Prefer: include-permissions=true
。 这会导致响应 JSON 包含如下所示的部分:
{
"permissions": {
"resources": [
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.Compute/virtualMachines/VM1",
"dataSources": [
"/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS1"
]
},
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.Compute/virtualMachines/VM2",
"denyTables": [
"SecurityEvent",
"SecurityBaseline"
],
"dataSources": [
"/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS2",
"/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS3"
]
}
],
"dataSources": [
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS1",
"denyTables": [
"Tables.Custom"
]
},
{
"resourceId": "/subscriptions/<id>/resourceGroups<id>/providers/Microsoft.OperationalInsights/workspaces/WS2"
}
]
}
}
resources
有效负载描述查询两个 VM 的尝试。 VM1 将数据发送到工作区 WS1,而 VM2 将数据发送到两个工作区:WS2 和 WS3。 此外,用户无权查询资源的 SecurityEvent
或 SecurityBaseline
表。
dataSources
有效负载通过描述用户可查询的工作区来进一步筛选结果。 此处用户无权查询 WS3,以及从 WS1 中筛选出的另一个表。
下面清楚地说明了此类查询会返回哪些数据:
- WS1 中 VM1 的日志,不包括工作区中的 Tables.Custom。
- WS2 中 VM2 的日志,不包括 SecurityEvent 和 SecurityBaseline。