如何审计Snowflake中abcd数据库的查询执行人员与操作记录?
Snowflake原生自带全量查询操作的审计能力,不需要额外部署采集组件,按以下步骤配置即可覆盖所有用户的操作记录,捕获执行用户、执行时间、操作内容等核心信息:
一、基础审计查询(零配置,默认开启)
Snowflake默认会留存账户内所有执行操作的记录,存储在内置系统视图SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY中,默认留存周期为1年,拥有账户监控权限的角色(如ACCOUNTADMIN)可以直接查询获取全量操作数据。
所有操作均为服务端层面采集,无论用户通过网页控制台、JDBC/ODBC驱动、第三方BI工具还是API发起操作,都无法绕过审计,不存在漏采问题。
视图默认包含的核心审计字段完全覆盖需求:执行用户名、执行时使用的角色、会话ID、执行开始/结束时间、SQL文本、执行状态、耗时、扫描数据量、客户端IP、客户端类型、操作关联的数据库/Schema/表对象、报错信息等。
直接用以下SQL即可查询abcd数据库的所有历史操作:
-- 切换到有权限查看全量审计记录的角色 USE ROLE ACCOUNTADMIN; SELECT USER_NAME AS 执行用户, ROLE_NAME AS 执行时所用角色, START_TIME AS 执行开始时间, END_TIME AS 执行结束时间, QUERY_TEXT AS 执行SQL内容, EXECUTION_STATUS AS 执行状态, ERROR_MESSAGE AS 失败报错信息, CLIENT_IP AS 客户端来源IP, CLIENT_APPLICATION AS 客户端工具类型, QUERY_ID AS 操作唯一标识 FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY WHERE -- 筛选目标为abcd数据库的操作 DATABASE_NAME = 'ABCD' -- 按需调整查询的时间范围,示例为近30天 AND START_TIME >= DATEADD('day', -30, CURRENT_TIMESTAMP()) ORDER BY START_TIME DESC;
注意:普通用户默认只能查询自己发起的操作记录,只有被授予ACCOUNTADMIN、AUDITOR或全局MONITOR权限的角色,才能查看全量所有用户的操作日志。
二、长期审计留存配置(适配合规要求)
如果审计数据需要留存超过1年,或者要把审计数据存在自定义业务库中做后续分析,可以通过流+定时任务的方式,自动把增量审计数据同步到abcd库下的自有持久化表:
- 先在abcd库下创建审计专用的Schema和存储表
USE DATABASE ABCD; -- 创建审计专用schema CREATE SCHEMA IF NOT EXISTS AUDIT_LOG; USE SCHEMA AUDIT_LOG; -- 创建审计日志持久化表 CREATE TABLE IF NOT EXISTS ALL_QUERY_AUDIT ( USER_NAME STRING, ROLE_NAME STRING, START_TIME TIMESTAMP_LTZ, END_TIME TIMESTAMP_LTZ, QUERY_TEXT STRING, EXECUTION_STATUS STRING, ERROR_MESSAGE STRING, CLIENT_IP STRING, CLIENT_APPLICATION STRING, QUERY_ID STRING PRIMARY KEY, SYNC_CREATE_TIME TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() );
- 配置增量流和定时同步任务,自动拉取新增的审计记录
-- 创建流对接系统审计视图,捕获增量新增的操作记录 CREATE STREAM IF NOT EXISTS QUERY_HISTORY_STREAM ON VIEW SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY APPEND_ONLY = TRUE; -- 创建每小时执行一次的同步任务,把abcd库相关的增量操作写入自有审计表 CREATE TASK IF NOT EXISTS SYNC_AUDIT_LOG_TASK -- 替换为你自己账号下已有的可用计算仓库 WAREHOUSE = YOUR_EXISTING_WH SCHEDULE = '60 MINUTE' AS INSERT INTO ABCD.AUDIT_LOG.ALL_QUERY_AUDIT ( USER_NAME, ROLE_NAME, START_TIME, END_TIME, QUERY_TEXT, EXECUTION_STATUS, ERROR_MESSAGE, CLIENT_IP, CLIENT_APPLICATION, QUERY_ID ) SELECT USER_NAME, ROLE_NAME, START_TIME, END_TIME, QUERY_TEXT, EXECUTION_STATUS, ERROR_MESSAGE, CLIENT_IP, CLIENT_APPLICATION, QUERY_ID FROM QUERY_HISTORY_STREAM WHERE DATABASE_NAME = 'ABCD' AND METADATA$ACTION = 'INSERT'; -- 启用同步任务 ALTER TASK SYNC_AUDIT_LOG_TASK RESUME;
三、可选增强:实时高危操作告警
如果需要对删库、删表、批量导出敏感数据这类高危操作做实时响应,可以基于审计流配置实时消费规则,触发后直接推送告警到企业内部的运维/安全渠道即可,不需要额外采购第三方审计工具。
内容的提问来源于stack exchange,提问作者jskrajareddy

