db2 10.5 数据库审计

db2 10.5 数据库审计

简介

DB2 UDB 审计功能是 DBA 工具箱中一件重要的安全性工具。它可以生成对一系列预定义的数据库事件的审计跟踪,并允许 DBA 维护审计跟踪。它可以对一些数据库事件,例如授权检查、数据库对象维护、安全性维护、系统管理和用户验证等做日志记录。本文向您展示如何有效地使用该功能对可疑的系统活动进行跟踪和调查。

审计发生在实例级,这意味着一旦启动审计功能,它就会审计那个实例中所有数据库的活动。审计功能必须单独启动和停止。例如,如果使用 db2stop 命令停止一个实例,那么审计功能不会自动停止;它必须单独使用 db2audit stop 命令来停止。 只有具有 SYSADM 权限的用户才能配置和使用审计功能。

1、查看审计状态

1.1、查看实例审计状态

db2audit describe
DB2 AUDIT SETTINGS:

Audit active: "FALSE "
Log audit events: "FAILURE"
Log checking events: "FAILURE"
Log object maintenance events: "FAILURE"
Log security maintenance events: "FAILURE"
Log system administrator events: "FAILURE"
Log validate events: "FAILURE"
Log context events: "NONE"
Return SQLCA on audit error: "FALSE "
Audit Data Path: ""
Audit Archive Path: ""

AUD0000I  Operation succeeded.

1.2、查看数据库审计状态

-- 审计策略
SELECT * FROM syscat.auditpolicies;
-- 当前在用审计策略
SELECT * FROM syscat.audituse;

2、配置审计范围和状态

2.1、可以审计的数据库事件类型

事件类型 描述
审计 (AUDIT) 当审计设置被更改或者审计日志被访问时生成记录
权限检查 (CHECKING) 在对访问或操作 DB2 对象或函数的尝试进行权限检查时生成记录
对象维护 (OBJMAINT) 在创建或删除数据对象时生成记录
安全性维护 (SECMAINT) 在授予或者撤销对象或数据库特权或 DBADM 权限时生成记录当数据库管理器的安全性配置参数 SYSADM_GROUPSYSCTRL_GROUPSYSMAINT_GROUP 被修改时也会生成记录
系统管理 (SYSADMIN) 当执行需要 SYSADMSYSMAINTSYSCTRL 权限的操作时生成记录
用户验证 (VALIDATE) 当认证用户或检索系统安全性信息时生成记录
操作上下文 (CONTEXT) 当执行数据库操作时,生成记录以便显示操作上下文这样分类可以更好地解释审计记录。当与日志的事件相关符字段一起使用时,可以从一组事件跟踪回到一个数据库操作,该数据库操作可以提供分析审计结果所需的上下文。

2.2、实例审计配置

-- 数据库实例审计
db2audit configure scope all status both errortype audit
-- 设置审计数据存储位置
db2audit configure datapath /db2backup/auditlog archivepath /db2backup/auditlog

2.3、数据库审计示例1-全量审计

如果想要确定谁在对名为 SAMPLE 的数据库进行 DML,DDL 操作,执行如下操作:

注意此策略的审计数据量较大

CONNECT TO SAMPLE
-- 创建审计策略
CREATE AUDIT POLICY ALTPOLICY CATEGORIES AUDIT STATUS BOTH, 
				OBJMAINT STATUS BOTH,  CHECKING STATUS BOTH, 
				EXECUTE STATUS BOTH ERROR TYPE NORMAL
-- 审计数据库
AUDIT DATABASE USING POLICY ALTPOLICY
-- 移除数据库审计策略
AUDIT DATABASE REMOVE POLICY
-- 删除审计策略
DROP AUDIT POLICY ALTPOLICY

2.4、数据库审计示例2-登录审计

仅审计用户登录、创建或删除对象操作,执行如下操作:

CONNECT TO SAMPLE
-- 创建审计策略
CREATE AUDIT POLICY LOGINPOLICY CATEGORIES VALIDATE STATUS BOTH, OBJMAINT STATUS BOTH ERROR TYPE NORMAL
-- 审计数据库
AUDIT DATABASE USING POLICY LOGINPOLICY
-- 移除数据库审计策略
AUDIT DATABASE REMOVE POLICY
-- 删除审计策略
DROP AUDIT POLICY LOGINPOLICY

3、审计数据存储位置

审计日志与审计归档日志存储目录默认为:sqllib/security/auditdata ,示例:

# linux示例
/home/db2inst1/sqllib/security/auditdata
# windows示例
D:\ProgramData\IBM\DB2\DB2COPY1\DB2\security\auditdata

审计数据可通过 db2audit 进行配置,详见2.2

4、开启与停止审计

-- 开启审计
db2audit start
-- 停止审计
db2audit stop

5、导出审计记录

5.1、审计归档

审计数据导出前需要进行刷新与归档,流程如下:

-- 审计刷新
db2audit flush
-- 归档实例审计日志
db2audit archive
-- 归档数据库审计日志
db2audit archive database test

