1 审计的背景
1.1 审计的原理
在使用数据库存取数据的大部分场景中,数据库具有以下特点:
- 对象多:一个数据库集群中有多个database对象,1个database对象中有多个schema对象,1个schema对象中有多个table、index等对象
- 用户多:一个数据库中,有多个用户,每个用户可访问的数据库对象不同
- 应用多:多个应用将数据存储在同一数据库集群中,并同时访问数据库集群
- 操作多:数据库提供丰富的功能,包括DDL、DML、DCL、运维等
- 运行久:一个数据库集群,可能会保持数十年运行
审计的主要目的,使记录数据运行过程中发生了哪些事件。审计的3要素是:
- 主体:一般指数据库用户
- 客体:一般指数据库对象,包括:集群、数据对象(database、schema、table、index、function等)、用户等
- 操作:主体对客体的操作,比如某个用户访问了某个表
1.2 审计的目的
审计具有以下重要意义:
- 合法合规:《网络安全法》等法律法规与表中中,要求应用通过《等保测评》等标准,标准中要求应用具备审计功能
- 故障检测:当数据库出现故障时,协助快速定位问题
- 攻击检测:通过检查审计日志,可判断是否发生网络安全攻击事件
- 例行维护:通过检查审计日志,可跟踪对某个对象的访问信息
- …
等保测评要求标准(GB/T 28448)中,对审计的要求如下:
- 审计范围
- 全面性
- 细粒度:登录、访问、修改、删除等
- 审计内容
- 用户行为:登录、登出、权限变更
- 数据访问:敏感数据查询、插入、更新、删除等
- 异常行为:登录失败、非法访问
- 审计记录
- 详细性:时间戳、用户标识、操作类型、操作结果、IP地址等
- 不可篡改:真实性、完整性
- 存储安全:未经授权的访问和修改
- 审计管理
- 审计策略:审计的目标、范围、内容和频率
- 审计分析:定期分析审计记录
- 审计报告
1.3 审计的功能
审计功能包含以下3个部分:
- 配置审计功能:日志存储策略等
- 设置审计范围:设置哪类操作、哪类对象、..需要给设计
- 生成审计日志:运行时,生成审计日志
- 管理审计日志:查询,删除,归档审计日志
1.4 oracle审计
oracle审计的发展:
- oracle 8i及更早:支持传统审计
- oracle 12c:新增支持统一审计
- oracle 23ai:不支持传统审计,仅支持统一审计
oracle统一审计的使用:
-- 1 设置审计范围:创建审计策略
CREATE AUDIT POLICY ap1
PRIVILEGES CREATE TABLE, ALTER USER -- privilege 子句,记录所有使用CreateTable, AlterUser权限的操作,oracle 12c中,支持256种权限
ACTIONS SELECT,INSERT,UPDATE ON t1 -- aciton 子句,记录所有对表t1执行SELECT,INSERT,UPDATE的操作
ROLES r1; -- role 子句,记录所有使用r1角色的操作
-- 2 启用审计策略
AUDIT POLICY ap1;
-- 3 查看审计日志(完整日志)
SELECT * FROM UNIFIED_AUDIT_TRAIL;
-- 查看关键日志
SELECT * FROM DBA_AUDIT_TRAIL; -- 其他:DBA_COMMON_AUDIT_TRAIL, DBA_AUDIT_SESSION, DBA_AUDIT_OBJECT, DBA_FGA_AUDIT_TRAIL
os_username | username | userhost | terminal | timestamp | owner | obj_name | action | action_name |
------------+----------+----------+----------+-----------+-------+----------+--------+-------------+
| new_owner | new_name | obj_privilege | sys_privilege | admin_option | grantee | audit_option | ses_actions |
+----------+----------+---------------+---------------+--------------+---------+--------------+-------------+
logoff_time | logoff_lread | logoff_pwrite | logoff_dlock | comment_text | sessionid | entryid | statementid | returncode |
+-----------+--------------+---------------+--------------+--------------+-----------+---------+-------------+------------+
| priv_used | client_id | econtext_id | session_cpu | extended_timestamp | proxy_sessionid | global_uid | instance_number |
+-----------+-----------+-------------+-------------+--------------------+-----------------+------------+-----------------+
os_process | transactionid | scn | sql_bind | sql_text | obj_edition_name | dbid | rls_info | current_user |
+----------+---------------+-----+----------+----------+------------------+------+----------+--------------+
其中,可设置的权限、操作等范围如下:
-- 所有的 PRIVILEGES
SELECT NAME FROM SYSTEM_PRIVILEGE_MAP;
-- 所有的 ACTION
object | actions
---------------------+--------------------------------------------------------------------------------------------------
Directory | AUDIT, GRANT, READ
Function | AUDIT, EXECUTE, GRANT
Java schema objects | AUDIT, EXECUTE, GRANT
Library | EXECUTE, GRANT
Materialized views | ALTER, AUDIT, COMMENT, DELETE, INDEX, INSERT, LOCK, SELECT, UPDATE
Mining Model | AUDIT, COMMENT, GRANT, RENAME, SELECT
Object type | ALTER, AUDIT, GRANT
Package | AUDIT, EXECUTE, GRANT
Procedure, triggers | AUDIT, EXECUTE, GRANT
Sequence | ALTER, AUDIT, GRANT, SELECT
Table | ALTER, AUDIT, COMMENT, DELETE, FLASHBACK, GRANT, INDEX, INSERT, LOCK, MERGE, RENAME, SELECT, UPDATE
Table or view column | ALL, ALTER, AUDIT, COMMENT, DELETE, GRANT, INDEX, INSERT, SELECT, UPDATE
View | AUDIT, COMMENT, DELETE, FLASHBACK, GRANT, INSERT, LOCK, MERGE, RENAME, SELECT, UPDATE
-- 完整的 CREATE AUDIT POLICY 语法
CREATE AUDIT POLICY policy_name
{ {privilege_audit_clause [action_audit_clause ] [role_audit_clause ]}
| { action_audit_clause [role_audit_clause ] }
| { role_audit_clause }
}
[WHEN audit_condition EVALUATE PER {STATEMENT|SESSION|INSTANCE}]
[ONLY TOPLEVEL]
[CONTAINER = {CURRENT | ALL}];
参考:
1.5 openGauss审计
在opengauss中,审计也分为2个独立的子特性:
- 传统审计:在GUC参数中,配置是否对某类客体、某类操作进行审计(例如:是否审计所有TABLE,是否审计所有DML操作)
- 统一审计:通过SQL语法,定义是否对某个客体、某个主体进行审计(例如:是否审计表t1,是否审计角色rolo1)
opengauss传统审计:
# 1 设置审计范围
gs_guc SET .. -c "audit_login_logout=7"
gs_guc SET .. -c "audit_system_object=67121159" # 审计database, schema, table, ..等对象的create, alter, drop操作
gs_guc SET .. -c "audit_dml_state=1" # 审计insert, update, delete操作
# 设置审计范围的guc参数有20+
-- 2 查询审计日志(存储于:guc audit_directory)
SELECT pg_query_audit('2024-07-12 08:00:00','2024-07-12 17:00:00');
opengauss统一审计:
-- 0 前提:创建资源标签
CREATE TABLE t1 (c1 INT, c2 TEXT);
CREATE RESOURCE LABEL rl1 ADD TABLE(t1); -- 支持 SCHEMA, TABLE, COLUMN, VIEW, FUNCITON
-- 1 设置审计范围
CREATE AUDIT POLICY ap1 ACCESS ALL ON LABEL(rl1); -- 支持 ACCESS ALL, ACCESS {SELECT、COPY、DEALLOCATE、DELETE、EXECUTE、INSERT、PREPARE、REINDEX、TRUNCATE、UPDATE}
CREATE AUDIT POLICY ap2 PRIVILEGES ALL ON LABEL(rl1) FILTER ON ROLES (r1); -- 支持 PRIVILEGES ALL, PRIVILEGES {CREATE、ALTER、DROP、ANALYZE、COMMENT、GRANT、REVOKE、SET、SHOW}
-- 2 查询审计日志 (存储于:/var/log/localmessage)
-- {timestamp} {host} {event type}, user_name: {user_name}, app_name: {app_name}, client_ip: {client_ip}, access type: {access_type}, policy id: {policy_id}, table: {table}, result: {result}
参考