Meral
作者Meral2011-11-18 17:29
数据库管理员, GUOJI

DB2AUDIT 学习

字数 6414阅读 4526评论 0赞 1

     审计,会记录实例和实例中的数据库所发生的可审计事件,它使用一个二进制配置文件,位于实例目录下的security子目录。审计记录可以分为以下几类:
.AUDIT 所有与审计设施相关的日志记录
.CHECKING 在对DB2的对象进行访问时,由于权限检查所生成的事件日志记录
.OBJMAINT 在创建或者删除数据库对象时生成的日志记录
.SECMAINT 在修改DBM CFG的配置参数SYSADM_GROUP,SYSCTRL_GROUP,SYSMAINT_GROUP时生成的记录。在授予或撤销DBADM或者任何数据库对象的特权时也生成记录。
.SYSADMIN 在执行需要SYSADM,SYSCTRL,SYSMAINT权限的操作时生成的日志记录
.VALIDATE 在验证用户或者检索系统安全信息时生成的记录
.CONNTEXT 这类审计记录显示了操作的相信信息,通常这些操作将在审计日志中生成多条记录,每条记录都有事件相关域,多条CONNTEXT可以通过事件相关域联系在一起。

1.缓冲审计日志写入
  当对审计设施进行配置时,可以指定将审计记录以同步方式直接写入磁盘,或是先写入缓冲区,然后以异步方式写入磁盘。如果使用后一种方式可以通过配置DBM变量:AUDIT_BUFF_SZ来指定缓冲区大小。该参数值设为0.则审计记录直接同步写入磁盘,如果设置为大于零的任何数字,表示缓冲区大小,该参数单位为4KB.配置好后需要重启实例。
  如果采取异步方式,则在数据库管理器出现错误时可能丢失多条审计记录。相反,同步,则最多丢失一条。

2.审计设施的配置
  可以使用DB2AUDIT CONFIGURE来配置它:db2audit CONFIGURE SCOPE *** STATUS *** ERRORTYPE ***
  .SCOPE参数指定记录哪个类别的审计记录,如CHECKING,OBJMAINT。如果被设置成ALL,则记录除CONNTEXT类型以外的所有类型的记录。
  .STATUS参数指定当一个事件返回的状态为成功或是失败时,是否记录该事件。该参数的有效值为:SUCCESS,FAILURE,BOTH。
  .ERRORTYPE参数可以是AUDIT或者NORMAL。AUDIT,则审计设施在发生任何错误时会将错误SQLCODE返回给正在进行审计日志记录的应用程序,应用程序的操作肯定也将会失败。简单一句话,审计日志记录失败,程序也失败。如果设置成NOMRMAL,在生成记录时出现的错误将不影响数据库应用程序的运行。

3.查看当前配置:db2audit describe,在WINDOWS上的输出:

C:Program FilesIBMSQLLIBDB2security>db2audit describe
DB2 AUDIT SETTINGS:
Audit active: "TRUE "
Log errors: "TRUE "Log success: "FALSE "
Log audit events: "FALSE "
Log checking events: "TRUE "
Log object maintenance events: "FALSE "
Log security maintenance events: "FALSE "
Log system administrator events: "FALSE "
Log validate events: "FALSE "
Log context events: "FALSE "
Return SQLCA on audit error: "FALSE "
AUD0000I  Operation succeeded.

4.启动审计:db2audit start

5.强制写审计日志:db2audit flush

6.重新设置当前的审计配置设置,并将它们还原成初始的配置(SCOPE是所有类别,除了CONTEXT,STATUS是FAILURE,ERRORTYPE是NORMAL,审计功能状态是OFF),可发出以下db2audit命令:
  db2audit configure reset

7.提取审计日志
  在提取审计日志之前,应当确保审计日志缓冲区的内容已经写入硬盘:db2audit flush
  审计日志是以二进制格式,用户提取日志时可以取成纯文本格式文件,也可以取成定界ASCII格式文件。
  每个类别的审计记录的文件名都与审计记录的类别相对应,在选择使用审计日志输出类型时,用户也可以自己指定分隔符代替默认的0xFF。最终生成的文件可以通过LOAD或者import命令导入数据库表中保存。例如,用户需要将审计日志中所有关于数据库SAMPLE,并且属于validate和checking类别的记录提取到以"!"作为分隔符的ASCII码文件,则可用:
     db2audit EXTRACT delasc DELIMITER !  CATAGORY validate,checking DATABASE sample
该命令的结果是VALIDATE.DEL和CHECKING.DEL,分隔符为"!"。如果需要将validate类型的记录提取到文本文件中,则可
     db2audit EXTRACT file myfile.txt CATAGORY validate DATABASE sample
该命令的输出为MYFILE.TXT,如果该文件在提取之前已经存在,提取将失败。

8.删除审计日志记录:db2audit prune all
  如果审计设施设置记录事件类型为AUDIT,则审计日志情况后会有一条新生成的记录保存在审计日志中,记录了清空审计日志这件事情。删除审计日志记录时也可以指定一个时间点:
   db2audit PRUNE DATE <yyyymmddhh>

9.停止审计设施:db2audit stop