5.2、提取日志到文本文件

将审计日志导出为便于阅读的格式:

-- 导出实例审计日志
db2audit extract file d:\instance.aud from files db2audit.instance.log.0.20200413105254
-- 导出数据库审计日志
db2audit extract file d:\test.aud from files db2audit.db.test.log.0.20200413105254

5.3、提取日志到数据库

将审计日志导出到普通文本格式,仅用于基本阅读,如果需要进行数据审计分析,需要将审计日志导出数据库。

操作流程如下:首先提取日志到定界ascii文件,然后使用load导入数据库。

5.3.1、将记录提取到定界文件

mkdir output
-- 提取实例审计日志
db2audit extract delasc delimiter ! to d:\output from files db2audit.instance.log.0.20200413150306
-- 提取数据库审计日志
db2audit extract delasc delimiter ! to d:\output from files db2audit.db.TEST.log.0.20200413150306
-- output输出文件列表如下:
audit.del
auditlobs
checking.del
context.del
execute.del
objmaint.del
secmaint.del
sysadmin.del
validate.del

5.3.2、创建审计表

每种审计类别的日志格式有差异,需要根据根据每种日志类别建立日志表。
审计表创建脚本 db2audit.ddl 位于 sqllib/misc 目录中。该脚本创建的表有:AUDIT、CHECKING、OBJMAINT、SECMAINT、SYSADMIN、VALIDATE、 CONTEXT 和 EXECUTE。

-- 创建schema
-- 建议将审计日志表建立的单独的schema中,避免表命名冲突,创建失败问题。
CREATE SCHEMA AUDIT
SET CURRENT SCHEMA = 'AUDIT'
-- 执行脚本,创建审计表
db2 +o -tf sqllib/misc/db2audit.ddl

-- 用户访问授权
-- 如果需要开放访问权限给用户,执行如下:
db2 GRANT select ON audit.validate  TO USER db2_user
db2 GRANT select ON audit.objmaint  TO USER db2_user

5.3.3、将审计日志写入表

-- 1、如果数据库未开启归档日志,可以使用以下方式导入:
db2 load from d:\output\validate.del of del modified by chardel! insert into audit.validate 
db2 load from d:\output\objmaint.del of del modified by chardel! insert into audit.objmaint
-- 2、如果数据库开启归档日志,需要添加导入参数:nonrecoverable,以免数据导入后,表空间发生:备份暂挂 问题
db2 load from d:\output\validate.del of del modified by chardel! insert into audit.validate nonrecoverable
db2 load from d:\output\objmaint.del of del modified by chardel! insert into audit.objmaint nonrecoverable

5.3.4、load工具注意事项

-- 使用 load ... insert into ... 将新的表数据添加至现有表;
-- 使用 load ... replace into ... 将删除原有数据,然后写入新数据到表;
db2 load from d:\output\objmaint.del of del modified by chardel! replace into audit.objmaint nonrecoverable

6、归档活动审计日志(可选)

系统管理员可以使用 db2audit 工具来归档实例和数据库审计日志以及从任一类型的已归档日志中抽取审计数据。

安全性管理员或安全性管理员已向其授予对审计例程的 EXECUTE 特权的用户,可以通过运行 SYSPROC.AUDIT_ARCHIVE 存储过程来归档活动审计日志。要从日志中抽取数据并将该数据装入到定界文件中,他们可以使用 SYSPROC.AUDIT_DELIM_EXTRACT 存储过程。

以下是使用审计例程来归档和抽取审计日志的步骤:

6.1、归档日志

调度应用程序以使用存储过程 SYSPROC.AUDIT_ARCHIVE 来执行活动审计日志的常规归档。

-- 归档日志
CALL SYSPROC.AUDIT_ARCHIVE(NULL, -2 );

6.2、查看日志列表

确定感兴趣的已归档日志文件。使用 SYSPROC.AUDIT_LIST_LOGS 表函数来列示所有已归档审计日志。

-- 查看日志列表
SELECT * FROM TABLE(SYSPROC.AUDIT_LIST_LOGS(''))

6.3、抽取审计信息到定界文件

将文件名作为参数传递给 SYSPROC.AUDIT_DELIM_EXTRACT 存储过程以从日志中抽取数据并将它们装入到定界文件中。

-- 抽取审计信息
CALL SYSPROC.AUDIT_DELIM_EXTRACT('', 'd:\output', '',  'db2audit.db.TEST.log.0.20200413222128', '' ) ;

6.4、将文件写入数据库

将审计数据装入到 DB2 数据库表中以进行分析。

此步骤只能使用load命令进行。

不需要立即将已归档日志文件装入到表中以进行分析;可以保存它们以在将来分析。例如,可能只需要在进行公司审计时查看这些文件。

如果归档期间出现问题(例如,用完归档路径中的磁盘空间,或者归档路径不存在),那么归档进程将失败并且在审计日志数据路径中生成文件扩展名为 .bk 的临时日志文件,例如,db2audit.instance.log.0.20070508172043640941.bk。在解决问题后(通过在归档路径中分配足够多的磁盘空间,或者通过创建归档路径),必须将此临时日志移至归档路径。然后,可以像对待成功归档的日志一样对待该日志。

