다음을 통해 공유


감사 로그 시스템 테이블 참조

중요

이 시스템 테이블은 공개 미리 보기 상태에 있습니다.

이 문서에서는 감사 로그 테이블 스키마를 간략하게 설명하고 일반적인 계정 활동 질문에 대답하기 위해 감사 로그 시스템 테이블과 함께 사용할 수 있는 샘플 쿼리가 있습니다. 감사 로그 이벤트에 대한 자세한 내용은 진단 로그 참조를 참조하세요.

테이블 경로: 이 시스템 테이블은 system.access.audit있습니다.

감사 로그 고려 사항

  • 대부분의 감사 로그는 작업 영역의 지역에서만 사용할 수 있습니다.
  • 계정 수준 감사 로그는 workspace_id0로 기록합니다.

감사 로그 시스템 테이블 스키마

감사 로그 시스템 테이블은 다음 스키마를 사용합니다.

열 이름 데이터 형식 설명 예시
account_id 문자열 계정의 ID 23e22ba4-87b9-4cc2-9770-d10b894bxx
workspace_id 문자열 작업 영역의 ID 1234567890123456
version 문자열 감사 로그 스키마 버전 2.0
event_time 시간표시 이벤트의 타임스탬프입니다. 표준 시간대 정보는 UTC 표준 시간대를 나타내는 +00:00 사용하여 값의 끝에 기록됩니다. 2023-01-01T01:01:01.123+00:00
event_date 날짜 작업이 수행된 일정 날짜 2023-01-01
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 구조체 (struct) 사용자 시작 요청의 ID {"email": "user@domain.com",
"subjectName": null}
service_name 문자열 서비스 이름 시작 요청 unityCatalog
action_name 문자열 감사 로그에 캡처된 이벤트의 범주 getTable
request_id 문자열 요청 ID ServiceMain-4529754264
request_params 지도 모든 요청 매개 변수를 포함하는 키 값의 맵입니다. 요청 유형에 따라 다름 [["full_name_arg", "user.chat.messages"],
["workspace_id", "123456789"],
["metastore_id", "123456789"]]
response 구조체 (struct) 응답 반환 값의 구조체 {"statusCode": 200, "errorMessage": null,
"result": null}
audit_level 문자열 작업 영역 또는 계정 수준 이벤트 ACCOUNT_LEVEL
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

지난 7일 이내에 테이블에 액세스한 사용자는 무엇입니까?

이 쿼리가 작동하려면 쿼리 매개 변수에 테이블 경로 정보를 입력합니다.

비고

전체 이름은 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

가장 최근에 실행된 Notebook 명령 보기

이 쿼리는 가장 최근에 실행된 Notebook 명령과 명령을 실행한 사용자를 반환합니다.

비고

자세한 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,
  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"] = "<oauth2-app-client-id>"
GROUP BY
  event_date,
  workspace_id,
  user_email,
  username

<oauth2-app-client-id>을(를) 특정 Databricks 앱에 할당된 서비스 주체의 OAuth2 앱 클라이언트 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

가장 최근에 만든 Databricks 앱은 무엇입니까?

이 쿼리는 만들기 이벤트의 타임스탬프를 기준으로 정렬된 앱의 이름, 작성자 및 생성 날짜를 포함한 앱 만들기 이벤트를 반환합니다.

SELECT
  event_time,
  user_identity.email AS email,
  action_name,
  get_json_object(request_params.app, '$.name') AS app_name
FROM
  system.access.audit
WHERE
  action_name == "createApp"
ORDER BY
  event_time DESC

Databricks Apps 사용자의 최신 작업은 무엇인가요?

이 쿼리는 이벤트의 타임스탬프를 기준으로 정렬된 Databricks Apps 사용자의 최근 작업을 반환합니다.

SELECT
  event_time,
  user_identity.email AS email,
  service_name,
  action_name
FROM
  system.access.audit
WHERE
  service_name = 'apps'
AND
  user_identity.email = '<user-email>'
ORDER BY
  event_time DESC