审核日志系统表引用

重要

此系统表为公共预览版。 若要访问表,必须在 system 目录中启用架构。 有关详细信息,请参阅启用系统表架构

本文概述了审核日志表架构,并提供了可用于审核日志系统表的示例查询来回答常见的帐户活动问题。 有关审核日志事件的信息,请参阅诊断日志参考

表路径:此系统表位于 system.access.audit.

审核日志注意事项

  • 大多数审核日志仅在工作区的区域中可用。
  • 帐户级审核日志将 workspace_id 记录为 0

审核日志系统表架构

审核日志系统表使用以下架构:

列名称 数据类型 说明 示例
version 字符串 审核日志架构版本 2.0
event_time timestamp 事件时间戳。 时区信息记录在值的末尾,其中 +00:00 表示 UTC 时区。 2023-01-01T01:01:01.123+00:00
event_date date 操作发生的日历日期 2023-01-01
workspace_id long 工作区的 ID 1234567890123456
source_ip_address 字符串 请求的来源 IP 地址 10.30.0.242
user_agent 字符串 请求的来源 Apache-HttpClient/4.5.13 (Java/1.8.0_345)
session_id 字符串 请求源自的会话的 ID 123456789
user_identity 字符串 发起请求的用户的标识 {"email": "user@domain.com",
"subjectName": null}
service_name 字符串 发起请求的服务名称 unityCatalog
action_name 字符串 审核日志中捕获的事件类别 getTable
request_id 字符串 请求 ID ServiceMain-4529754264
request_params map 包含所有请求参数的键值的映射。 取决于请求类型 [["full_name_arg", "user.chat.messages"],
["workspace_id", "123456789"],
["metastore_id", "123456789"]]
response struct 响应返回值的结构 {"statusCode": 200, "errorMessage": null,
"result": null}
audit_level 字符串 工作区或帐户级别事件 ACCOUNT_LEVEL
account_id 字符串 帐户 ID 23e22ba4-87b9-4cc2-9770-d10b894bxx
event_id 字符串 事件的 ID 34ac703c772f3549dcc8671f654950f0
identity_metadata struct 操作涉及的标识,包括 run_byrun_as。 请参阅审核组专用计算活动 {run_by: example@email.com;
run_as: example@email.com;

示例查询

以下部分包括可用于深入了解审核日志系统表的示例 SQL 查询。

注意

一些示例包括默认未启用的详细审核日志事件。 若要在工作区中启用详细审核日志,请参阅启用详细审核日志

本文包括以下示例查询:

谁可以访问此表?

此查询使用 information_schema 确定哪些用户对表具有权限。 输入目录、架构和表名称参数的值。

SELECT DISTINCT(grantee), privilege_type, 'catalog' AS level
FROM system.information_schema.catalog_privileges
WHERE
  catalog_name = :catalog_name
UNION
SELECT DISTINCT(grantee), privilege_type, 'schema' AS level
FROM system.information_schema.schema_privileges
WHERE
  catalog_name = :catalog_name AND schema_name = :schema_name
UNION
SELECT DISTINCT(grantee) AS `accessible by`, privilege_type, 'table' AS level
FROM
  system.information_schema.table_privileges
WHERE
  table_catalog = :catalog_name AND table_schema = :schema_name AND table_name = :table_name
UNION
SELECT table_owner, 'ALL_PRIVILEGES' AS privilege_type, 'owner' AS level
FROM system.information_schema.tables
WHERE
  table_catalog = :catalog_name AND table_schema = :schema_name AND table_name = :table_name

哪些用户在最近七天内访问了一个表?

要使此查询正常工作,请在查询参数中输入表路径信息。

注意

不会在 DML 操作的日志中捕获全名。 包括架构和简单名称以捕获所有内容。

SELECT
  user_identity.email as `User`,
  IFNULL(
    request_params.full_name_arg,
    request_params.name
  ) AS `Table`,
  action_name AS `Type of Access`,
  event_time AS `Time of Access`
FROM
  system.access.audit
WHERE
  (
    request_params.full_name_arg = :table_full_name
    OR (
      request_params.name = :table_name
      AND request_params.schema_name = :schema_name
    )
  )
  AND action_name IN ('createTable', 'getTable', 'deleteTable')
  AND event_date > now() - interval 7 day
ORDER BY
  event_date DESC

用户最近访问哪些表?

要使此查询正常工作,请在 :User 参数中输入用户的电子邮件,并在 :days_ago 参数中输入数字。

SELECT
  action_name as `EVENT`,
  event_time as `WHEN`,
  IFNULL(request_params.full_name_arg, 'Non-specific') AS `TABLE ACCESSED`,
  IFNULL(request_params.commandText, 'GET table') AS `QUERY TEXT`
FROM
  system.access.audit
WHERE
  user_identity.email = :User
  AND action_name IN (
    'createTable',
    'commandSubmit',
    'getTable',
    'deleteTable'
  )
  AND datediff(now(), event_date) < :days_ago
ORDER BY
  event_date DESC

示例结果

EVENT WHEN TABLE ACCESSED QUERY TEXT
getTable 2023-05-31 system.access.audit GET table
getTable 2023-05-31 system.access.table_lineage GET table
commandSubmit 2023-05-31 Non-specific show functions;
commandSubmit 2023-05-31 Non-specific SELECT

request_params

FROM

system.access.audit

WHERE

service_name = "notebook"

AND action_name = "moveFolder"

LIMIT

5

查看所有安全对象的权限更改

此查询将为帐户中发生的每个权限更改返回一个事件。 此查询将返回进行更改的用户、安全对象类型和名称以及所做的特定更改。

SELECT event_time, user_identity.email, request_params.securable_type, request_params.securable_full_name, request_params.changes
FROM system.access.audit
WHERE service_name = 'unityCatalog'
  AND action_name = 'updatePermissions'
ORDER BY 1 DESC

查看最近运行的笔记本命令

此查询返回最近运行的笔记本命令和运行该命令的用户。

注意

仅当启用了详细审核日志时,才会发出 runCommand 操作。 若要启用详细审核日志,请参阅启用详细审核日志

SELECT event_time, user_identity.email, request_params.commandText
FROM system.access.audit
WHERE action_name = `runCommand`
ORDER BY event_time DESC
LIMIT 100

哪些用户已登录到 Databricks 应用?

此查询为每个登录到 Databricks 应用实例返回一个事件。

SELECT
  event_date,
  workspace_id,
  request_params.request_object_id as app,
  user_identity.email as user_email,
  user_identity.subject_name as username
FROM
  system.access.audit
WHERE
  action_name IN ("workspaceInHouseOAuthClientAuthentication", "mintOAuthToken", "mintOAuthAuthorizationCode")
AND
  request_params["client_id"] LIKE "{{application-ID}}"
GROUP BY
  event_date,
  workspace_id,
  app,
  user_email,
  username

替换为{{application-ID}}分配给特定 Databricks 应用的服务主体的应用程序 ID 值。 可以在托管应用的 Databricks 工作区的管理员设置中找到此值。

哪些 Databricks 应用已更新,以更改如何将应用与其他用户或组共享?

此查询返回权限更新的事件,以更改对 Databricks 应用的访问权限,包括权限类型、分配新权限的用户或组以及提交更改的用户。

SELECT
  event_date,
  workspace_id,
  request_params['request_object_id'] as app,
  user_identity['email'] as sharing_user,
  acl_entry['group_name'],
  acl_entry['user_name'],
  acl_entry['permission_level']
FROM
  system.access.audit t
LATERAL VIEW
  explode(from_json(request_params['access_control_list'], 'array<struct<user_name:string,permission_level:string,group_name:string>>')) acl_entry AS acl_entry
WHERE
  action_name = 'changeAppsAcl'
AND
  request_params['request_object_type'] = 'apps'
ORDER BY
  event_date DESC