10.文件输出例:
文本文件
timestamp=2006-02-06-11.54.52.443000;category=AUDIT;audit event=START;event correlator=0;event status=0;
userid=tedwas;authid=TEDWAS;
timestamp=2006-02-06-11.55.14.664000;category=AUDIT;audit event=CONFIGURE;event correlator=0;event status=0;
userid=tedwas;authid=TEDWAS;
timestamp=2006-02-06-11.55.19.371000;category=AUDIT;audit event=CONFIGURE;event correlator=0;event status=0;
userid=tedwas;authid=TEDWAS;
timestamp=2006-02-06-11.55.30.718000;category=AUDIT;audit event=FLUSH;event correlator=0;event status=0;
userid=tedwas;authid=TEDWAS;
从这些记录可以看出,用户 'TEDWAS' 首先启动审计实用程序,然后两次修改了配置,接着刷新了审计缓冲区。所有这些事件都发生在近乎相同的时间帧上,这从TIMESTAMP字段很接近的值可以看出。还可以看出,这些事件代表AUDIT事件类型,因为在 category 字段中有AUDIT值。

ASCII文件
2006-02-06-11.54.52.443000;,;AUDIT;,;START;,0,0,;tedwas;,;TEDWAS;
2006-02-06-11.55.14.664000;,;AUDIT;,;CONFIGURE;,0,0,;tedwas;,;TEDWAS;
2006-02-06-11.55.19.371000;,;AUDIT;,;CONFIGURE;,0,0,;tedwas;,;TEDWAS;
2006-02-06-11.55.30.718000;,;AUDIT;,;FLUSH;,0,0,;tedwas;,;TEDWAS;
2006-02-06-11.56.04.346000;,;AUDIT;,;EXTRACT;,0,0,;tedwas;,;TEDWAS;

审计记录中每个字段的意思

时间戳 CHAR(26) 审计事件的日期和时间
类别 CHAR(8) 审计事件的类别。
审计事件 CHAR(32) 特定的审计事件。可能的值包括:CONFIGURE、DB2AUD、EXTRACT、FLUSH、PRUNE、START、STOP 和 UPDATE_ADMIN_CFG
事件相关符 INTEGER 被审计的操作的相关标识符。可用于标识哪些审计记录与某个事件相关
事件状态 INTEGER 审计事件的状态,由一个 SQLCODE 表示,其中:
成功的事件 >= 0
失败的事件 < 0
用户 ID VARCHAR(1024) 审计事件发生时的用户 ID
权限 ID VARCHAR(128) 审计事件发生时的权限 ID


11.综合体验
假设从某个应用程序用户那里得到匿名消息,说一个名为SAM的用户正在试图访问数据库对象和表,而实际上在午休时间他并没有这样的访问权。于是,您决定在午休时间监视 DB2 实例,看有无失败的权限检查尝试。

首先配置审计功能,使之审计 CHECKING 事件类型,只记录失败的尝试,并使用 NORMAL 错误处理:

db2audit configure scope checking status failure errortype normal

通过将数据库管理器参数AUDIT_BUF_SZ的大小设置为 40,确保审计功能将使用异步日志记录:

update dbm cfg using audit_buf_sz 40

db2stop

db2start

一直等到中午 12 点,启动审计功能:

db2audit start

在审计期间,用户SAM走向数据库服务器,然后登录。他打开一个命令行窗口,连接到 SAMPLE 数据库,试图更新 EMPLOYEE 表中的雇员薪水但是没有成功。他发出以下 SQL 语句:

connect to sample user sam using bad123boyupdate tedwas.employee set salary = salary * 1.5

于是收到以下错误消息:

DB21034E  The command was processed as an SQL statement because it was not avalid Command Line Processor command.  During SQL processing it returned:SQL0551N  "SAM" does not have the privilege to perform. operation "UPDATE" onobject "TEDWAS.EMPLOYEE".  SQLSTATE=42501

这条消息表明他没有更新那个表的权限,于是他很快就登出服务器,并离开了,自以为没有人看到他做的事。

一个小时过去了,检查审计日志的内容。首先刷新审计缓冲区,确保将所有仍然缓冲在内存中的审计记录写到磁盘上:

db2audit flush

然后从 db2audit.log 文件将记录提取到定界 ASCII 文件中,这里以分号作为字段定界符,并且只提取状态为 FAILURE 的 CHECKING 事件:

db2audit extract delasc delimiter ; category checking database sample status failure

由于审计记录现在是文本格式,于是您决定修剪日志,使之更易于管理,并防止有重复的记录:

db2audit prune date 2006020613

为了用之前创建的 DB2 表来存放审计数据,将提取的数据从 checking.del 文件装载到 CHECKING 表中,可以使用以下命令:

LOAD FROM checking.del OF del MODIFIED BY CHARDEL; INSERT INTO audit.checking

为了避免分析重复的记录,从 CHECKING 表中删除时间戳大于一个指定的、用于修剪日志的时间戳的行:

DELETE FROM audit.checking WHERE TIMESTAMP > TIMESTAMP('20060206130000')

然后通过查询 AUDIT.CHECKING 表试着发现关于失败的权限检查尝试的更多信息:

SELECT category, event, appid, appname, userid, authid FROM audit.checking

从清单 5显示的查询结果可以看出,针对失败的更新语句有一条审计记录。

清单 5. 查询 CHECKING 表得到的结果
SELECT category, event, appid, appname, userid, authid FROM audit.checking
CATEGORY EVENT             APPID                    APPNAME           AUTHID
------------------------  -----------------------  ----------         ----------
CHECKING CHECKING_OBJECT  *LOCAL.DB2.060206220334   db2bp.exe         SAM1
1 record(s) selected.

最后决定停止今天的审计分析,并停止审计功能,以免生成更多的审计记录,为此可以使用以下命令:

db2audit stop

 

 

 

 


 

 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广