查询 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。 此外,用户无权查询资源的 SecurityEventSecurityBaseline 表。

dataSources 有效负载通过描述用户可查询的工作区来进一步筛选结果。 此处用户无权查询 WS3,以及从 WS1 中筛选出的另一个表。

下面清楚地说明了此类查询会返回哪些数据:

  • WS1 中 VM1 的日志,不包括工作区中的 Tables.Custom。
  • WS2 中 VM2 的日志,不包括 SecurityEvent 和 SecurityBaseline。