记录是同步写入还是异步写入,使发生错误时情况有些不同。在异步方式中,可能会有某些记录丢失,因为审计记录是在写入磁盘之前缓冲存储的。在同步方式中,可能有一个记录丢失,因为错误只能阻止最多一个审计记录写入。
管理审计设施错误
ERRORTYPE 审计设施参数的设置控制如何在 DB2 数据库系统和审计设施之间管理错误。当审计设施是活动的,并且 ERRORTYPE 审计设施参数的设置是AUDIT时,将审计设施作为 DB2 数据库的任何其他部件一样对待。对于与被视为成功的语句相关的一个审计事件,必须写入审计记录(在同步方式下,写至磁盘;在异步方式下,写至审计缓冲区)。当在此方式下运行时,不管何时遇到错误,都将一个负的 SQLCODE 返回至生成审计记录的语句的应用程序。
如果错误类型设置为NORMAL,那么将忽略来自db2audit的任何错误,并返回该操作的 SQLCODE。
不同情况下生成的审计记录
根据 API 或查询语句以及审计设置,可为特定事件生成一个或几个审计记录,或不生成审计记录。例如,具有一个 SELECT 子查询的 SQL UPDATE 语句可生成两个审计记录,一个记录包含对一个表的 UPDATE 特权的权限检查结果,另一个记录包含对一个表的 SELECT 特权的权限检查结果。 对于动态数据操作语言(DML)语句,在准备该语句时会对所有权限检查生成审计记录。不会再次审计同一用户对那些语句的复用,因为那时不进行权限检查。但是,如果已更改包含特权信息的目录表之一,那么在下一个工作单元中,再次检查高速缓存的动态 SQL 或 XQuery 语句的语句特权,并创建一个或多个新的审计记录。
对于仅包含静态 DML 语句的程序包,可生成审计记录的唯一可审计的事件是权限检查,它查看用户是否具有执行该程序包的特权。在预编译或绑定该程序包时,执行该程序包中静态 SQL 或 XQuery 语句所需的权限检查和可能的审计记录创建。可使用 EXECUTE 类别审计在程序包内执行的静态 SQL 或 XQuery 语句。当用户显式地再次绑定程序包时,或系统隐式再次绑定程序包时,将为该静态 SQL 或 XQuery 语句所需的权限检查生成审计记录。
对于在执行语句时执行权限检查的语句(例如,数据定义语言(DDL)、GRANT 和 REVOKE 语句),不管何时使用这些语句,都将生成审计记录。
注:当执行 DDL 时,无论该语句的实际节号可能是什么,在审计记录中为所有事件(除上下文事件外)记录的节号都将为零(0)。
审计设施技巧 将审计日志归档
应定期将审计日志归档。将审计日志归档时会将当前审计日志移至一个归档目录,而服务器开始写入新的活动审计日志。已归档的每个日志文件的名称中都包含一个时间戳记,可帮助您标识感兴趣的日志文件以便于将来进行分析。
为了长期存储,您可能想将多组已归档文件压缩在一起。
对于您不再感兴趣的已归档审计日志,实例所有者只需从操作系统中删除这些文件即可。
错误处理
创建审计策略时,应该使用错误类型 AUDIT,除非您创建的只是一个测试审计策略。例如,如果错误类型设置为 AUDIT 并且发生了错误(例如,磁盘空间耗尽),那么将返回错误。必须更正错误情况之后才能继续执行任何其他可审计的操作。但是,如果错误类型设置为 NORMAL,那么记录将失败,但不会对用户返回错误。将像未发生错误一样继续执行操作。
如果归档期间出现问题(例如,用完归档路径中的磁盘空间,或者归档路径不存在),那么归档进程将失败并且在审计日志数据路径中生成文件扩展名为 .bk 的临时日志文件,例如,
db2audit.instance.log.0.20070508172043640941.bk。在解决问题后(通过在归档路径中分配足够多的磁盘空间,或者通过创建归档路径),必须将此临时日志移至归档路径。然后,可以像对待成功归档的日志一样对待该日志。
DDL 语句限制
在进入下一个工作单元之前,某些数据定义语言(DDL)语句(称为 AUDIT 独占式 SQL 语句)不会生效。因此,建议在执行这些语句当中的每个语句之后就立即执行 COMMIT 语句。 AUDIT 独占式 SQL 语句包括:
? ? ?
AUDIT
CREATE AUDIT POLICY、ALTER AUDIT POLICY 和 DROP AUDIT POLICY
DROP ROLE 和 DROP TRUSTED CONTEXT(如果要删除的角色或可信上下文与审计策略关联)
用于存放已归档数据的表格式可能会改变
安全性管理员可以使用 SYSPROC.AUDIT_DEL_EXTRACT 存储过程(系统管理员可以使用 db2audit extract 命令)将已归档审计日志文件中的审计记录解压缩到定界文件中。可以将这些定界文件中的审计数据装入到 DB2? 数据库表中以进行分析。要创建用来容纳审计数据的表的格式在每个发行版中可能都不同。
要点:脚本 db2audit.ddl 创建正确格式的表来包含审计记录。您将期望对每个发行版都运行 db2audit.ddl,因为可能添加了列,或者现有列的大小可能改变。
使用 CHECKING 事件
在大多数情况下,当使用 CHECKING 事件时,审计记录中的对象类型字段是要检查的对象,以了解试图访问该对象的用户标识是否拥有必需的特权或权限。例如,如果用户尝试通过添加列来改变一个表,那么 CHECKING 事件审计记录将指示尝试的访问是“ALTER”,且要检查的对象类型是“TABLE”(不是列,因为检查的是表特权)。
但是,当该检查要验证是否存在一个数据库权限来允许用户标识创建或绑定对象或删除对象时,虽然存在对该数据库的检查,对象类型字段仍将指定要创建、绑定或删除的对象(而不是数据库本身)。 在表上创建一个索引时,需要创建索引的特权,因此,CHECKING 事件审计记录将具有访问尝试类型“索引”而不是“创建”。
创建用于绑定程序包的审计记录
当绑定一个已存在的程序包时,会为该程序包的 DROP 创建 OBJMAINT 事件审计记录,然后为该程序包新副本的 CREATE 创建另一个 OBJMAINT 事件审计记录。
回滚后使用 CONTEXT 事件信息
“数据定义语言”(DDL)可生成记录为成功的 OBJMAINT 或 SECMAINT 事件。但是,在记录该事件后,后续发生的错误可能会导致进行回滚。这样将无法创建对象;或者 GRANT 或 REVOKE 操作不能完成。在这种情况下,使用 CONTEXT 事件变得很重要。这类 CONTEXT 事件审计记录,特别是结束该事件的语句,将指示尝试的操作的完成性质。
装入定界符
抽取适合装入 DB2 数据库表中的定界格式的审计记录时,应清楚该语句文本字段内使用的定界符的有关情况。这可在抽取定界文件时使用下列语句来完成:
db2audit extract delasc delimiter
装入定界符可以是单个字符(如 \)或表示十六进制值的四字节字符串(如“0xff”)。有效命令的示例是:
db2audit extract delasc
db2audit extract delasc delimiter ! db2audit extract delasc delimiter 0xff
如果抽取时使用的定界符不是缺省装入定界符,那么应在 LOAD 命令中使用 MODIFIED BY 选项。下面是将“0xff”用作定界符的 LOAD 命令的示例一部分:
db2 load from context.del of del modified by chardel0xff replace into ...
这将覆盖缺省装入字符串定界符 \(双引号)。
审计事件
对于每个审计类别,某些类型的事件可创建审计记录。
AUDIT 类别的事件
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
ALTER_AUDIT_POLICY ARCHIVE AUDIT_REMOVE AUDIT_REPLACE AUDIT_USING CONFIGURE
CREATE_AUDIT_POLICY DB2AUD
DROP_AUDIT_POLICY EXTRACT FLUSH LIST_LOGS
PRUNE(在 V9.5 和更高版本中不生成此值)。 START STOP
UPDATE_DBM_CFG
CHECKING 类别的事件
? ? ? ?
CHECKING_FUNCTION
CHECKING_MEMBERSHIP_IN_ROLES CHECKING_OBJECT CHECKING_TRANSFER
CONTEXT 类别的事件
表 1. CONTEXT 类别的事件 CONNECT CONNECT_RESET
SET_APPL_PRIORITY RESET_DB_CFG
ATTACH DETACH DARI_START DARI_STOP BACKUP_DB RESTORE_DB ROLLFORWARD_DB
OPEN_TABLESPACE_QUERY FETCH_TABLESPACE
CLOSE_TABLESPACE_QUERY OPEN_CONTAINER_QUERY CLOSE_CONTAINER_QUERY FETCH_CONTAINER_QUERY SET_TABLESPACE_CONTAINERS GET_TABLESPACE_STATISTIC READ_ASYNC_LOG_RECORD QUIESCE_TABLESPACE LOAD_TABLE UNLOAD_TABLE
UPDATE_RECOVERY_HISTORY PRUNE_RECOVERY_HISTORY SINGLE_TABLESPACE_QUERY LOAD_MSG_FILE
UNQUIESCE_TABLESPACE ENABLE_MULTIPAGE DESCRIBE_DATABASE DROP_DATABASE CREATE_DATABASE ADD_NODE
FORCE_APPLICATION
GET_DB_CFG GET_DFLT_CFG UPDATE_DBM_CFG SET_MONITOR GET_SNAPSHOT
ESTIMATE_SNAPSHOT_SIZE RESET_MONITOR OPEN_HISTORY_FILE CLOSE_HISTORY_FILE FETCH_HISTORY_FILE SET_RUNTIME_DEGREE UPDATE_AUDIT DBM_CFG_OPERATION DISCOVER OPEN_CURSOR CLOSE_CURSOR FETCH_CURSOR EXECUTE
EXECUTE_IMMEDIATE PREPAREDESCRIBE BIND REBIND
RUNSTATS REORG REDISTRIBUTE COMMIT ROLLBACK
REQUEST_ROLLBACK IMPLICIT_REBIND EXTERNAL_CANCEL SWITCH_USER
EXECUTE 类别的事件
? ? ? ?
COMMIT 执行 COMMIT 语句 CONNECT 建立数据库连接 CONNECT RESET 终止数据库连接 DATA 语句的主变量或参数标记数据值
此事件将对语句中包括的每个主变量或参数标记重复。它只出现在定界抽取的审计日志中。
? ? ? ?
GLOBAL COMMIT 在全局事务内执行落实 GLOBAL ROLLBACK 在全局事务内执行回滚
RELEASE SAVEPOINT 执行 RELEASE SAVEPOINT 语句 ROLLBACK 执行 ROLLBACK 语句