7、Linux定时任务

7.1、用途

用于定时将db2数据库审计日志写入数据库。

7.2、审计流程

  1. 清理过期审计文件
  2. 审计日志刷新
  3. 审计日志归档
  4. 将审计日志转换为定界符文本
  5. 移动审计归档日志到备份目录
  6. 审计日志入库

7.3、定时任务脚本

#!/bin/sh
#----------------------------------------
# db2数据库审计入库脚本
# 
# 脚本名称: audit_to_db.sh
# 执行权限: chmod 744 audit_to_db.sh
# 计划任务:crontab -e 
# 测试用
# */2 * * * * nohup sh /db2backup/auditlog/script/audit_to_db.sh &
# 正式用
# 0 */4 * * * nohup sh /db2backup/auditlog/script/audit_to_db.sh &
#
# 目录结构:
# /db2backup/auditlog 审计日志目录
# /db2backup/auditlog/archlog 默认归档日志存储在上一级目录,经过提取存储到数据库后,通过脚本转储到归档目录
# /db2backup/auditlog/output 审计日志提取目录,存储转换为定界符文件的目录
# /db2backup/auditlog/script 审计日志脚本目录
#----------------------------------------
# 数据库名称
db_name=TEST
# 根目录
base_path=/db2backup/auditlog
# 审计归档目录
arch_path=$base_path/archlog
# 审计日志提取目录
output_path=$base_path/output
# 审计日志脚本目录
script_path=$base_path/script 
# 审计日志入库记录
arch_log=$script_path/db2audit_arch.log 

# 设置环境变量
if [ -f ${HOME}/sqllib/db2profile ]; then
    . ${HOME}/sqllib/db2profile
fi

# 函数:输出日志
function logmsg(){
	echo "`date +'%Y-%m-%d %H:%M:%S'` $1" >>  $arch_log
}

# 函数:检测异常并输出日志
function logCheck(){
	code=$?
	if [ $code -gt 0 ]; then
		logmsg "[error] code=$code $1."
		exit 1
	else
		logmsg "[success] $1."
	fi
}

logmsg "-------------------------------"
logmsg "开始db2审计"

# 清理临时文件
rm -f $output_path/*
logCheck "清理临时定界符文件"
find $arch_path -mtime +30 -name "db2audit.*" | xargs rm -f
logCheck "清理审计归档文件"

# 审计刷新
db2audit flush
logCheck "审计日志刷新"

# 审计日志归档
db2audit archive
logCheck "实例审计日志归档"
db2audit archive database $db_name
logCheck "数据库审计日志归档"

# 遍历实例审计归档日志
for f in `ls $base_path | grep db2audit.instance.log.0.`
do	
	# 审计归档日志移动
	mv $base_path/$f $arch_path
	logCheck "实例审计归档日志移动"
done  

# 遍历数据库审计归档日志
for f in `ls $base_path | grep db2audit.db.$db_name.log.0.`
do	
	# 审计日志提取
	db2audit extract delasc delimiter ! to $output_path from files $f
	logCheck "数据库审计日志提取"

	# 审计归档日志移动
	mv $base_path/$f $arch_path
	logCheck "数据库审计归档日志移动"
done  

# 审计日志入库
db2 connect to $db_name 
db2 load from $output_path/validate.del of del modified by chardel! insert into audit.validate nonrecoverable
logCheck "审计日志入库:validate.del"
db2 load from $output_path/objmaint.del of del modified by chardel! insert into audit.objmaint nonrecoverable
logCheck "审计日志入库:objmaint.del"

logmsg "-------------------------------"

8、创建测试库

-- 基于windows环境测试
-- 创建测试库
CREATE DATABASE test;
db2 connect to test
-- 启用归档日志
db2 update db cfg using logarchmeth1 disk:d:/
db2 update db cfg using trackmod yes
db2 update db cfg using locktimeout 20
-- 重启数据库
db2stop force
db2start

-- 备份数据库
db2 backup db test to d:\

-- 创建测试表
drop table t1;
CREATE TABLE t1
	(
	ID       INTEGER,
	NAME     VARCHAR (10),
	BIRTHDAY DATE
	);
INSERT INTO t1(ID,NAME) VALUES(1,'n1');
INSERT INTO t1(ID,NAME) VALUES(2,'n2');

SELECT * FROM t1;
DELETE FROM t1;

参考

https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0050525.html
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.admin.sec.doc/doc/c0052328.html
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_10.5.0/com.ibm.db2.luw.admin.sec.doc/doc/t0011542.html
https://www.ibm.com/support/knowledgecenter/en/SSEPGG_10.5.0/com.ibm.db2.luw.admin.cmd.doc/doc/r0002072.html
https://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0603wasserman/
https://blog.csdn.net/liujinwei2005/article/details/8640352

你可能感兴趣的:(db2)